diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfs/dir.c | 13 | ||||
-rw-r--r-- | fs/nfs/inode.c | 40 |
2 files changed, 21 insertions, 32 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index ac2899098147..23be134b3193 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
@@ -1368,18 +1368,7 @@ static fmode_t flags_to_mode(int flags) | |||
1368 | 1368 | ||
1369 | static struct nfs_open_context *create_nfs_open_context(struct dentry *dentry, int open_flags) | 1369 | static struct nfs_open_context *create_nfs_open_context(struct dentry *dentry, int open_flags) |
1370 | { | 1370 | { |
1371 | struct nfs_open_context *ctx; | 1371 | return alloc_nfs_open_context(dentry, flags_to_mode(open_flags)); |
1372 | struct rpc_cred *cred; | ||
1373 | fmode_t fmode = flags_to_mode(open_flags); | ||
1374 | |||
1375 | cred = rpc_lookup_cred(); | ||
1376 | if (IS_ERR(cred)) | ||
1377 | return ERR_CAST(cred); | ||
1378 | ctx = alloc_nfs_open_context(dentry, cred, fmode); | ||
1379 | put_rpccred(cred); | ||
1380 | if (ctx == NULL) | ||
1381 | return ERR_PTR(-ENOMEM); | ||
1382 | return ctx; | ||
1383 | } | 1372 | } |
1384 | 1373 | ||
1385 | static int do_open(struct inode *inode, struct file *filp) | 1374 | static int do_open(struct inode *inode, struct file *filp) |
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); |