]> www.infradead.org Git - users/willy/xarray.git/commitdiff
nfsd: Convert s2s_cp_stateids to XArray
authorMatthew Wilcox <willy@infradead.org>
Wed, 9 Jan 2019 20:34:09 +0000 (15:34 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Thu, 8 Aug 2019 14:29:40 +0000 (10:29 -0400)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
fs/nfsd/netns.h
fs/nfsd/nfs4state.c

index bdfe5bcb3dcd0430a6a33f0738a41be75eb157dc..f2fc649cb96b98cfe29d0b42e56758c36911a6c1 100644 (file)
@@ -125,8 +125,8 @@ struct nfsd_net {
         * stateids.
         */
        u32             s2s_cp_cl_id;
-       struct idr      s2s_cp_stateids;
-       spinlock_t      s2s_cp_lock;
+       struct xarray   s2s_cp_stateids;
+       u32             s2s_cp_stateid_next;
 
        /*
         * Version information
index 25385e407484ef8ac2f0cbc3136964b4c4e6caf1..75e3135442f56a5b1091fdb8d7ef594d26d31b17 100644 (file)
@@ -728,16 +728,12 @@ out_free:
  */
 int nfs4_init_cp_state(struct nfsd_net *nn, struct nfsd4_copy *copy)
 {
-       int new_id;
-
-       idr_preload(GFP_KERNEL);
-       spin_lock(&nn->s2s_cp_lock);
-       new_id = idr_alloc_cyclic(&nn->s2s_cp_stateids, copy, 0, 0, GFP_NOWAIT);
-       spin_unlock(&nn->s2s_cp_lock);
-       idr_preload_end();
-       if (new_id < 0)
+       if (xa_alloc_cyclic(&nn->s2s_cp_stateids,
+                               &copy->cp_stateid.si_opaque.so_id, copy,
+                               xa_limit_32b, &nn->s2s_cp_stateid_next,
+                               GFP_KERNEL) < 0)
                return 0;
-       copy->cp_stateid.si_opaque.so_id = new_id;
+
        copy->cp_stateid.si_opaque.so_clid.cl_boot = nn->boot_time;
        copy->cp_stateid.si_opaque.so_clid.cl_id = nn->s2s_cp_cl_id;
        return 1;
@@ -748,9 +744,7 @@ void nfs4_free_cp_state(struct nfsd4_copy *copy)
        struct nfsd_net *nn;
 
        nn = net_generic(copy->cp_clp->net, nfsd_net_id);
-       spin_lock(&nn->s2s_cp_lock);
-       idr_remove(&nn->s2s_cp_stateids, copy->cp_stateid.si_opaque.so_id);
-       spin_unlock(&nn->s2s_cp_lock);
+       xa_erase(&nn->s2s_cp_stateids, copy->cp_stateid.si_opaque.so_id);
 }
 
 static struct nfs4_ol_stateid * nfs4_alloc_open_stateid(struct nfs4_client *clp)
@@ -7609,8 +7603,8 @@ static int nfs4_state_create_net(struct net *net)
        INIT_LIST_HEAD(&nn->close_lru);
        INIT_LIST_HEAD(&nn->del_recall_lru);
        spin_lock_init(&nn->client_lock);
-       spin_lock_init(&nn->s2s_cp_lock);
-       idr_init(&nn->s2s_cp_stateids);
+       xa_init_flags(&nn->s2s_cp_stateids, XA_FLAGS_ALLOC);
+       nn->s2s_cp_stateid_next = 0;
 
        spin_lock_init(&nn->blocked_locks_lock);
        INIT_LIST_HEAD(&nn->blocked_locks_lru);