aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nfs/nfs4state.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index 91a4d4eeb235..c10a422efe6f 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -428,7 +428,6 @@ nfs4_insert_state_owner_locked(struct nfs4_state_owner *new)
428 struct rb_node **p = &server->state_owners.rb_node, 428 struct rb_node **p = &server->state_owners.rb_node,
429 *parent = NULL; 429 *parent = NULL;
430 struct nfs4_state_owner *sp; 430 struct nfs4_state_owner *sp;
431 int err;
432 431
433 while (*p != NULL) { 432 while (*p != NULL) {
434 parent = *p; 433 parent = *p;
@@ -445,9 +444,6 @@ nfs4_insert_state_owner_locked(struct nfs4_state_owner *new)
445 return sp; 444 return sp;
446 } 445 }
447 } 446 }
448 err = ida_get_new(&server->openowner_id, &new->so_seqid.owner_id);
449 if (err)
450 return ERR_PTR(err);
451 rb_link_node(&new->so_server_node, parent, p); 447 rb_link_node(&new->so_server_node, parent, p);
452 rb_insert_color(&new->so_server_node, &server->state_owners); 448 rb_insert_color(&new->so_server_node, &server->state_owners);
453 return new; 449 return new;
@@ -460,7 +456,6 @@ nfs4_remove_state_owner_locked(struct nfs4_state_owner *sp)
460 456
461 if (!RB_EMPTY_NODE(&sp->so_server_node)) 457 if (!RB_EMPTY_NODE(&sp->so_server_node))
462 rb_erase(&sp->so_server_node, &server->state_owners); 458 rb_erase(&sp->so_server_node, &server->state_owners);
463 ida_remove(&server->openowner_id, sp->so_seqid.owner_id);
464} 459}
465 460
466static void 461static void
@@ -495,6 +490,12 @@ nfs4_alloc_state_owner(struct nfs_server *server,
495 sp = kzalloc(sizeof(*sp), gfp_flags); 490 sp = kzalloc(sizeof(*sp), gfp_flags);
496 if (!sp) 491 if (!sp)
497 return NULL; 492 return NULL;
493 sp->so_seqid.owner_id = ida_simple_get(&server->openowner_id, 0, 0,
494 gfp_flags);
495 if (sp->so_seqid.owner_id < 0) {
496 kfree(sp);
497 return NULL;
498 }
498 sp->so_server = server; 499 sp->so_server = server;
499 sp->so_cred = get_rpccred(cred); 500 sp->so_cred = get_rpccred(cred);
500 spin_lock_init(&sp->so_lock); 501 spin_lock_init(&sp->so_lock);
@@ -526,6 +527,7 @@ static void nfs4_free_state_owner(struct nfs4_state_owner *sp)
526{ 527{
527 nfs4_destroy_seqid_counter(&sp->so_seqid); 528 nfs4_destroy_seqid_counter(&sp->so_seqid);
528 put_rpccred(sp->so_cred); 529 put_rpccred(sp->so_cred);
530 ida_simple_remove(&sp->so_server->openowner_id, sp->so_seqid.owner_id);
529 kfree(sp); 531 kfree(sp);
530} 532}
531 533
@@ -576,13 +578,9 @@ struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server,
576 new = nfs4_alloc_state_owner(server, cred, gfp_flags); 578 new = nfs4_alloc_state_owner(server, cred, gfp_flags);
577 if (new == NULL) 579 if (new == NULL)
578 goto out; 580 goto out;
579 do { 581 spin_lock(&clp->cl_lock);
580 if (ida_pre_get(&server->openowner_id, gfp_flags) == 0) 582 sp = nfs4_insert_state_owner_locked(new);
581 break; 583 spin_unlock(&clp->cl_lock);
582 spin_lock(&clp->cl_lock);
583 sp = nfs4_insert_state_owner_locked(new);
584 spin_unlock(&clp->cl_lock);
585 } while (sp == ERR_PTR(-EAGAIN));
586 if (sp != new) 584 if (sp != new)
587 nfs4_free_state_owner(new); 585 nfs4_free_state_owner(new);
588out: 586out: