diff options
-rw-r--r-- | fs/nfs/nfs4_fs.h | 2 | ||||
-rw-r--r-- | fs/nfs/nfs4proc.c | 3 | ||||
-rw-r--r-- | fs/nfs/nfs4state.c | 24 |
3 files changed, 14 insertions, 15 deletions
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h index 4d7d0aedc101..654b091644c5 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h | |||
@@ -319,7 +319,7 @@ static inline void nfs4_schedule_session_recovery(struct nfs4_session *session) | |||
319 | } | 319 | } |
320 | #endif /* CONFIG_NFS_V4_1 */ | 320 | #endif /* CONFIG_NFS_V4_1 */ |
321 | 321 | ||
322 | extern struct nfs4_state_owner * nfs4_get_state_owner(struct nfs_server *, struct rpc_cred *); | 322 | extern struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *, struct rpc_cred *, gfp_t); |
323 | extern void nfs4_put_state_owner(struct nfs4_state_owner *); | 323 | extern void nfs4_put_state_owner(struct nfs4_state_owner *); |
324 | extern void nfs4_purge_state_owners(struct nfs_server *); | 324 | extern void nfs4_purge_state_owners(struct nfs_server *); |
325 | extern struct nfs4_state * nfs4_get_open_state(struct inode *, struct nfs4_state_owner *); | 325 | extern struct nfs4_state * nfs4_get_open_state(struct inode *, struct nfs4_state_owner *); |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index f0c849c98fe4..53ef365f4372 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -1754,7 +1754,8 @@ static int _nfs4_do_open(struct inode *dir, struct dentry *dentry, fmode_t fmode | |||
1754 | 1754 | ||
1755 | /* Protect against reboot recovery conflicts */ | 1755 | /* Protect against reboot recovery conflicts */ |
1756 | status = -ENOMEM; | 1756 | status = -ENOMEM; |
1757 | if (!(sp = nfs4_get_state_owner(server, cred))) { | 1757 | sp = nfs4_get_state_owner(server, cred, GFP_KERNEL); |
1758 | if (sp == NULL) { | ||
1758 | dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n"); | 1759 | dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n"); |
1759 | goto out_err; | 1760 | goto out_err; |
1760 | } | 1761 | } |
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index a53f33b4ac3a..a8a42a677d8f 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c | |||
@@ -444,13 +444,17 @@ nfs4_remove_state_owner_locked(struct nfs4_state_owner *sp) | |||
444 | * | 444 | * |
445 | */ | 445 | */ |
446 | static struct nfs4_state_owner * | 446 | static struct nfs4_state_owner * |
447 | nfs4_alloc_state_owner(void) | 447 | nfs4_alloc_state_owner(struct nfs_server *server, |
448 | struct rpc_cred *cred, | ||
449 | gfp_t gfp_flags) | ||
448 | { | 450 | { |
449 | struct nfs4_state_owner *sp; | 451 | struct nfs4_state_owner *sp; |
450 | 452 | ||
451 | sp = kzalloc(sizeof(*sp),GFP_NOFS); | 453 | sp = kzalloc(sizeof(*sp), gfp_flags); |
452 | if (!sp) | 454 | if (!sp) |
453 | return NULL; | 455 | return NULL; |
456 | sp->so_server = server; | ||
457 | sp->so_cred = get_rpccred(cred); | ||
454 | spin_lock_init(&sp->so_lock); | 458 | spin_lock_init(&sp->so_lock); |
455 | INIT_LIST_HEAD(&sp->so_states); | 459 | INIT_LIST_HEAD(&sp->so_states); |
456 | rpc_init_wait_queue(&sp->so_sequence.wait, "Seqid_waitqueue"); | 460 | rpc_init_wait_queue(&sp->so_sequence.wait, "Seqid_waitqueue"); |
@@ -516,7 +520,8 @@ static void nfs4_gc_state_owners(struct nfs_server *server) | |||
516 | * Returns a pointer to an instantiated nfs4_state_owner struct, or NULL. | 520 | * Returns a pointer to an instantiated nfs4_state_owner struct, or NULL. |
517 | */ | 521 | */ |
518 | struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server, | 522 | struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server, |
519 | struct rpc_cred *cred) | 523 | struct rpc_cred *cred, |
524 | gfp_t gfp_flags) | ||
520 | { | 525 | { |
521 | struct nfs_client *clp = server->nfs_client; | 526 | struct nfs_client *clp = server->nfs_client; |
522 | struct nfs4_state_owner *sp, *new; | 527 | struct nfs4_state_owner *sp, *new; |
@@ -526,20 +531,13 @@ struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *server, | |||
526 | spin_unlock(&clp->cl_lock); | 531 | spin_unlock(&clp->cl_lock); |
527 | if (sp != NULL) | 532 | if (sp != NULL) |
528 | goto out; | 533 | goto out; |
529 | new = nfs4_alloc_state_owner(); | 534 | new = nfs4_alloc_state_owner(server, cred, gfp_flags); |
530 | if (new == NULL) | 535 | if (new == NULL) |
531 | goto out; | 536 | goto out; |
532 | new->so_server = server; | ||
533 | new->so_cred = cred; | ||
534 | spin_lock(&clp->cl_lock); | ||
535 | sp = nfs4_insert_state_owner_locked(new); | 537 | sp = nfs4_insert_state_owner_locked(new); |
536 | spin_unlock(&clp->cl_lock); | 538 | spin_unlock(&clp->cl_lock); |
537 | if (sp == new) | 539 | if (sp != new) |
538 | get_rpccred(cred); | 540 | nfs4_free_state_owner(new); |
539 | else { | ||
540 | rpc_destroy_wait_queue(&new->so_sequence.wait); | ||
541 | kfree(new); | ||
542 | } | ||
543 | out: | 541 | out: |
544 | nfs4_gc_state_owners(server); | 542 | nfs4_gc_state_owners(server); |
545 | return sp; | 543 | return sp; |