diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2011-10-23 18:49:54 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-01-03 22:52:34 -0500 |
commit | 5ede7b1cfa8201418fb35e12f770e9e7c2559a4d (patch) | |
tree | c26d99fbbed708a6db116e57daca68f2b3c672ac /fs/nfs/inode.c | |
parent | 157e8bf8b4823bfcdefa6c1548002374b61f61df (diff) |
pull manipulations of rpc_cred inside alloc_nfs_open_context()
No need to duplicate them in both callers; make it return
ERR_PTR(-ENOMEM) on allocation failure instead of NULL and
it'll be able to report rpc_lookup_cred() failures just
fine. Callers are much happier that way...
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/nfs/inode.c')
-rw-r--r-- | fs/nfs/inode.c | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 50a15fa8cf98..efb66db04f99 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
@@ -629,23 +629,28 @@ void nfs_close_context(struct nfs_open_context *ctx, int is_sync) | |||
629 | nfs_revalidate_inode(server, inode); | 629 | nfs_revalidate_inode(server, inode); |
630 | } | 630 | } |
631 | 631 | ||
632 | struct nfs_open_context *alloc_nfs_open_context(struct dentry *dentry, struct rpc_cred *cred, fmode_t f_mode) | 632 | struct nfs_open_context *alloc_nfs_open_context(struct dentry *dentry, fmode_t f_mode) |
633 | { | 633 | { |
634 | struct nfs_open_context *ctx; | 634 | struct nfs_open_context *ctx; |
635 | struct rpc_cred *cred = rpc_lookup_cred(); | ||
636 | if (IS_ERR(cred)) | ||
637 | return ERR_CAST(cred); | ||
635 | 638 | ||
636 | ctx = kmalloc(sizeof(*ctx), GFP_KERNEL); | 639 | ctx = kmalloc(sizeof(*ctx), GFP_KERNEL); |
637 | if (ctx != NULL) { | 640 | if (!ctx) { |
638 | nfs_sb_active(dentry->d_sb); | 641 | put_rpccred(cred); |
639 | ctx->dentry = dget(dentry); | 642 | return ERR_PTR(-ENOMEM); |
640 | ctx->cred = get_rpccred(cred); | ||
641 | ctx->state = NULL; | ||
642 | ctx->mode = f_mode; | ||
643 | ctx->flags = 0; | ||
644 | ctx->error = 0; | ||
645 | nfs_init_lock_context(&ctx->lock_context); | ||
646 | ctx->lock_context.open_context = ctx; | ||
647 | INIT_LIST_HEAD(&ctx->list); | ||
648 | } | 643 | } |
644 | nfs_sb_active(dentry->d_sb); | ||
645 | ctx->dentry = dget(dentry); | ||
646 | ctx->cred = cred; | ||
647 | ctx->state = NULL; | ||
648 | ctx->mode = f_mode; | ||
649 | ctx->flags = 0; | ||
650 | ctx->error = 0; | ||
651 | nfs_init_lock_context(&ctx->lock_context); | ||
652 | ctx->lock_context.open_context = ctx; | ||
653 | INIT_LIST_HEAD(&ctx->list); | ||
649 | return ctx; | 654 | return ctx; |
650 | } | 655 | } |
651 | 656 | ||
@@ -738,15 +743,10 @@ static void nfs_file_clear_open_context(struct file *filp) | |||
738 | int nfs_open(struct inode *inode, struct file *filp) | 743 | int nfs_open(struct inode *inode, struct file *filp) |
739 | { | 744 | { |
740 | struct nfs_open_context *ctx; | 745 | struct nfs_open_context *ctx; |
741 | struct rpc_cred *cred; | ||
742 | 746 | ||
743 | cred = rpc_lookup_cred(); | 747 | ctx = alloc_nfs_open_context(filp->f_path.dentry, filp->f_mode); |
744 | if (IS_ERR(cred)) | 748 | if (IS_ERR(ctx)) |
745 | return PTR_ERR(cred); | 749 | return PTR_ERR(ctx); |
746 | ctx = alloc_nfs_open_context(filp->f_path.dentry, cred, filp->f_mode); | ||
747 | put_rpccred(cred); | ||
748 | if (ctx == NULL) | ||
749 | return -ENOMEM; | ||
750 | nfs_file_set_open_context(filp, ctx); | 750 | nfs_file_set_open_context(filp, ctx); |
751 | put_nfs_open_context(ctx); | 751 | put_nfs_open_context(ctx); |
752 | nfs_fscache_set_inode_cookie(inode, filp); | 752 | nfs_fscache_set_inode_cookie(inode, filp); |