@@ -2391,3 +2391,125 @@ int afs_fs_inline_bulk_status(struct afs_fs_cursor *fc,
23912391 afs_make_call (& fc -> ac , call , GFP_NOFS );
23922392 return afs_wait_for_call_to_complete (call , & fc -> ac );
23932393}
2394+
2395+ /*
2396+ * deliver reply data to an FS.FetchACL
2397+ */
2398+ static int afs_deliver_fs_fetch_acl (struct afs_call * call )
2399+ {
2400+ struct afs_vnode * vnode = call -> reply [1 ];
2401+ struct afs_acl * acl ;
2402+ const __be32 * bp ;
2403+ unsigned int size ;
2404+ int ret ;
2405+
2406+ _enter ("{%u}" , call -> unmarshall );
2407+
2408+ switch (call -> unmarshall ) {
2409+ case 0 :
2410+ afs_extract_to_tmp (call );
2411+ call -> unmarshall ++ ;
2412+
2413+ /* extract the returned data length */
2414+ case 1 :
2415+ ret = afs_extract_data (call , true);
2416+ if (ret < 0 )
2417+ return ret ;
2418+
2419+ size = call -> count2 = ntohl (call -> tmp );
2420+ size = round_up (size , 4 );
2421+
2422+ acl = kmalloc (struct_size (acl , data , size ), GFP_KERNEL );
2423+ if (!acl )
2424+ return - ENOMEM ;
2425+ call -> reply [0 ] = acl ;
2426+ acl -> size = call -> count2 ;
2427+ afs_extract_begin (call , acl -> data , size );
2428+ call -> unmarshall ++ ;
2429+
2430+ /* extract the returned data */
2431+ case 2 :
2432+ ret = afs_extract_data (call , true);
2433+ if (ret < 0 )
2434+ return ret ;
2435+
2436+ afs_extract_to_buf (call , (21 + 6 ) * 4 );
2437+ call -> unmarshall ++ ;
2438+
2439+ /* extract the metadata */
2440+ case 3 :
2441+ ret = afs_extract_data (call , false);
2442+ if (ret < 0 )
2443+ return ret ;
2444+
2445+ bp = call -> buffer ;
2446+ ret = afs_decode_status (call , & bp , & vnode -> status , vnode ,
2447+ & vnode -> status .data_version , NULL );
2448+ if (ret < 0 )
2449+ return ret ;
2450+ xdr_decode_AFSVolSync (& bp , call -> reply [2 ]);
2451+
2452+ call -> unmarshall ++ ;
2453+
2454+ case 4 :
2455+ break ;
2456+ }
2457+
2458+ _leave (" = 0 [done]" );
2459+ return 0 ;
2460+ }
2461+
2462+ static void afs_destroy_fs_fetch_acl (struct afs_call * call )
2463+ {
2464+ kfree (call -> reply [0 ]);
2465+ afs_flat_call_destructor (call );
2466+ }
2467+
2468+ /*
2469+ * FS.FetchACL operation type
2470+ */
2471+ static const struct afs_call_type afs_RXFSFetchACL = {
2472+ .name = "FS.FetchACL" ,
2473+ .op = afs_FS_FetchACL ,
2474+ .deliver = afs_deliver_fs_fetch_acl ,
2475+ .destructor = afs_destroy_fs_fetch_acl ,
2476+ };
2477+
2478+ /*
2479+ * Fetch the ACL for a file.
2480+ */
2481+ struct afs_acl * afs_fs_fetch_acl (struct afs_fs_cursor * fc )
2482+ {
2483+ struct afs_vnode * vnode = fc -> vnode ;
2484+ struct afs_call * call ;
2485+ struct afs_net * net = afs_v2net (vnode );
2486+ __be32 * bp ;
2487+
2488+ _enter (",%x,{%llx:%llu},," ,
2489+ key_serial (fc -> key ), vnode -> fid .vid , vnode -> fid .vnode );
2490+
2491+ call = afs_alloc_flat_call (net , & afs_RXFSFetchACL , 16 , (21 + 6 ) * 4 );
2492+ if (!call ) {
2493+ fc -> ac .error = - ENOMEM ;
2494+ return ERR_PTR (- ENOMEM );
2495+ }
2496+
2497+ call -> key = fc -> key ;
2498+ call -> reply [0 ] = NULL ;
2499+ call -> reply [1 ] = vnode ;
2500+ call -> reply [2 ] = NULL ; /* volsync */
2501+ call -> ret_reply0 = true;
2502+
2503+ /* marshall the parameters */
2504+ bp = call -> request ;
2505+ bp [0 ] = htonl (FSFETCHACL );
2506+ bp [1 ] = htonl (vnode -> fid .vid );
2507+ bp [2 ] = htonl (vnode -> fid .vnode );
2508+ bp [3 ] = htonl (vnode -> fid .unique );
2509+
2510+ call -> cb_break = fc -> cb_break ;
2511+ afs_use_fs_server (call , fc -> cbi );
2512+ trace_afs_make_fs_call (call , & vnode -> fid );
2513+ afs_make_call (& fc -> ac , call , GFP_KERNEL );
2514+ return (struct afs_acl * )afs_wait_for_call_to_complete (call , & fc -> ac );
2515+ }
0 commit comments