*/
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;
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)
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);