diff options
Diffstat (limited to 'fs/nfs/nfs4proc.c')
-rw-r--r-- | fs/nfs/nfs4proc.c | 313 |
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 | ||
317 | static int nfs4_wait_for_completion_rpc_task(struct rpc_task *task) | 317 | static 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 | ||
721 | static 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 | |||
734 | static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata) | 718 | static 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 | ||
770 | static const struct rpc_call_ops nfs4_open_confirm_ops = { | 753 | static 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; |
842 | out_no_action: | 832 | out_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 | ||
1291 | static const struct rpc_call_ops nfs4_close_ops = { | 1287 | static 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 | ||
2419 | static void nfs4_proc_read_setup(struct nfs_read_data *data) | 2428 | static 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 | ||
2433 | static int nfs4_write_done(struct rpc_task *task, struct nfs_write_data *data) | 2434 | static 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 | ||
2448 | static void nfs4_proc_write_setup(struct nfs_write_data *data, int how) | 2449 | static 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 | ||
2477 | static int nfs4_commit_done(struct rpc_task *task, struct nfs_write_data *data) | 2460 | static 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 | ||
2489 | static void nfs4_proc_commit_setup(struct nfs_write_data *data, int how) | 2472 | static 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 | ||
2809 | static int nfs4_wait_bit_interruptible(void *word) | 2785 | static 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 | ||
2817 | static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs_client *clp) | 2793 | static 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 | ||
2836 | static int nfs4_delay(struct rpc_clnt *clnt, long *timeout) | 2808 | static 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 | ||
2992 | static 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 | |||
3005 | static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata) | 2963 | static 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 | ||
3013 | static void nfs4_delegreturn_release(void *calldata) | 2971 | static 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 | ||
3021 | static const struct rpc_call_ops nfs4_delegreturn_ops = { | 2976 | static 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 | ||
3027 | static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid) | 2981 | static 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); | ||
3027 | out: | ||
3057 | rpc_put_task(task); | 3028 | rpc_put_task(task); |
3058 | return status; | 3029 | return status; |
3059 | } | 3030 | } |
3060 | 3031 | ||
3061 | int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid) | 3032 | int 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 | |||
3085 | static unsigned long | 3056 | static unsigned long |
3086 | nfs4_set_lock_task_retry(unsigned long timeout) | 3057 | nfs4_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) | |||
3232 | static void nfs4_locku_prepare(struct rpc_task *task, void *data) | 3203 | static 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 | ||
3253 | static const struct rpc_call_ops nfs4_locku_ops = { | 3218 | static 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 | ||
3280 | static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *request) | 3258 | static 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; |
3328 | out_free_seqid: | ||
3329 | nfs_free_seqid(p->arg.open_seqid); | ||
3347 | out_free: | 3330 | out_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); |
3380 | out: | ||
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 | ||