From 8986cf69e5227f3fd365d8197f6ec85c3cc80c44 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Wed, 9 Jan 2019 15:34:09 -0500 Subject: [PATCH] nfsd: Convert s2s_cp_stateids to XArray Signed-off-by: Matthew Wilcox --- fs/nfsd/netns.h | 4 ++-- fs/nfsd/nfs4state.c | 22 ++++++++-------------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/fs/nfsd/netns.h b/fs/nfsd/netns.h index bdfe5bcb3dcd..f2fc649cb96b 100644 --- a/fs/nfsd/netns.h +++ b/fs/nfsd/netns.h @@ -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 diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 25385e407484..75e3135442f5 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -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, + ©->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); -- 2.50.1