Commit aae5730e authored by Matthew Wilcox's avatar Matthew Wilcox Committed by Anna Schumaker

nfs: Use ida_simple API

Allocate the owner_id when we allocate the state and free it when we free
the state.  That lets us get rid of a gnarly ida_pre_get() / ida_get_new()
loop.
Signed-off-by: default avatarMatthew Wilcox <mawilcox@microsoft.com>
Reviewed-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent 35156bff
...@@ -428,7 +428,6 @@ nfs4_insert_state_owner_locked(struct nfs4_state_owner *new) ...@@ -428,7 +428,6 @@ nfs4_insert_state_owner_locked(struct nfs4_state_owner *new)
struct rb_node **p = &server->state_owners.rb_node, struct rb_node **p = &server->state_owners.rb_node,
*parent = NULL; *parent = NULL;
struct nfs4_state_owner *sp; struct nfs4_state_owner *sp;
int err;
while (*p != NULL) { while (*p != NULL) {
parent = *p; parent = *p;
...@@ -445,9 +444,6 @@ nfs4_insert_state_owner_locked(struct nfs4_state_owner *new) ...@@ -445,9 +444,6 @@ nfs4_insert_state_owner_locked(struct nfs4_state_owner *new)
return sp; return sp;
} }
} }
err = ida_get_new(&server->openowner_id, &new->so_seqid.owner_id);
if (err)
return ERR_PTR(err);
rb_link_node(&new->so_server_node, parent, p); rb_link_node(&new->so_server_node, parent, p);
rb_insert_color(&new->so_server_node, &server->state_owners); rb_insert_color(&new->so_server_node, &server->state_owners);
return new; return new;
...@@ -460,7 +456,6 @@ nfs4_remove_state_owner_locked(struct nfs4_state_owner *sp) ...@@ -460,7 +456,6 @@ nfs4_remove_state_owner_locked(struct nfs4_state_owner *sp)
if (!RB_EMPTY_NODE(&sp->so_server_node)) if (!RB_EMPTY_NODE(&sp->so_server_node))
rb_erase(&sp->so_server_node, &server->state_owners); rb_erase(&sp->so_server_node, &server->state_owners);
ida_remove(&server->openowner_id, sp->so_seqid.owner_id);
} }
static void static void
...@@ -495,6 +490,12 @@ nfs4_alloc_state_owner(struct nfs_server *server, ...@@ -495,6 +490,12 @@ nfs4_alloc_state_owner(struct nfs_server *server,
sp = kzalloc(sizeof(*sp), gfp_flags); sp = kzalloc(sizeof(*sp), gfp_flags);
if (!sp) if (!sp)
return NULL; return NULL;
sp->so_seqid.owner_id = ida_simple_get(&server->openowner_id, 0, 0,
gfp_flags);
if (sp->so_seqid.owner_id < 0) {
kfree(sp);
return NULL;
}
sp->so_server = server; sp->so_server = server;
sp->so_cred = get_rpccred(cred); sp->so_cred = get_rpccred(cred);
spin_lock_init(&sp->so_lock); spin_lock_init(&sp->so_lock);
...@@ -526,6 +527,7 @@ static void nfs4_free_state_owner(struct nfs4_state_owner *sp) ...@@ -526,6 +527,7 @@ static void nfs4_free_state_owner(struct nfs4_state_owner *sp)
{ {
nfs4_destroy_seqid_counter(&sp->so_seqid); nfs4_destroy_seqid_counter(&sp->so_seqid);
put_rpccred(sp->so_cred); put_rpccred(sp->so_cred);
ida_simple_remove(&sp->so_server->openowner_id, sp->so_seqid.owner_id);
kfree(sp); kfree(sp);
} }
...@@ -576,13 +578,9 @@ struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server, ...@@ -576,13 +578,9 @@ struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server,
new = nfs4_alloc_state_owner(server, cred, gfp_flags); new = nfs4_alloc_state_owner(server, cred, gfp_flags);
if (new == NULL) if (new == NULL)
goto out; goto out;
do { spin_lock(&clp->cl_lock);
if (ida_pre_get(&server->openowner_id, gfp_flags) == 0) sp = nfs4_insert_state_owner_locked(new);
break; spin_unlock(&clp->cl_lock);
spin_lock(&clp->cl_lock);
sp = nfs4_insert_state_owner_locked(new);
spin_unlock(&clp->cl_lock);
} while (sp == ERR_PTR(-EAGAIN));
if (sp != new) if (sp != new)
nfs4_free_state_owner(new); nfs4_free_state_owner(new);
out: out:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment