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.c286
1 files changed, 139 insertions, 147 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index c4faa43b36de..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}
@@ -715,19 +715,6 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state
715 return err; 715 return err;
716} 716}
717 717
718static void nfs4_open_confirm_prepare(struct rpc_task *task, void *calldata)
719{
720 struct nfs4_opendata *data = calldata;
721 struct rpc_message msg = {
722 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_CONFIRM],
723 .rpc_argp = &data->c_arg,
724 .rpc_resp = &data->c_res,
725 .rpc_cred = data->owner->so_cred,
726 };
727 data->timestamp = jiffies;
728 rpc_call_setup(task, &msg, 0);
729}
730
731static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata) 718static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata)
732{ 719{
733 struct nfs4_opendata *data = calldata; 720 struct nfs4_opendata *data = calldata;
@@ -738,10 +725,10 @@ static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata)
738 if (data->rpc_status == 0) { 725 if (data->rpc_status == 0) {
739 memcpy(data->o_res.stateid.data, data->c_res.stateid.data, 726 memcpy(data->o_res.stateid.data, data->c_res.stateid.data,
740 sizeof(data->o_res.stateid.data)); 727 sizeof(data->o_res.stateid.data));
728 nfs_confirm_seqid(&data->owner->so_seqid, 0);
741 renew_lease(data->o_res.server, data->timestamp); 729 renew_lease(data->o_res.server, data->timestamp);
742 data->rpc_done = 1; 730 data->rpc_done = 1;
743 } 731 }
744 nfs_confirm_seqid(&data->owner->so_seqid, data->rpc_status);
745 nfs_increment_open_seqid(data->rpc_status, data->c_arg.seqid); 732 nfs_increment_open_seqid(data->rpc_status, data->c_arg.seqid);
746} 733}
747 734
@@ -756,7 +743,6 @@ static void nfs4_open_confirm_release(void *calldata)
756 /* In case of error, no cleanup! */ 743 /* In case of error, no cleanup! */
757 if (!data->rpc_done) 744 if (!data->rpc_done)
758 goto out_free; 745 goto out_free;
759 nfs_confirm_seqid(&data->owner->so_seqid, 0);
760 state = nfs4_opendata_to_nfs4_state(data); 746 state = nfs4_opendata_to_nfs4_state(data);
761 if (!IS_ERR(state)) 747 if (!IS_ERR(state))
762 nfs4_close_state(&data->path, state, data->o_arg.open_flags); 748 nfs4_close_state(&data->path, state, data->o_arg.open_flags);
@@ -765,7 +751,6 @@ out_free:
765} 751}
766 752
767static const struct rpc_call_ops nfs4_open_confirm_ops = { 753static const struct rpc_call_ops nfs4_open_confirm_ops = {
768 .rpc_call_prepare = nfs4_open_confirm_prepare,
769 .rpc_call_done = nfs4_open_confirm_done, 754 .rpc_call_done = nfs4_open_confirm_done,
770 .rpc_release = nfs4_open_confirm_release, 755 .rpc_release = nfs4_open_confirm_release,
771}; 756};
@@ -777,12 +762,26 @@ static int _nfs4_proc_open_confirm(struct nfs4_opendata *data)
777{ 762{
778 struct nfs_server *server = NFS_SERVER(data->dir->d_inode); 763 struct nfs_server *server = NFS_SERVER(data->dir->d_inode);
779 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 };
780 int status; 778 int status;
781 779
782 kref_get(&data->kref); 780 kref_get(&data->kref);
783 data->rpc_done = 0; 781 data->rpc_done = 0;
784 data->rpc_status = 0; 782 data->rpc_status = 0;
785 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);
786 if (IS_ERR(task)) 785 if (IS_ERR(task))
787 return PTR_ERR(task); 786 return PTR_ERR(task);
788 status = nfs4_wait_for_completion_rpc_task(task); 787 status = nfs4_wait_for_completion_rpc_task(task);
@@ -799,13 +798,7 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
799{ 798{
800 struct nfs4_opendata *data = calldata; 799 struct nfs4_opendata *data = calldata;
801 struct nfs4_state_owner *sp = data->owner; 800 struct nfs4_state_owner *sp = data->owner;
802 struct rpc_message msg = { 801
803 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN],
804 .rpc_argp = &data->o_arg,
805 .rpc_resp = &data->o_res,
806 .rpc_cred = sp->so_cred,
807 };
808
809 if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0) 802 if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0)
810 return; 803 return;
811 /* 804 /*
@@ -830,11 +823,11 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
830 data->o_arg.id = sp->so_owner_id.id; 823 data->o_arg.id = sp->so_owner_id.id;
831 data->o_arg.clientid = sp->so_client->cl_clientid; 824 data->o_arg.clientid = sp->so_client->cl_clientid;
832 if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS) { 825 if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS) {
833 msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR]; 826 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR];
834 nfs_copy_fh(&data->o_res.fh, data->o_arg.fh); 827 nfs_copy_fh(&data->o_res.fh, data->o_arg.fh);
835 } 828 }
836 data->timestamp = jiffies; 829 data->timestamp = jiffies;
837 rpc_call_setup(task, &msg, 0); 830 rpc_call_start(task);
838 return; 831 return;
839out_no_action: 832out_no_action:
840 task->tk_action = NULL; 833 task->tk_action = NULL;
@@ -883,7 +876,6 @@ static void nfs4_open_release(void *calldata)
883 /* In case we need an open_confirm, no cleanup! */ 876 /* In case we need an open_confirm, no cleanup! */
884 if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM) 877 if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM)
885 goto out_free; 878 goto out_free;
886 nfs_confirm_seqid(&data->owner->so_seqid, 0);
887 state = nfs4_opendata_to_nfs4_state(data); 879 state = nfs4_opendata_to_nfs4_state(data);
888 if (!IS_ERR(state)) 880 if (!IS_ERR(state))
889 nfs4_close_state(&data->path, state, data->o_arg.open_flags); 881 nfs4_close_state(&data->path, state, data->o_arg.open_flags);
@@ -907,13 +899,26 @@ static int _nfs4_proc_open(struct nfs4_opendata *data)
907 struct nfs_openargs *o_arg = &data->o_arg; 899 struct nfs_openargs *o_arg = &data->o_arg;
908 struct nfs_openres *o_res = &data->o_res; 900 struct nfs_openres *o_res = &data->o_res;
909 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 };
910 int status; 915 int status;
911 916
912 kref_get(&data->kref); 917 kref_get(&data->kref);
913 data->rpc_done = 0; 918 data->rpc_done = 0;
914 data->rpc_status = 0; 919 data->rpc_status = 0;
915 data->cancelled = 0; 920 data->cancelled = 0;
916 task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_open_ops, data); 921 task = rpc_run_task(&task_setup_data);
917 if (IS_ERR(task)) 922 if (IS_ERR(task))
918 return PTR_ERR(task); 923 return PTR_ERR(task);
919 status = nfs4_wait_for_completion_rpc_task(task); 924 status = nfs4_wait_for_completion_rpc_task(task);
@@ -1243,12 +1248,6 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
1243{ 1248{
1244 struct nfs4_closedata *calldata = data; 1249 struct nfs4_closedata *calldata = data;
1245 struct nfs4_state *state = calldata->state; 1250 struct nfs4_state *state = calldata->state;
1246 struct rpc_message msg = {
1247 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE],
1248 .rpc_argp = &calldata->arg,
1249 .rpc_resp = &calldata->res,
1250 .rpc_cred = state->owner->so_cred,
1251 };
1252 int clear_rd, clear_wr, clear_rdwr; 1251 int clear_rd, clear_wr, clear_rdwr;
1253 1252
1254 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0) 1253 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
@@ -1275,14 +1274,14 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
1275 } 1274 }
1276 nfs_fattr_init(calldata->res.fattr); 1275 nfs_fattr_init(calldata->res.fattr);
1277 if (test_bit(NFS_O_RDONLY_STATE, &state->flags) != 0) { 1276 if (test_bit(NFS_O_RDONLY_STATE, &state->flags) != 0) {
1278 msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE]; 1277 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE];
1279 calldata->arg.open_flags = FMODE_READ; 1278 calldata->arg.open_flags = FMODE_READ;
1280 } else if (test_bit(NFS_O_WRONLY_STATE, &state->flags) != 0) { 1279 } else if (test_bit(NFS_O_WRONLY_STATE, &state->flags) != 0) {
1281 msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE]; 1280 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE];
1282 calldata->arg.open_flags = FMODE_WRITE; 1281 calldata->arg.open_flags = FMODE_WRITE;
1283 } 1282 }
1284 calldata->timestamp = jiffies; 1283 calldata->timestamp = jiffies;
1285 rpc_call_setup(task, &msg, 0); 1284 rpc_call_start(task);
1286} 1285}
1287 1286
1288static const struct rpc_call_ops nfs4_close_ops = { 1287static const struct rpc_call_ops nfs4_close_ops = {
@@ -1308,6 +1307,16 @@ int nfs4_do_close(struct path *path, struct nfs4_state *state, int wait)
1308 struct nfs4_closedata *calldata; 1307 struct nfs4_closedata *calldata;
1309 struct nfs4_state_owner *sp = state->owner; 1308 struct nfs4_state_owner *sp = state->owner;
1310 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 };
1311 int status = -ENOMEM; 1320 int status = -ENOMEM;
1312 1321
1313 calldata = kmalloc(sizeof(*calldata), GFP_KERNEL); 1322 calldata = kmalloc(sizeof(*calldata), GFP_KERNEL);
@@ -1327,7 +1336,10 @@ int nfs4_do_close(struct path *path, struct nfs4_state *state, int wait)
1327 calldata->path.mnt = mntget(path->mnt); 1336 calldata->path.mnt = mntget(path->mnt);
1328 calldata->path.dentry = dget(path->dentry); 1337 calldata->path.dentry = dget(path->dentry);
1329 1338
1330 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);
1331 if (IS_ERR(task)) 1343 if (IS_ERR(task))
1332 return PTR_ERR(task); 1344 return PTR_ERR(task);
1333 status = 0; 1345 status = 0;
@@ -2413,18 +2425,10 @@ static int nfs4_read_done(struct rpc_task *task, struct nfs_read_data *data)
2413 return 0; 2425 return 0;
2414} 2426}
2415 2427
2416static 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)
2417{ 2429{
2418 struct rpc_message msg = {
2419 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ],
2420 .rpc_argp = &data->args,
2421 .rpc_resp = &data->res,
2422 .rpc_cred = data->cred,
2423 };
2424
2425 data->timestamp = jiffies; 2430 data->timestamp = jiffies;
2426 2431 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
2427 rpc_call_setup(&data->task, &msg, 0);
2428} 2432}
2429 2433
2430static 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)
@@ -2442,33 +2446,15 @@ static int nfs4_write_done(struct rpc_task *task, struct nfs_write_data *data)
2442 return 0; 2446 return 0;
2443} 2447}
2444 2448
2445static 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)
2446{ 2450{
2447 struct rpc_message msg = { 2451 struct nfs_server *server = NFS_SERVER(data->inode);
2448 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE], 2452
2449 .rpc_argp = &data->args,
2450 .rpc_resp = &data->res,
2451 .rpc_cred = data->cred,
2452 };
2453 struct inode *inode = data->inode;
2454 struct nfs_server *server = NFS_SERVER(inode);
2455 int stable;
2456
2457 if (how & FLUSH_STABLE) {
2458 if (!NFS_I(inode)->ncommit)
2459 stable = NFS_FILE_SYNC;
2460 else
2461 stable = NFS_DATA_SYNC;
2462 } else
2463 stable = NFS_UNSTABLE;
2464 data->args.stable = stable;
2465 data->args.bitmask = server->attr_bitmask; 2453 data->args.bitmask = server->attr_bitmask;
2466 data->res.server = server; 2454 data->res.server = server;
2467
2468 data->timestamp = jiffies; 2455 data->timestamp = jiffies;
2469 2456
2470 /* Finalize the task. */ 2457 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE];
2471 rpc_call_setup(&data->task, &msg, 0);
2472} 2458}
2473 2459
2474static 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)
@@ -2483,20 +2469,13 @@ static int nfs4_commit_done(struct rpc_task *task, struct nfs_write_data *data)
2483 return 0; 2469 return 0;
2484} 2470}
2485 2471
2486static 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)
2487{ 2473{
2488 struct rpc_message msg = {
2489 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT],
2490 .rpc_argp = &data->args,
2491 .rpc_resp = &data->res,
2492 .rpc_cred = data->cred,
2493 };
2494 struct nfs_server *server = NFS_SERVER(data->inode); 2474 struct nfs_server *server = NFS_SERVER(data->inode);
2495 2475
2496 data->args.bitmask = server->attr_bitmask; 2476 data->args.bitmask = server->attr_bitmask;
2497 data->res.server = server; 2477 data->res.server = server;
2498 2478 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT];
2499 rpc_call_setup(&data->task, &msg, 0);
2500} 2479}
2501 2480
2502/* 2481/*
@@ -2899,14 +2878,20 @@ int nfs4_proc_setclientid(struct nfs_client *clp, u32 program, unsigned short po
2899 2878
2900 for(;;) { 2879 for(;;) {
2901 setclientid.sc_name_len = scnprintf(setclientid.sc_name, 2880 setclientid.sc_name_len = scnprintf(setclientid.sc_name,
2902 sizeof(setclientid.sc_name), "%s/%u.%u.%u.%u %s %u", 2881 sizeof(setclientid.sc_name), "%s/%s %s %s %u",
2903 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),
2904 cred->cr_ops->cr_name, 2887 cred->cr_ops->cr_name,
2905 clp->cl_id_uniquifier); 2888 clp->cl_id_uniquifier);
2906 setclientid.sc_netid_len = scnprintf(setclientid.sc_netid, 2889 setclientid.sc_netid_len = scnprintf(setclientid.sc_netid,
2907 sizeof(setclientid.sc_netid), "tcp"); 2890 sizeof(setclientid.sc_netid),
2891 rpc_peeraddr2str(clp->cl_rpcclient,
2892 RPC_DISPLAY_NETID));
2908 setclientid.sc_uaddr_len = scnprintf(setclientid.sc_uaddr, 2893 setclientid.sc_uaddr_len = scnprintf(setclientid.sc_uaddr,
2909 sizeof(setclientid.sc_uaddr), "%s.%d.%d", 2894 sizeof(setclientid.sc_uaddr), "%s.%u.%u",
2910 clp->cl_ipaddr, port >> 8, port & 255); 2895 clp->cl_ipaddr, port >> 8, port & 255);
2911 2896
2912 status = rpc_call_sync(clp->cl_rpcclient, &msg, 0); 2897 status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
@@ -2970,25 +2955,11 @@ struct nfs4_delegreturndata {
2970 struct nfs4_delegreturnres res; 2955 struct nfs4_delegreturnres res;
2971 struct nfs_fh fh; 2956 struct nfs_fh fh;
2972 nfs4_stateid stateid; 2957 nfs4_stateid stateid;
2973 struct rpc_cred *cred;
2974 unsigned long timestamp; 2958 unsigned long timestamp;
2975 struct nfs_fattr fattr; 2959 struct nfs_fattr fattr;
2976 int rpc_status; 2960 int rpc_status;
2977}; 2961};
2978 2962
2979static void nfs4_delegreturn_prepare(struct rpc_task *task, void *calldata)
2980{
2981 struct nfs4_delegreturndata *data = calldata;
2982 struct rpc_message msg = {
2983 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DELEGRETURN],
2984 .rpc_argp = &data->args,
2985 .rpc_resp = &data->res,
2986 .rpc_cred = data->cred,
2987 };
2988 nfs_fattr_init(data->res.fattr);
2989 rpc_call_setup(task, &msg, 0);
2990}
2991
2992static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata) 2963static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
2993{ 2964{
2994 struct nfs4_delegreturndata *data = calldata; 2965 struct nfs4_delegreturndata *data = calldata;
@@ -2999,24 +2970,30 @@ static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
2999 2970
3000static void nfs4_delegreturn_release(void *calldata) 2971static void nfs4_delegreturn_release(void *calldata)
3001{ 2972{
3002 struct nfs4_delegreturndata *data = calldata;
3003
3004 put_rpccred(data->cred);
3005 kfree(calldata); 2973 kfree(calldata);
3006} 2974}
3007 2975
3008static const struct rpc_call_ops nfs4_delegreturn_ops = { 2976static const struct rpc_call_ops nfs4_delegreturn_ops = {
3009 .rpc_call_prepare = nfs4_delegreturn_prepare,
3010 .rpc_call_done = nfs4_delegreturn_done, 2977 .rpc_call_done = nfs4_delegreturn_done,
3011 .rpc_release = nfs4_delegreturn_release, 2978 .rpc_release = nfs4_delegreturn_release,
3012}; 2979};
3013 2980
3014static 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)
3015{ 2982{
3016 struct nfs4_delegreturndata *data; 2983 struct nfs4_delegreturndata *data;
3017 struct nfs_server *server = NFS_SERVER(inode); 2984 struct nfs_server *server = NFS_SERVER(inode);
3018 struct rpc_task *task; 2985 struct rpc_task *task;
3019 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;
3020 2997
3021 data = kmalloc(sizeof(*data), GFP_KERNEL); 2998 data = kmalloc(sizeof(*data), GFP_KERNEL);
3022 if (data == NULL) 2999 if (data == NULL)
@@ -3028,30 +3005,37 @@ static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, co
3028 memcpy(&data->stateid, stateid, sizeof(data->stateid)); 3005 memcpy(&data->stateid, stateid, sizeof(data->stateid));
3029 data->res.fattr = &data->fattr; 3006 data->res.fattr = &data->fattr;
3030 data->res.server = server; 3007 data->res.server = server;
3031 data->cred = get_rpccred(cred); 3008 nfs_fattr_init(data->res.fattr);
3032 data->timestamp = jiffies; 3009 data->timestamp = jiffies;
3033 data->rpc_status = 0; 3010 data->rpc_status = 0;
3034 3011
3035 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);
3036 if (IS_ERR(task)) 3016 if (IS_ERR(task))
3037 return PTR_ERR(task); 3017 return PTR_ERR(task);
3018 if (!issync)
3019 goto out;
3038 status = nfs4_wait_for_completion_rpc_task(task); 3020 status = nfs4_wait_for_completion_rpc_task(task);
3039 if (status == 0) { 3021 if (status != 0)
3040 status = data->rpc_status; 3022 goto out;
3041 if (status == 0) 3023 status = data->rpc_status;
3042 nfs_refresh_inode(inode, &data->fattr); 3024 if (status != 0)
3043 } 3025 goto out;
3026 nfs_refresh_inode(inode, &data->fattr);
3027out:
3044 rpc_put_task(task); 3028 rpc_put_task(task);
3045 return status; 3029 return status;
3046} 3030}
3047 3031
3048int 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)
3049{ 3033{
3050 struct nfs_server *server = NFS_SERVER(inode); 3034 struct nfs_server *server = NFS_SERVER(inode);
3051 struct nfs4_exception exception = { }; 3035 struct nfs4_exception exception = { };
3052 int err; 3036 int err;
3053 do { 3037 do {
3054 err = _nfs4_proc_delegreturn(inode, cred, stateid); 3038 err = _nfs4_proc_delegreturn(inode, cred, stateid, issync);
3055 switch (err) { 3039 switch (err) {
3056 case -NFS4ERR_STALE_STATEID: 3040 case -NFS4ERR_STALE_STATEID:
3057 case -NFS4ERR_EXPIRED: 3041 case -NFS4ERR_EXPIRED:
@@ -3219,12 +3203,6 @@ static void nfs4_locku_done(struct rpc_task *task, void *data)
3219static void nfs4_locku_prepare(struct rpc_task *task, void *data) 3203static void nfs4_locku_prepare(struct rpc_task *task, void *data)
3220{ 3204{
3221 struct nfs4_unlockdata *calldata = data; 3205 struct nfs4_unlockdata *calldata = data;
3222 struct rpc_message msg = {
3223 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKU],
3224 .rpc_argp = &calldata->arg,
3225 .rpc_resp = &calldata->res,
3226 .rpc_cred = calldata->lsp->ls_state->owner->so_cred,
3227 };
3228 3206
3229 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0) 3207 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
3230 return; 3208 return;
@@ -3234,7 +3212,7 @@ static void nfs4_locku_prepare(struct rpc_task *task, void *data)
3234 return; 3212 return;
3235 } 3213 }
3236 calldata->timestamp = jiffies; 3214 calldata->timestamp = jiffies;
3237 rpc_call_setup(task, &msg, 0); 3215 rpc_call_start(task);
3238} 3216}
3239 3217
3240static const struct rpc_call_ops nfs4_locku_ops = { 3218static const struct rpc_call_ops nfs4_locku_ops = {
@@ -3249,6 +3227,16 @@ static struct rpc_task *nfs4_do_unlck(struct file_lock *fl,
3249 struct nfs_seqid *seqid) 3227 struct nfs_seqid *seqid)
3250{ 3228{
3251 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 };
3252 3240
3253 /* Ensure this is an unlock - when canceling a lock, the 3241 /* Ensure this is an unlock - when canceling a lock, the
3254 * 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.
@@ -3261,7 +3249,10 @@ static struct rpc_task *nfs4_do_unlck(struct file_lock *fl,
3261 return ERR_PTR(-ENOMEM); 3249 return ERR_PTR(-ENOMEM);
3262 } 3250 }
3263 3251
3264 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);
3265} 3256}
3266 3257
3267static 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)
@@ -3320,9 +3311,12 @@ static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl,
3320 3311
3321 p->arg.fh = NFS_FH(inode); 3312 p->arg.fh = NFS_FH(inode);
3322 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;
3323 p->arg.lock_seqid = nfs_alloc_seqid(&lsp->ls_seqid); 3317 p->arg.lock_seqid = nfs_alloc_seqid(&lsp->ls_seqid);
3324 if (p->arg.lock_seqid == NULL) 3318 if (p->arg.lock_seqid == NULL)
3325 goto out_free; 3319 goto out_free_seqid;
3326 p->arg.lock_stateid = &lsp->ls_stateid; 3320 p->arg.lock_stateid = &lsp->ls_stateid;
3327 p->arg.lock_owner.clientid = server->nfs_client->cl_clientid; 3321 p->arg.lock_owner.clientid = server->nfs_client->cl_clientid;
3328 p->arg.lock_owner.id = lsp->ls_id.id; 3322 p->arg.lock_owner.id = lsp->ls_id.id;
@@ -3331,6 +3325,8 @@ static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl,
3331 p->ctx = get_nfs_open_context(ctx); 3325 p->ctx = get_nfs_open_context(ctx);
3332 memcpy(&p->fl, fl, sizeof(p->fl)); 3326 memcpy(&p->fl, fl, sizeof(p->fl));
3333 return p; 3327 return p;
3328out_free_seqid:
3329 nfs_free_seqid(p->arg.open_seqid);
3334out_free: 3330out_free:
3335 kfree(p); 3331 kfree(p);
3336 return NULL; 3332 return NULL;
@@ -3340,31 +3336,20 @@ static void nfs4_lock_prepare(struct rpc_task *task, void *calldata)
3340{ 3336{
3341 struct nfs4_lockdata *data = calldata; 3337 struct nfs4_lockdata *data = calldata;
3342 struct nfs4_state *state = data->lsp->ls_state; 3338 struct nfs4_state *state = data->lsp->ls_state;
3343 struct nfs4_state_owner *sp = state->owner;
3344 struct rpc_message msg = {
3345 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCK],
3346 .rpc_argp = &data->arg,
3347 .rpc_resp = &data->res,
3348 .rpc_cred = sp->so_cred,
3349 };
3350 3339
3340 dprintk("%s: begin!\n", __FUNCTION__);
3351 if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0) 3341 if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0)
3352 return; 3342 return;
3353 dprintk("%s: begin!\n", __FUNCTION__);
3354 /* Do we need to do an open_to_lock_owner? */ 3343 /* Do we need to do an open_to_lock_owner? */
3355 if (!(data->arg.lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED)) { 3344 if (!(data->arg.lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED)) {
3356 data->arg.open_seqid = nfs_alloc_seqid(&sp->so_seqid); 3345 if (nfs_wait_on_sequence(data->arg.open_seqid, task) != 0)
3357 if (data->arg.open_seqid == NULL) { 3346 return;
3358 data->rpc_status = -ENOMEM;
3359 task->tk_action = NULL;
3360 goto out;
3361 }
3362 data->arg.open_stateid = &state->stateid; 3347 data->arg.open_stateid = &state->stateid;
3363 data->arg.new_lock_owner = 1; 3348 data->arg.new_lock_owner = 1;
3364 } 3349 } else
3350 data->arg.new_lock_owner = 0;
3365 data->timestamp = jiffies; 3351 data->timestamp = jiffies;
3366 rpc_call_setup(task, &msg, 0); 3352 rpc_call_start(task);
3367out:
3368 dprintk("%s: done!, ret = %d\n", __FUNCTION__, data->rpc_status); 3353 dprintk("%s: done!, ret = %d\n", __FUNCTION__, data->rpc_status);
3369} 3354}
3370 3355
@@ -3400,8 +3385,7 @@ static void nfs4_lock_release(void *calldata)
3400 struct nfs4_lockdata *data = calldata; 3385 struct nfs4_lockdata *data = calldata;
3401 3386
3402 dprintk("%s: begin!\n", __FUNCTION__); 3387 dprintk("%s: begin!\n", __FUNCTION__);
3403 if (data->arg.open_seqid != NULL) 3388 nfs_free_seqid(data->arg.open_seqid);
3404 nfs_free_seqid(data->arg.open_seqid);
3405 if (data->cancelled != 0) { 3389 if (data->cancelled != 0) {
3406 struct rpc_task *task; 3390 struct rpc_task *task;
3407 task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp, 3391 task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp,
@@ -3427,6 +3411,16 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f
3427{ 3411{
3428 struct nfs4_lockdata *data; 3412 struct nfs4_lockdata *data;
3429 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 };
3430 int ret; 3424 int ret;
3431 3425
3432 dprintk("%s: begin!\n", __FUNCTION__); 3426 dprintk("%s: begin!\n", __FUNCTION__);
@@ -3438,8 +3432,10 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f
3438 data->arg.block = 1; 3432 data->arg.block = 1;
3439 if (reclaim != 0) 3433 if (reclaim != 0)
3440 data->arg.reclaim = 1; 3434 data->arg.reclaim = 1;
3441 task = rpc_run_task(NFS_CLIENT(state->inode), RPC_TASK_ASYNC, 3435 msg.rpc_argp = &data->arg,
3442 &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);
3443 if (IS_ERR(task)) 3439 if (IS_ERR(task))
3444 return PTR_ERR(task); 3440 return PTR_ERR(task);
3445 ret = nfs4_wait_for_completion_rpc_task(task); 3441 ret = nfs4_wait_for_completion_rpc_task(task);
@@ -3612,10 +3608,6 @@ int nfs4_setxattr(struct dentry *dentry, const char *key, const void *buf,
3612 if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0) 3608 if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0)
3613 return -EOPNOTSUPP; 3609 return -EOPNOTSUPP;
3614 3610
3615 if (!S_ISREG(inode->i_mode) &&
3616 (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX))
3617 return -EPERM;
3618
3619 return nfs4_proc_set_acl(inode, buf, buflen); 3611 return nfs4_proc_set_acl(inode, buf, buflen);
3620} 3612}
3621 3613