knfsd: Lockless lookup of NFSv4 identities.
authorTrond Myklebust <trondmy@gmail.com>
Mon, 1 Oct 2018 14:41:49 +0000 (10:41 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Mon, 29 Oct 2018 20:58:04 +0000 (16:58 -0400)
Enable RCU protected lookups of the NFSv4 idmap.

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

index a5bb76593ce72c280ddbd8e5957beddea49ec413..bf137fec33ff916558ca7c95e2662a46c5880163 100644 (file)
@@ -65,6 +65,7 @@ struct ent {
        u32               id;
        char              name[IDMAP_NAMESZ];
        char              authname[IDMAP_NAMESZ];
+       struct rcu_head   rcu_head;
 };
 
 /* Common entry handling */
@@ -89,7 +90,7 @@ static void
 ent_put(struct kref *ref)
 {
        struct ent *map = container_of(ref, struct ent, h.ref);
-       kfree(map);
+       kfree_rcu(map, rcu_head);
 }
 
 static struct cache_head *
@@ -264,8 +265,8 @@ out:
 static struct ent *
 idtoname_lookup(struct cache_detail *cd, struct ent *item)
 {
-       struct cache_head *ch = sunrpc_cache_lookup(cd, &item->h,
-                                                   idtoname_hash(item));
+       struct cache_head *ch = sunrpc_cache_lookup_rcu(cd, &item->h,
+                                                       idtoname_hash(item));
        if (ch)
                return container_of(ch, struct ent, h);
        else
@@ -422,8 +423,8 @@ out:
 static struct ent *
 nametoid_lookup(struct cache_detail *cd, struct ent *item)
 {
-       struct cache_head *ch = sunrpc_cache_lookup(cd, &item->h,
-                                                   nametoid_hash(item));
+       struct cache_head *ch = sunrpc_cache_lookup_rcu(cd, &item->h,
+                                                       nametoid_hash(item));
        if (ch)
                return container_of(ch, struct ent, h);
        else