diff options
| -rw-r--r-- | fs/nfs/nfs4state.c | 22 |
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 | ||
| 466 | static void | 461 | static 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); |
| 588 | out: | 586 | out: |
