Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

knfsd: Allow lockless lookups of the exports

Convert structs svc_expkey and svc_export to allow RCU protected lookups.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>

authored by

Trond Myklebust and committed by
J. Bruce Fields
9ceddd9d fd5d2f78

+9 -7
+7 -7
fs/nfsd/export.c
··· 46 46 !test_bit(CACHE_NEGATIVE, &key->h.flags)) 47 47 path_put(&key->ek_path); 48 48 auth_domain_put(key->ek_client); 49 - kfree(key); 49 + kfree_rcu(key, ek_rcu); 50 50 } 51 51 52 52 static void expkey_request(struct cache_detail *cd, ··· 265 265 struct cache_head *ch; 266 266 int hash = svc_expkey_hash(item); 267 267 268 - ch = sunrpc_cache_lookup(cd, &item->h, hash); 268 + ch = sunrpc_cache_lookup_rcu(cd, &item->h, hash); 269 269 if (ch) 270 270 return container_of(ch, struct svc_expkey, h); 271 271 else ··· 314 314 auth_domain_put(exp->ex_client); 315 315 nfsd4_fslocs_free(&exp->ex_fslocs); 316 316 kfree(exp->ex_uuid); 317 - kfree(exp); 317 + kfree_rcu(exp, ex_rcu); 318 318 } 319 319 320 320 static void svc_export_request(struct cache_detail *cd, ··· 780 780 struct cache_head *ch; 781 781 int hash = svc_export_hash(exp); 782 782 783 - ch = sunrpc_cache_lookup(exp->cd, &exp->h, hash); 783 + ch = sunrpc_cache_lookup_rcu(exp->cd, &exp->h, hash); 784 784 if (ch) 785 785 return container_of(ch, struct svc_export, h); 786 786 else ··· 1216 1216 } 1217 1217 1218 1218 const struct seq_operations nfs_exports_op = { 1219 - .start = cache_seq_start, 1220 - .next = cache_seq_next, 1221 - .stop = cache_seq_stop, 1219 + .start = cache_seq_start_rcu, 1220 + .next = cache_seq_next_rcu, 1221 + .stop = cache_seq_stop_rcu, 1222 1222 .show = e_show, 1223 1223 }; 1224 1224
+2
fs/nfsd/export.h
··· 61 61 u32 ex_layout_types; 62 62 struct nfsd4_deviceid_map *ex_devid_map; 63 63 struct cache_detail *cd; 64 + struct rcu_head ex_rcu; 64 65 }; 65 66 66 67 /* an "export key" (expkey) maps a filehandlefragement to an ··· 76 75 u32 ek_fsid[6]; 77 76 78 77 struct path ek_path; 78 + struct rcu_head ek_rcu; 79 79 }; 80 80 81 81 #define EX_ISSYNC(exp) (!((exp)->ex_flags & NFSEXP_ASYNC))