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.c313
1 files changed, 146 insertions, 167 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index f03d9d5f5ba4..027e1095256e 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -210,7 +210,7 @@ static void update_changeattr(struct inode *dir, struct nfs4_change_info *cinfo)
210 spin_lock(&dir->i_lock); 210 spin_lock(&dir->i_lock);
211 nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA; 211 nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA;
212 if (!cinfo->atomic || cinfo->before != nfsi->change_attr) 212 if (!cinfo->atomic || cinfo->before != nfsi->change_attr)
213 nfsi->cache_change_attribute = jiffies; 213 nfs_force_lookup_revalidate(dir);
214 nfsi->change_attr = cinfo->after; 214 nfsi->change_attr = cinfo->after;
215 spin_unlock(&dir->i_lock); 215 spin_unlock(&dir->i_lock);
216} 216}
@@ -316,12 +316,9 @@ static void nfs4_opendata_put(struct nfs4_opendata *p)
316 316
317static int nfs4_wait_for_completion_rpc_task(struct rpc_task *task) 317static int nfs4_wait_for_completion_rpc_task(struct rpc_task *task)
318{ 318{
319 sigset_t oldset;
320 int ret; 319 int ret;
321 320
322 rpc_clnt_sigmask(task->tk_client, &oldset);
323 ret = rpc_wait_for_completion_task(task); 321 ret = rpc_wait_for_completion_task(task);
324 rpc_clnt_sigunmask(task->tk_client, &oldset);
325 return ret; 322 return ret;
326} 323}
327 324
@@ -718,19 +715,6 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state
718 return err; 715 return err;
719} 716}
720 717
721static void nfs4_open_confirm_prepare(struct rpc_task *task, void *calldata)
722{
723 struct nfs4_opendata *data = calldata;
724 struct rpc_message msg = {
725 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_CONFIRM],
726 .rpc_argp = &data->c_arg,
727 .rpc_resp = &data->c_res,
728 .rpc_cred = data->owner->so_cred,
729 };
730 data->timestamp = jiffies;
731 rpc_call_setup(task, &msg, 0);
732}
733
734static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata) 718static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata)
735{ 719{
736 struct nfs4_opendata *data = calldata; 720 struct nfs4_opendata *data = calldata;
@@ -741,10 +725,10 @@ static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata)
741 if (data->rpc_status == 0) { 725 if (data->rpc_status == 0) {
742 memcpy(data->o_res.stateid.data, data->c_res.stateid.data, 726 memcpy(data->o_res.stateid.data, data->c_res.stateid.data,
743 sizeof(data->o_res.stateid.data)); 727 sizeof(data->o_res.stateid.data));
728 nfs_confirm_seqid(&data->owner->so_seqid, 0);
744 renew_lease(data->o_res.server, data->timestamp); 729 renew_lease(data->o_res.server, data->timestamp);
745 data->rpc_done = 1; 730 data->rpc_done = 1;
746 } 731 }
747 nfs_confirm_seqid(&data->owner->so_seqid, data->rpc_status);
748 nfs_increment_open_seqid(data->rpc_status, data->c_arg.seqid); 732 nfs_increment_open_seqid(data->rpc_status, data->c_arg.seqid);
749} 733}
750 734
@@ -759,7 +743,6 @@ static void nfs4_open_confirm_release(void *calldata)
759 /* In case of error, no cleanup! */ 743 /* In case of error, no cleanup! */
760 if (!data->rpc_done) 744 if (!data->rpc_done)
761 goto out_free; 745 goto out_free;
762 nfs_confirm_seqid(&data->owner->so_seqid, 0);
763 state = nfs4_opendata_to_nfs4_state(data); 746 state = nfs4_opendata_to_nfs4_state(data);
764 if (!IS_ERR(state)) 747 if (!IS_ERR(state))
765 nfs4_close_state(&data->path, state, data->o_arg.open_flags); 748 nfs4_close_state(&data->path, state, data->o_arg.open_flags);
@@ -768,7 +751,6 @@ out_free:
768} 751}
769 752
770static const struct rpc_call_ops nfs4_open_confirm_ops = { 753static const struct rpc_call_ops nfs4_open_confirm_ops = {
771 .rpc_call_prepare = nfs4_open_confirm_prepare,
772 .rpc_call_done = nfs4_open_confirm_done, 754 .rpc_call_done = nfs4_open_confirm_done,
773 .rpc_release = nfs4_open_confirm_release, 755 .rpc_release = nfs4_open_confirm_release,
774}; 756};
@@ -780,12 +762,26 @@ static int _nfs4_proc_open_confirm(struct nfs4_opendata *data)
780{ 762{
781 struct nfs_server *server = NFS_SERVER(data->dir->d_inode); 763 struct nfs_server *server = NFS_SERVER(data->dir->d_inode);
782 struct rpc_task *task; 764 struct rpc_task *task;
765 struct rpc_message msg = {
766 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_CONFIRM],
767 .rpc_argp = &data->c_arg,
768 .rpc_resp = &data->c_res,
769 .rpc_cred = data->owner->so_cred,
770 };
771 struct rpc_task_setup task_setup_data = {
772 .rpc_client = server->client,
773 .rpc_message = &msg,
774 .callback_ops = &nfs4_open_confirm_ops,
775 .callback_data = data,
776 .flags = RPC_TASK_ASYNC,
777 };
783 int status; 778 int status;
784 779
785 kref_get(&data->kref); 780 kref_get(&data->kref);
786 data->rpc_done = 0; 781 data->rpc_done = 0;
787 data->rpc_status = 0; 782 data->rpc_status = 0;
788 task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_open_confirm_ops, data); 783 data->timestamp = jiffies;
784 task = rpc_run_task(&task_setup_data);
789 if (IS_ERR(task)) 785 if (IS_ERR(task))
790 return PTR_ERR(task); 786 return PTR_ERR(task);
791 status = nfs4_wait_for_completion_rpc_task(task); 787 status = nfs4_wait_for_completion_rpc_task(task);
@@ -802,13 +798,7 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
802{ 798{
803 struct nfs4_opendata *data = calldata; 799 struct nfs4_opendata *data = calldata;
804 struct nfs4_state_owner *sp = data->owner; 800 struct nfs4_state_owner *sp = data->owner;
805 struct rpc_message msg = { 801
806 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN],
807 .rpc_argp = &data->o_arg,
808 .rpc_resp = &data->o_res,
809 .rpc_cred = sp->so_cred,
810 };
811
812 if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0) 802 if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0)
813 return; 803 return;
814 /* 804 /*
@@ -833,11 +823,11 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
833 data->o_arg.id = sp->so_owner_id.id; 823 data->o_arg.id = sp->so_owner_id.id;
834 data->o_arg.clientid = sp->so_client->cl_clientid; 824 data->o_arg.clientid = sp->so_client->cl_clientid;
835 if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS) { 825 if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS) {
836 msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR]; 826 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR];
837 nfs_copy_fh(&data->o_res.fh, data->o_arg.fh); 827 nfs_copy_fh(&data->o_res.fh, data->o_arg.fh);
838 } 828 }
839 data->timestamp = jiffies; 829 data->timestamp = jiffies;
840 rpc_call_setup(task, &msg, 0); 830 rpc_call_start(task);
841 return; 831 return;
842out_no_action: 832out_no_action:
843 task->tk_action = NULL; 833 task->tk_action = NULL;
@@ -886,7 +876,6 @@ static void nfs4_open_release(void *calldata)
886 /* In case we need an open_confirm, no cleanup! */ 876 /* In case we need an open_confirm, no cleanup! */
887 if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM) 877 if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM)
888 goto out_free; 878 goto out_free;
889 nfs_confirm_seqid(&data->owner->so_seqid, 0);
890 state = nfs4_opendata_to_nfs4_state(data); 879 state = nfs4_opendata_to_nfs4_state(data);
891 if (!IS_ERR(state)) 880 if (!IS_ERR(state))
892 nfs4_close_state(&data->path, state, data->o_arg.open_flags); 881 nfs4_close_state(&data->path, state, data->o_arg.open_flags);
@@ -910,13 +899,26 @@ static int _nfs4_proc_open(struct nfs4_opendata *data)
910 struct nfs_openargs *o_arg = &data->o_arg; 899 struct nfs_openargs *o_arg = &data->o_arg;
911 struct nfs_openres *o_res = &data->o_res; 900 struct nfs_openres *o_res = &data->o_res;
912 struct rpc_task *task; 901 struct rpc_task *task;
902 struct rpc_message msg = {
903 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN],
904 .rpc_argp = o_arg,
905 .rpc_resp = o_res,
906 .rpc_cred = data->owner->so_cred,
907 };
908 struct rpc_task_setup task_setup_data = {
909 .rpc_client = server->client,
910 .rpc_message = &msg,
911 .callback_ops = &nfs4_open_ops,
912 .callback_data = data,
913 .flags = RPC_TASK_ASYNC,
914 };
913 int status; 915 int status;
914 916
915 kref_get(&data->kref); 917 kref_get(&data->kref);
916 data->rpc_done = 0; 918 data->rpc_done = 0;
917 data->rpc_status = 0; 919 data->rpc_status = 0;
918 data->cancelled = 0; 920 data->cancelled = 0;
919 task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_open_ops, data); 921 task = rpc_run_task(&task_setup_data);
920 if (IS_ERR(task)) 922 if (IS_ERR(task))
921 return PTR_ERR(task); 923 return PTR_ERR(task);
922 status = nfs4_wait_for_completion_rpc_task(task); 924 status = nfs4_wait_for_completion_rpc_task(task);
@@ -1246,12 +1248,6 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
1246{ 1248{
1247 struct nfs4_closedata *calldata = data; 1249 struct nfs4_closedata *calldata = data;
1248 struct nfs4_state *state = calldata->state; 1250 struct nfs4_state *state = calldata->state;
1249 struct rpc_message msg = {
1250 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE],
1251 .rpc_argp = &calldata->arg,
1252 .rpc_resp = &calldata->res,
1253 .rpc_cred = state->owner->so_cred,
1254 };
1255 int clear_rd, clear_wr, clear_rdwr; 1251 int clear_rd, clear_wr, clear_rdwr;
1256 1252
1257 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0) 1253 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
@@ -1278,14 +1274,14 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
1278 } 1274 }
1279 nfs_fattr_init(calldata->res.fattr); 1275 nfs_fattr_init(calldata->res.fattr);
1280 if (test_bit(NFS_O_RDONLY_STATE, &state->flags) != 0) { 1276 if (test_bit(NFS_O_RDONLY_STATE, &state->flags) != 0) {
1281 msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE]; 1277 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE];
1282 calldata->arg.open_flags = FMODE_READ; 1278 calldata->arg.open_flags = FMODE_READ;
1283 } else if (test_bit(NFS_O_WRONLY_STATE, &state->flags) != 0) { 1279 } else if (test_bit(NFS_O_WRONLY_STATE, &state->flags) != 0) {
1284 msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE]; 1280 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE];
1285 calldata->arg.open_flags = FMODE_WRITE; 1281 calldata->arg.open_flags = FMODE_WRITE;
1286 } 1282 }
1287 calldata->timestamp = jiffies; 1283 calldata->timestamp = jiffies;
1288 rpc_call_setup(task, &msg, 0); 1284 rpc_call_start(task);
1289} 1285}
1290 1286
1291static const struct rpc_call_ops nfs4_close_ops = { 1287static const struct rpc_call_ops nfs4_close_ops = {
@@ -1311,6 +1307,16 @@ int nfs4_do_close(struct path *path, struct nfs4_state *state, int wait)
1311 struct nfs4_closedata *calldata; 1307 struct nfs4_closedata *calldata;
1312 struct nfs4_state_owner *sp = state->owner; 1308 struct nfs4_state_owner *sp = state->owner;
1313 struct rpc_task *task; 1309 struct rpc_task *task;
1310 struct rpc_message msg = {
1311 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE],
1312 .rpc_cred = state->owner->so_cred,
1313 };
1314 struct rpc_task_setup task_setup_data = {
1315 .rpc_client = server->client,
1316 .rpc_message = &msg,
1317 .callback_ops = &nfs4_close_ops,
1318 .flags = RPC_TASK_ASYNC,
1319 };
1314 int status = -ENOMEM; 1320 int status = -ENOMEM;
1315 1321
1316 calldata = kmalloc(sizeof(*calldata), GFP_KERNEL); 1322 calldata = kmalloc(sizeof(*calldata), GFP_KERNEL);
@@ -1330,7 +1336,10 @@ int nfs4_do_close(struct path *path, struct nfs4_state *state, int wait)
1330 calldata->path.mnt = mntget(path->mnt); 1336 calldata->path.mnt = mntget(path->mnt);
1331 calldata->path.dentry = dget(path->dentry); 1337 calldata->path.dentry = dget(path->dentry);
1332 1338
1333 task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_close_ops, calldata); 1339 msg.rpc_argp = &calldata->arg,
1340 msg.rpc_resp = &calldata->res,
1341 task_setup_data.callback_data = calldata;
1342 task = rpc_run_task(&task_setup_data);
1334 if (IS_ERR(task)) 1343 if (IS_ERR(task))
1335 return PTR_ERR(task); 1344 return PTR_ERR(task);
1336 status = 0; 1345 status = 0;
@@ -2416,18 +2425,10 @@ static int nfs4_read_done(struct rpc_task *task, struct nfs_read_data *data)
2416 return 0; 2425 return 0;
2417} 2426}
2418 2427
2419static void nfs4_proc_read_setup(struct nfs_read_data *data) 2428static void nfs4_proc_read_setup(struct nfs_read_data *data, struct rpc_message *msg)
2420{ 2429{
2421 struct rpc_message msg = {
2422 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ],
2423 .rpc_argp = &data->args,
2424 .rpc_resp = &data->res,
2425 .rpc_cred = data->cred,
2426 };
2427
2428 data->timestamp = jiffies; 2430 data->timestamp = jiffies;
2429 2431 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
2430 rpc_call_setup(&data->task, &msg, 0);
2431} 2432}
2432 2433
2433static int nfs4_write_done(struct rpc_task *task, struct nfs_write_data *data) 2434static int nfs4_write_done(struct rpc_task *task, struct nfs_write_data *data)
@@ -2445,33 +2446,15 @@ static int nfs4_write_done(struct rpc_task *task, struct nfs_write_data *data)
2445 return 0; 2446 return 0;
2446} 2447}
2447 2448
2448static void nfs4_proc_write_setup(struct nfs_write_data *data, int how) 2449static void nfs4_proc_write_setup(struct nfs_write_data *data, struct rpc_message *msg)
2449{ 2450{
2450 struct rpc_message msg = { 2451 struct nfs_server *server = NFS_SERVER(data->inode);
2451 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE], 2452
2452 .rpc_argp = &data->args,
2453 .rpc_resp = &data->res,
2454 .rpc_cred = data->cred,
2455 };
2456 struct inode *inode = data->inode;
2457 struct nfs_server *server = NFS_SERVER(inode);
2458 int stable;
2459
2460 if (how & FLUSH_STABLE) {
2461 if (!NFS_I(inode)->ncommit)
2462 stable = NFS_FILE_SYNC;
2463 else
2464 stable = NFS_DATA_SYNC;
2465 } else
2466 stable = NFS_UNSTABLE;
2467 data->args.stable = stable;
2468 data->args.bitmask = server->attr_bitmask; 2453 data->args.bitmask = server->attr_bitmask;
2469 data->res.server = server; 2454 data->res.server = server;
2470
2471 data->timestamp = jiffies; 2455 data->timestamp = jiffies;
2472 2456
2473 /* Finalize the task. */ 2457 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE];
2474 rpc_call_setup(&data->task, &msg, 0);
2475} 2458}
2476 2459
2477static int nfs4_commit_done(struct rpc_task *task, struct nfs_write_data *data) 2460static int nfs4_commit_done(struct rpc_task *task, struct nfs_write_data *data)
@@ -2486,20 +2469,13 @@ static int nfs4_commit_done(struct rpc_task *task, struct nfs_write_data *data)
2486 return 0; 2469 return 0;
2487} 2470}
2488 2471
2489static void nfs4_proc_commit_setup(struct nfs_write_data *data, int how) 2472static void nfs4_proc_commit_setup(struct nfs_write_data *data, struct rpc_message *msg)
2490{ 2473{
2491 struct rpc_message msg = {
2492 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT],
2493 .rpc_argp = &data->args,
2494 .rpc_resp = &data->res,
2495 .rpc_cred = data->cred,
2496 };
2497 struct nfs_server *server = NFS_SERVER(data->inode); 2474 struct nfs_server *server = NFS_SERVER(data->inode);
2498 2475
2499 data->args.bitmask = server->attr_bitmask; 2476 data->args.bitmask = server->attr_bitmask;
2500 data->res.server = server; 2477 data->res.server = server;
2501 2478 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT];
2502 rpc_call_setup(&data->task, &msg, 0);
2503} 2479}
2504 2480
2505/* 2481/*
@@ -2806,9 +2782,9 @@ nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server)
2806 return 0; 2782 return 0;
2807} 2783}
2808 2784
2809static int nfs4_wait_bit_interruptible(void *word) 2785static int nfs4_wait_bit_killable(void *word)
2810{ 2786{
2811 if (signal_pending(current)) 2787 if (fatal_signal_pending(current))
2812 return -ERESTARTSYS; 2788 return -ERESTARTSYS;
2813 schedule(); 2789 schedule();
2814 return 0; 2790 return 0;
@@ -2816,18 +2792,14 @@ static int nfs4_wait_bit_interruptible(void *word)
2816 2792
2817static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs_client *clp) 2793static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs_client *clp)
2818{ 2794{
2819 sigset_t oldset;
2820 int res; 2795 int res;
2821 2796
2822 might_sleep(); 2797 might_sleep();
2823 2798
2824 rwsem_acquire(&clp->cl_sem.dep_map, 0, 0, _RET_IP_); 2799 rwsem_acquire(&clp->cl_sem.dep_map, 0, 0, _RET_IP_);
2825 2800
2826 rpc_clnt_sigmask(clnt, &oldset);
2827 res = wait_on_bit(&clp->cl_state, NFS4CLNT_STATE_RECOVER, 2801 res = wait_on_bit(&clp->cl_state, NFS4CLNT_STATE_RECOVER,
2828 nfs4_wait_bit_interruptible, 2802 nfs4_wait_bit_killable, TASK_KILLABLE);
2829 TASK_INTERRUPTIBLE);
2830 rpc_clnt_sigunmask(clnt, &oldset);
2831 2803
2832 rwsem_release(&clp->cl_sem.dep_map, 1, _RET_IP_); 2804 rwsem_release(&clp->cl_sem.dep_map, 1, _RET_IP_);
2833 return res; 2805 return res;
@@ -2835,7 +2807,6 @@ static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs_client *clp)
2835 2807
2836static int nfs4_delay(struct rpc_clnt *clnt, long *timeout) 2808static int nfs4_delay(struct rpc_clnt *clnt, long *timeout)
2837{ 2809{
2838 sigset_t oldset;
2839 int res = 0; 2810 int res = 0;
2840 2811
2841 might_sleep(); 2812 might_sleep();
@@ -2844,14 +2815,9 @@ static int nfs4_delay(struct rpc_clnt *clnt, long *timeout)
2844 *timeout = NFS4_POLL_RETRY_MIN; 2815 *timeout = NFS4_POLL_RETRY_MIN;
2845 if (*timeout > NFS4_POLL_RETRY_MAX) 2816 if (*timeout > NFS4_POLL_RETRY_MAX)
2846 *timeout = NFS4_POLL_RETRY_MAX; 2817 *timeout = NFS4_POLL_RETRY_MAX;
2847 rpc_clnt_sigmask(clnt, &oldset); 2818 schedule_timeout_killable(*timeout);
2848 if (clnt->cl_intr) { 2819 if (fatal_signal_pending(current))
2849 schedule_timeout_interruptible(*timeout); 2820 res = -ERESTARTSYS;
2850 if (signalled())
2851 res = -ERESTARTSYS;
2852 } else
2853 schedule_timeout_uninterruptible(*timeout);
2854 rpc_clnt_sigunmask(clnt, &oldset);
2855 *timeout <<= 1; 2821 *timeout <<= 1;
2856 return res; 2822 return res;
2857} 2823}
@@ -2912,14 +2878,20 @@ int nfs4_proc_setclientid(struct nfs_client *clp, u32 program, unsigned short po
2912 2878
2913 for(;;) { 2879 for(;;) {
2914 setclientid.sc_name_len = scnprintf(setclientid.sc_name, 2880 setclientid.sc_name_len = scnprintf(setclientid.sc_name,
2915 sizeof(setclientid.sc_name), "%s/%u.%u.%u.%u %s %u", 2881 sizeof(setclientid.sc_name), "%s/%s %s %s %u",
2916 clp->cl_ipaddr, NIPQUAD(clp->cl_addr.sin_addr), 2882 clp->cl_ipaddr,
2883 rpc_peeraddr2str(clp->cl_rpcclient,
2884 RPC_DISPLAY_ADDR),
2885 rpc_peeraddr2str(clp->cl_rpcclient,
2886 RPC_DISPLAY_PROTO),
2917 cred->cr_ops->cr_name, 2887 cred->cr_ops->cr_name,
2918 clp->cl_id_uniquifier); 2888 clp->cl_id_uniquifier);
2919 setclientid.sc_netid_len = scnprintf(setclientid.sc_netid, 2889 setclientid.sc_netid_len = scnprintf(setclientid.sc_netid,
2920 sizeof(setclientid.sc_netid), "tcp"); 2890 sizeof(setclientid.sc_netid),
2891 rpc_peeraddr2str(clp->cl_rpcclient,
2892 RPC_DISPLAY_NETID));
2921 setclientid.sc_uaddr_len = scnprintf(setclientid.sc_uaddr, 2893 setclientid.sc_uaddr_len = scnprintf(setclientid.sc_uaddr,
2922 sizeof(setclientid.sc_uaddr), "%s.%d.%d", 2894 sizeof(setclientid.sc_uaddr), "%s.%u.%u",
2923 clp->cl_ipaddr, port >> 8, port & 255); 2895 clp->cl_ipaddr, port >> 8, port & 255);
2924 2896
2925 status = rpc_call_sync(clp->cl_rpcclient, &msg, 0); 2897 status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
@@ -2983,25 +2955,11 @@ struct nfs4_delegreturndata {
2983 struct nfs4_delegreturnres res; 2955 struct nfs4_delegreturnres res;
2984 struct nfs_fh fh; 2956 struct nfs_fh fh;
2985 nfs4_stateid stateid; 2957 nfs4_stateid stateid;
2986 struct rpc_cred *cred;
2987 unsigned long timestamp; 2958 unsigned long timestamp;
2988 struct nfs_fattr fattr; 2959 struct nfs_fattr fattr;
2989 int rpc_status; 2960 int rpc_status;
2990}; 2961};
2991 2962
2992static void nfs4_delegreturn_prepare(struct rpc_task *task, void *calldata)
2993{
2994 struct nfs4_delegreturndata *data = calldata;
2995 struct rpc_message msg = {
2996 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DELEGRETURN],
2997 .rpc_argp = &data->args,
2998 .rpc_resp = &data->res,
2999 .rpc_cred = data->cred,
3000 };
3001 nfs_fattr_init(data->res.fattr);
3002 rpc_call_setup(task, &msg, 0);
3003}
3004
3005static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata) 2963static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
3006{ 2964{
3007 struct nfs4_delegreturndata *data = calldata; 2965 struct nfs4_delegreturndata *data = calldata;
@@ -3012,24 +2970,30 @@ static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
3012 2970
3013static void nfs4_delegreturn_release(void *calldata) 2971static void nfs4_delegreturn_release(void *calldata)
3014{ 2972{
3015 struct nfs4_delegreturndata *data = calldata;
3016
3017 put_rpccred(data->cred);
3018 kfree(calldata); 2973 kfree(calldata);
3019} 2974}
3020 2975
3021static const struct rpc_call_ops nfs4_delegreturn_ops = { 2976static const struct rpc_call_ops nfs4_delegreturn_ops = {
3022 .rpc_call_prepare = nfs4_delegreturn_prepare,
3023 .rpc_call_done = nfs4_delegreturn_done, 2977 .rpc_call_done = nfs4_delegreturn_done,
3024 .rpc_release = nfs4_delegreturn_release, 2978 .rpc_release = nfs4_delegreturn_release,
3025}; 2979};
3026 2980
3027static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid) 2981static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync)
3028{ 2982{
3029 struct nfs4_delegreturndata *data; 2983 struct nfs4_delegreturndata *data;
3030 struct nfs_server *server = NFS_SERVER(inode); 2984 struct nfs_server *server = NFS_SERVER(inode);
3031 struct rpc_task *task; 2985 struct rpc_task *task;
3032 int status; 2986 struct rpc_message msg = {
2987 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DELEGRETURN],
2988 .rpc_cred = cred,
2989 };
2990 struct rpc_task_setup task_setup_data = {
2991 .rpc_client = server->client,
2992 .rpc_message = &msg,
2993 .callback_ops = &nfs4_delegreturn_ops,
2994 .flags = RPC_TASK_ASYNC,
2995 };
2996 int status = 0;
3033 2997
3034 data = kmalloc(sizeof(*data), GFP_KERNEL); 2998 data = kmalloc(sizeof(*data), GFP_KERNEL);
3035 if (data == NULL) 2999 if (data == NULL)
@@ -3041,30 +3005,37 @@ static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, co
3041 memcpy(&data->stateid, stateid, sizeof(data->stateid)); 3005 memcpy(&data->stateid, stateid, sizeof(data->stateid));
3042 data->res.fattr = &data->fattr; 3006 data->res.fattr = &data->fattr;
3043 data->res.server = server; 3007 data->res.server = server;
3044 data->cred = get_rpccred(cred); 3008 nfs_fattr_init(data->res.fattr);
3045 data->timestamp = jiffies; 3009 data->timestamp = jiffies;
3046 data->rpc_status = 0; 3010 data->rpc_status = 0;
3047 3011
3048 task = rpc_run_task(NFS_CLIENT(inode), RPC_TASK_ASYNC, &nfs4_delegreturn_ops, data); 3012 task_setup_data.callback_data = data;
3013 msg.rpc_argp = &data->args,
3014 msg.rpc_resp = &data->res,
3015 task = rpc_run_task(&task_setup_data);
3049 if (IS_ERR(task)) 3016 if (IS_ERR(task))
3050 return PTR_ERR(task); 3017 return PTR_ERR(task);
3018 if (!issync)
3019 goto out;
3051 status = nfs4_wait_for_completion_rpc_task(task); 3020 status = nfs4_wait_for_completion_rpc_task(task);
3052 if (status == 0) { 3021 if (status != 0)
3053 status = data->rpc_status; 3022 goto out;
3054 if (status == 0) 3023 status = data->rpc_status;
3055 nfs_refresh_inode(inode, &data->fattr); 3024 if (status != 0)
3056 } 3025 goto out;
3026 nfs_refresh_inode(inode, &data->fattr);
3027out:
3057 rpc_put_task(task); 3028 rpc_put_task(task);
3058 return status; 3029 return status;
3059} 3030}
3060 3031
3061int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid) 3032int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync)
3062{ 3033{
3063 struct nfs_server *server = NFS_SERVER(inode); 3034 struct nfs_server *server = NFS_SERVER(inode);
3064 struct nfs4_exception exception = { }; 3035 struct nfs4_exception exception = { };
3065 int err; 3036 int err;
3066 do { 3037 do {
3067 err = _nfs4_proc_delegreturn(inode, cred, stateid); 3038 err = _nfs4_proc_delegreturn(inode, cred, stateid, issync);
3068 switch (err) { 3039 switch (err) {
3069 case -NFS4ERR_STALE_STATEID: 3040 case -NFS4ERR_STALE_STATEID:
3070 case -NFS4ERR_EXPIRED: 3041 case -NFS4ERR_EXPIRED:
@@ -3085,7 +3056,7 @@ int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4
3085static unsigned long 3056static unsigned long
3086nfs4_set_lock_task_retry(unsigned long timeout) 3057nfs4_set_lock_task_retry(unsigned long timeout)
3087{ 3058{
3088 schedule_timeout_interruptible(timeout); 3059 schedule_timeout_killable(timeout);
3089 timeout <<= 1; 3060 timeout <<= 1;
3090 if (timeout > NFS4_LOCK_MAXTIMEOUT) 3061 if (timeout > NFS4_LOCK_MAXTIMEOUT)
3091 return NFS4_LOCK_MAXTIMEOUT; 3062 return NFS4_LOCK_MAXTIMEOUT;
@@ -3232,12 +3203,6 @@ static void nfs4_locku_done(struct rpc_task *task, void *data)
3232static void nfs4_locku_prepare(struct rpc_task *task, void *data) 3203static void nfs4_locku_prepare(struct rpc_task *task, void *data)
3233{ 3204{
3234 struct nfs4_unlockdata *calldata = data; 3205 struct nfs4_unlockdata *calldata = data;
3235 struct rpc_message msg = {
3236 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKU],
3237 .rpc_argp = &calldata->arg,
3238 .rpc_resp = &calldata->res,
3239 .rpc_cred = calldata->lsp->ls_state->owner->so_cred,
3240 };
3241 3206
3242 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0) 3207 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
3243 return; 3208 return;
@@ -3247,7 +3212,7 @@ static void nfs4_locku_prepare(struct rpc_task *task, void *data)
3247 return; 3212 return;
3248 } 3213 }
3249 calldata->timestamp = jiffies; 3214 calldata->timestamp = jiffies;
3250 rpc_call_setup(task, &msg, 0); 3215 rpc_call_start(task);
3251} 3216}
3252 3217
3253static const struct rpc_call_ops nfs4_locku_ops = { 3218static const struct rpc_call_ops nfs4_locku_ops = {
@@ -3262,6 +3227,16 @@ static struct rpc_task *nfs4_do_unlck(struct file_lock *fl,
3262 struct nfs_seqid *seqid) 3227 struct nfs_seqid *seqid)
3263{ 3228{
3264 struct nfs4_unlockdata *data; 3229 struct nfs4_unlockdata *data;
3230 struct rpc_message msg = {
3231 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKU],
3232 .rpc_cred = ctx->cred,
3233 };
3234 struct rpc_task_setup task_setup_data = {
3235 .rpc_client = NFS_CLIENT(lsp->ls_state->inode),
3236 .rpc_message = &msg,
3237 .callback_ops = &nfs4_locku_ops,
3238 .flags = RPC_TASK_ASYNC,
3239 };
3265 3240
3266 /* Ensure this is an unlock - when canceling a lock, the 3241 /* Ensure this is an unlock - when canceling a lock, the
3267 * canceled lock is passed in, and it won't be an unlock. 3242 * canceled lock is passed in, and it won't be an unlock.
@@ -3274,7 +3249,10 @@ static struct rpc_task *nfs4_do_unlck(struct file_lock *fl,
3274 return ERR_PTR(-ENOMEM); 3249 return ERR_PTR(-ENOMEM);
3275 } 3250 }
3276 3251
3277 return rpc_run_task(NFS_CLIENT(lsp->ls_state->inode), RPC_TASK_ASYNC, &nfs4_locku_ops, data); 3252 msg.rpc_argp = &data->arg,
3253 msg.rpc_resp = &data->res,
3254 task_setup_data.callback_data = data;
3255 return rpc_run_task(&task_setup_data);
3278} 3256}
3279 3257
3280static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *request) 3258static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *request)
@@ -3333,9 +3311,12 @@ static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl,
3333 3311
3334 p->arg.fh = NFS_FH(inode); 3312 p->arg.fh = NFS_FH(inode);
3335 p->arg.fl = &p->fl; 3313 p->arg.fl = &p->fl;
3314 p->arg.open_seqid = nfs_alloc_seqid(&lsp->ls_state->owner->so_seqid);
3315 if (p->arg.open_seqid == NULL)
3316 goto out_free;
3336 p->arg.lock_seqid = nfs_alloc_seqid(&lsp->ls_seqid); 3317 p->arg.lock_seqid = nfs_alloc_seqid(&lsp->ls_seqid);
3337 if (p->arg.lock_seqid == NULL) 3318 if (p->arg.lock_seqid == NULL)
3338 goto out_free; 3319 goto out_free_seqid;
3339 p->arg.lock_stateid = &lsp->ls_stateid; 3320 p->arg.lock_stateid = &lsp->ls_stateid;
3340 p->arg.lock_owner.clientid = server->nfs_client->cl_clientid; 3321 p->arg.lock_owner.clientid = server->nfs_client->cl_clientid;
3341 p->arg.lock_owner.id = lsp->ls_id.id; 3322 p->arg.lock_owner.id = lsp->ls_id.id;
@@ -3344,6 +3325,8 @@ static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl,
3344 p->ctx = get_nfs_open_context(ctx); 3325 p->ctx = get_nfs_open_context(ctx);
3345 memcpy(&p->fl, fl, sizeof(p->fl)); 3326 memcpy(&p->fl, fl, sizeof(p->fl));
3346 return p; 3327 return p;
3328out_free_seqid:
3329 nfs_free_seqid(p->arg.open_seqid);
3347out_free: 3330out_free:
3348 kfree(p); 3331 kfree(p);
3349 return NULL; 3332 return NULL;
@@ -3353,31 +3336,20 @@ static void nfs4_lock_prepare(struct rpc_task *task, void *calldata)
3353{ 3336{
3354 struct nfs4_lockdata *data = calldata; 3337 struct nfs4_lockdata *data = calldata;
3355 struct nfs4_state *state = data->lsp->ls_state; 3338 struct nfs4_state *state = data->lsp->ls_state;
3356 struct nfs4_state_owner *sp = state->owner;
3357 struct rpc_message msg = {
3358 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCK],
3359 .rpc_argp = &data->arg,
3360 .rpc_resp = &data->res,
3361 .rpc_cred = sp->so_cred,
3362 };
3363 3339
3340 dprintk("%s: begin!\n", __FUNCTION__);
3364 if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0) 3341 if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0)
3365 return; 3342 return;
3366 dprintk("%s: begin!\n", __FUNCTION__);
3367 /* Do we need to do an open_to_lock_owner? */ 3343 /* Do we need to do an open_to_lock_owner? */
3368 if (!(data->arg.lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED)) { 3344 if (!(data->arg.lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED)) {
3369 data->arg.open_seqid = nfs_alloc_seqid(&sp->so_seqid); 3345 if (nfs_wait_on_sequence(data->arg.open_seqid, task) != 0)
3370 if (data->arg.open_seqid == NULL) { 3346 return;
3371 data->rpc_status = -ENOMEM;
3372 task->tk_action = NULL;
3373 goto out;
3374 }
3375 data->arg.open_stateid = &state->stateid; 3347 data->arg.open_stateid = &state->stateid;
3376 data->arg.new_lock_owner = 1; 3348 data->arg.new_lock_owner = 1;
3377 } 3349 } else
3350 data->arg.new_lock_owner = 0;
3378 data->timestamp = jiffies; 3351 data->timestamp = jiffies;
3379 rpc_call_setup(task, &msg, 0); 3352 rpc_call_start(task);
3380out:
3381 dprintk("%s: done!, ret = %d\n", __FUNCTION__, data->rpc_status); 3353 dprintk("%s: done!, ret = %d\n", __FUNCTION__, data->rpc_status);
3382} 3354}
3383 3355
@@ -3413,8 +3385,7 @@ static void nfs4_lock_release(void *calldata)
3413 struct nfs4_lockdata *data = calldata; 3385 struct nfs4_lockdata *data = calldata;
3414 3386
3415 dprintk("%s: begin!\n", __FUNCTION__); 3387 dprintk("%s: begin!\n", __FUNCTION__);
3416 if (data->arg.open_seqid != NULL) 3388 nfs_free_seqid(data->arg.open_seqid);
3417 nfs_free_seqid(data->arg.open_seqid);
3418 if (data->cancelled != 0) { 3389 if (data->cancelled != 0) {
3419 struct rpc_task *task; 3390 struct rpc_task *task;
3420 task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp, 3391 task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp,
@@ -3440,6 +3411,16 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f
3440{ 3411{
3441 struct nfs4_lockdata *data; 3412 struct nfs4_lockdata *data;
3442 struct rpc_task *task; 3413 struct rpc_task *task;
3414 struct rpc_message msg = {
3415 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCK],
3416 .rpc_cred = state->owner->so_cred,
3417 };
3418 struct rpc_task_setup task_setup_data = {
3419 .rpc_client = NFS_CLIENT(state->inode),
3420 .rpc_message = &msg,
3421 .callback_ops = &nfs4_lock_ops,
3422 .flags = RPC_TASK_ASYNC,
3423 };
3443 int ret; 3424 int ret;
3444 3425
3445 dprintk("%s: begin!\n", __FUNCTION__); 3426 dprintk("%s: begin!\n", __FUNCTION__);
@@ -3451,8 +3432,10 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f
3451 data->arg.block = 1; 3432 data->arg.block = 1;
3452 if (reclaim != 0) 3433 if (reclaim != 0)
3453 data->arg.reclaim = 1; 3434 data->arg.reclaim = 1;
3454 task = rpc_run_task(NFS_CLIENT(state->inode), RPC_TASK_ASYNC, 3435 msg.rpc_argp = &data->arg,
3455 &nfs4_lock_ops, data); 3436 msg.rpc_resp = &data->res,
3437 task_setup_data.callback_data = data;
3438 task = rpc_run_task(&task_setup_data);
3456 if (IS_ERR(task)) 3439 if (IS_ERR(task))
3457 return PTR_ERR(task); 3440 return PTR_ERR(task);
3458 ret = nfs4_wait_for_completion_rpc_task(task); 3441 ret = nfs4_wait_for_completion_rpc_task(task);
@@ -3625,10 +3608,6 @@ int nfs4_setxattr(struct dentry *dentry, const char *key, const void *buf,
3625 if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0) 3608 if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0)
3626 return -EOPNOTSUPP; 3609 return -EOPNOTSUPP;
3627 3610
3628 if (!S_ISREG(inode->i_mode) &&
3629 (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX))
3630 return -EPERM;
3631
3632 return nfs4_proc_set_acl(inode, buf, buflen); 3611 return nfs4_proc_set_acl(inode, buf, buflen);
3633} 3612}
3634 3613