@@ -836,9 +836,10 @@ int afs_fs_create(struct afs_fs_cursor *fc,
836836}
837837
838838/*
839- * deliver reply data to an FS.RemoveFile or FS.RemoveDir
839+ * Deliver reply data to any operation that returns file status and volume
840+ * sync.
840841 */
841- static int afs_deliver_fs_remove (struct afs_call * call )
842+ static int afs_deliver_fs_status_and_vol (struct afs_call * call )
842843{
843844 struct afs_vnode * vnode = call -> reply [0 ];
844845 const __be32 * bp ;
@@ -868,14 +869,14 @@ static int afs_deliver_fs_remove(struct afs_call *call)
868869static const struct afs_call_type afs_RXFSRemoveFile = {
869870 .name = "FS.RemoveFile" ,
870871 .op = afs_FS_RemoveFile ,
871- .deliver = afs_deliver_fs_remove ,
872+ .deliver = afs_deliver_fs_status_and_vol ,
872873 .destructor = afs_flat_call_destructor ,
873874};
874875
875876static const struct afs_call_type afs_RXFSRemoveDir = {
876877 .name = "FS.RemoveDir" ,
877878 .op = afs_FS_RemoveDir ,
878- .deliver = afs_deliver_fs_remove ,
879+ .deliver = afs_deliver_fs_status_and_vol ,
879880 .destructor = afs_flat_call_destructor ,
880881};
881882
@@ -2513,3 +2514,55 @@ struct afs_acl *afs_fs_fetch_acl(struct afs_fs_cursor *fc)
25132514 afs_make_call (& fc -> ac , call , GFP_KERNEL );
25142515 return (struct afs_acl * )afs_wait_for_call_to_complete (call , & fc -> ac );
25152516}
2517+
2518+ /*
2519+ * FS.StoreACL operation type
2520+ */
2521+ static const struct afs_call_type afs_RXFSStoreACL = {
2522+ .name = "FS.StoreACL" ,
2523+ .op = afs_FS_StoreACL ,
2524+ .deliver = afs_deliver_fs_status_and_vol ,
2525+ .destructor = afs_flat_call_destructor ,
2526+ };
2527+
2528+ /*
2529+ * Fetch the ACL for a file.
2530+ */
2531+ int afs_fs_store_acl (struct afs_fs_cursor * fc , const struct afs_acl * acl )
2532+ {
2533+ struct afs_vnode * vnode = fc -> vnode ;
2534+ struct afs_call * call ;
2535+ struct afs_net * net = afs_v2net (vnode );
2536+ size_t size ;
2537+ __be32 * bp ;
2538+
2539+ _enter (",%x,{%llx:%llu},," ,
2540+ key_serial (fc -> key ), vnode -> fid .vid , vnode -> fid .vnode );
2541+
2542+ size = round_up (acl -> size , 4 );
2543+ call = afs_alloc_flat_call (net , & afs_RXFSStoreACL ,
2544+ 5 * 4 + size , (21 + 6 ) * 4 );
2545+ if (!call ) {
2546+ fc -> ac .error = - ENOMEM ;
2547+ return - ENOMEM ;
2548+ }
2549+
2550+ call -> key = fc -> key ;
2551+ call -> reply [0 ] = vnode ;
2552+ call -> reply [2 ] = NULL ; /* volsync */
2553+
2554+ /* marshall the parameters */
2555+ bp = call -> request ;
2556+ bp [0 ] = htonl (FSSTOREACL );
2557+ bp [1 ] = htonl (vnode -> fid .vid );
2558+ bp [2 ] = htonl (vnode -> fid .vnode );
2559+ bp [3 ] = htonl (vnode -> fid .unique );
2560+ bp [4 ] = htonl (acl -> size );
2561+ memcpy (& bp [5 ], acl -> data , acl -> size );
2562+ if (acl -> size != size )
2563+ memset ((void * )& bp [5 ] + acl -> size , 0 , size - acl -> size );
2564+
2565+ trace_afs_make_fs_call (call , & vnode -> fid );
2566+ afs_make_call (& fc -> ac , call , GFP_KERNEL );
2567+ return afs_wait_for_call_to_complete (call , & fc -> ac );
2568+ }
0 commit comments