aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs4proc.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfs/nfs4proc.c')
-rw-r--r--fs/nfs/nfs4proc.c38
1 files changed, 18 insertions, 20 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index cc33a1c32cfb..e38401931291 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -850,9 +850,14 @@ static int _nfs4_open_delegated(struct inode *inode, int flags, struct rpc_cred
850 int open_flags = flags & (FMODE_READ|FMODE_WRITE); 850 int open_flags = flags & (FMODE_READ|FMODE_WRITE);
851 int err; 851 int err;
852 852
853 err = -ENOMEM;
854 if (!(sp = nfs4_get_state_owner(server, cred))) {
855 dprintk("%s: nfs4_get_state_owner failed!\n", __FUNCTION__);
856 return err;
857 }
853 err = nfs4_recover_expired_lease(server); 858 err = nfs4_recover_expired_lease(server);
854 if (err != 0) 859 if (err != 0)
855 return err; 860 goto out_put_state_owner;
856 /* Protect against reboot recovery - NOTE ORDER! */ 861 /* Protect against reboot recovery - NOTE ORDER! */
857 down_read(&clp->cl_sem); 862 down_read(&clp->cl_sem);
858 /* Protect against delegation recall */ 863 /* Protect against delegation recall */
@@ -862,10 +867,6 @@ static int _nfs4_open_delegated(struct inode *inode, int flags, struct rpc_cred
862 if (delegation == NULL || (delegation->type & open_flags) != open_flags) 867 if (delegation == NULL || (delegation->type & open_flags) != open_flags)
863 goto out_err; 868 goto out_err;
864 err = -ENOMEM; 869 err = -ENOMEM;
865 if (!(sp = nfs4_get_state_owner(server, cred))) {
866 dprintk("%s: nfs4_get_state_owner failed!\n", __FUNCTION__);
867 goto out_err;
868 }
869 state = nfs4_get_open_state(inode, sp); 870 state = nfs4_get_open_state(inode, sp);
870 if (state == NULL) 871 if (state == NULL)
871 goto out_err; 872 goto out_err;
@@ -877,13 +878,13 @@ static int _nfs4_open_delegated(struct inode *inode, int flags, struct rpc_cred
877 spin_unlock(&inode->i_lock); 878 spin_unlock(&inode->i_lock);
878 goto out_ok; 879 goto out_ok;
879 } else if (state->state != 0) 880 } else if (state->state != 0)
880 goto out_err; 881 goto out_put_open_state;
881 882
882 lock_kernel(); 883 lock_kernel();
883 err = _nfs4_do_access(inode, cred, open_flags); 884 err = _nfs4_do_access(inode, cred, open_flags);
884 unlock_kernel(); 885 unlock_kernel();
885 if (err != 0) 886 if (err != 0)
886 goto out_err; 887 goto out_put_open_state;
887 set_bit(NFS_DELEGATED_STATE, &state->flags); 888 set_bit(NFS_DELEGATED_STATE, &state->flags);
888 update_open_stateid(state, &delegation->stateid, open_flags); 889 update_open_stateid(state, &delegation->stateid, open_flags);
889out_ok: 890out_ok:
@@ -891,17 +892,16 @@ out_ok:
891 up_read(&nfsi->rwsem); 892 up_read(&nfsi->rwsem);
892 up_read(&clp->cl_sem); 893 up_read(&clp->cl_sem);
893 *res = state; 894 *res = state;
894 return 0; 895 return 0;
896out_put_open_state:
897 nfs4_put_open_state(state);
895out_err: 898out_err:
896 if (sp != NULL) {
897 if (state != NULL)
898 nfs4_put_open_state(state);
899 nfs4_put_state_owner(sp);
900 }
901 up_read(&nfsi->rwsem); 899 up_read(&nfsi->rwsem);
902 up_read(&clp->cl_sem); 900 up_read(&clp->cl_sem);
903 if (err != -EACCES) 901 if (err != -EACCES)
904 nfs_inode_return_delegation(inode); 902 nfs_inode_return_delegation(inode);
903out_put_state_owner:
904 nfs4_put_state_owner(sp);
905 return err; 905 return err;
906} 906}
907 907
@@ -941,7 +941,7 @@ static int _nfs4_do_open(struct inode *dir, struct dentry *dentry, int flags, st
941 } 941 }
942 status = nfs4_recover_expired_lease(server); 942 status = nfs4_recover_expired_lease(server);
943 if (status != 0) 943 if (status != 0)
944 goto out_err; 944 goto err_put_state_owner;
945 down_read(&clp->cl_sem); 945 down_read(&clp->cl_sem);
946 status = -ENOMEM; 946 status = -ENOMEM;
947 opendata = nfs4_opendata_alloc(dentry, sp, flags, sattr); 947 opendata = nfs4_opendata_alloc(dentry, sp, flags, sattr);
@@ -2518,26 +2518,24 @@ static const struct rpc_call_ops nfs4_renew_ops = {
2518 .rpc_call_done = nfs4_renew_done, 2518 .rpc_call_done = nfs4_renew_done,
2519}; 2519};
2520 2520
2521int 2521int nfs4_proc_async_renew(struct nfs4_client *clp, struct rpc_cred *cred)
2522nfs4_proc_async_renew(struct nfs4_client *clp)
2523{ 2522{
2524 struct rpc_message msg = { 2523 struct rpc_message msg = {
2525 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW], 2524 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
2526 .rpc_argp = clp, 2525 .rpc_argp = clp,
2527 .rpc_cred = clp->cl_cred, 2526 .rpc_cred = cred,
2528 }; 2527 };
2529 2528
2530 return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_SOFT, 2529 return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_SOFT,
2531 &nfs4_renew_ops, (void *)jiffies); 2530 &nfs4_renew_ops, (void *)jiffies);
2532} 2531}
2533 2532
2534int 2533int nfs4_proc_renew(struct nfs4_client *clp, struct rpc_cred *cred)
2535nfs4_proc_renew(struct nfs4_client *clp)
2536{ 2534{
2537 struct rpc_message msg = { 2535 struct rpc_message msg = {
2538 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW], 2536 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
2539 .rpc_argp = clp, 2537 .rpc_argp = clp,
2540 .rpc_cred = clp->cl_cred, 2538 .rpc_cred = cred,
2541 }; 2539 };
2542 unsigned long now = jiffies; 2540 unsigned long now = jiffies;
2543 int status; 2541 int status;