diff options
Diffstat (limited to 'fs/nfs/nfs4proc.c')
-rw-r--r-- | fs/nfs/nfs4proc.c | 54 |
1 files changed, 13 insertions, 41 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index f1ff4fa6cce5..ef4dc315ecc2 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -2388,32 +2388,23 @@ nfs4_proc_read_setup(struct nfs_read_data *data) | |||
2388 | rpc_call_setup(task, &msg, 0); | 2388 | rpc_call_setup(task, &msg, 0); |
2389 | } | 2389 | } |
2390 | 2390 | ||
2391 | static void nfs4_write_done(struct rpc_task *task, void *calldata) | 2391 | static int nfs4_write_done(struct rpc_task *task, struct nfs_write_data *data) |
2392 | { | 2392 | { |
2393 | struct nfs_write_data *data = calldata; | ||
2394 | struct inode *inode = data->inode; | 2393 | struct inode *inode = data->inode; |
2395 | 2394 | ||
2396 | if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) { | 2395 | if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) { |
2397 | rpc_restart_call(task); | 2396 | rpc_restart_call(task); |
2398 | return; | 2397 | return -EAGAIN; |
2399 | } | 2398 | } |
2400 | if (task->tk_status >= 0) { | 2399 | if (task->tk_status >= 0) { |
2401 | renew_lease(NFS_SERVER(inode), data->timestamp); | 2400 | renew_lease(NFS_SERVER(inode), data->timestamp); |
2402 | nfs_post_op_update_inode(inode, data->res.fattr); | 2401 | nfs_post_op_update_inode(inode, data->res.fattr); |
2403 | } | 2402 | } |
2404 | /* Call back common NFS writeback processing */ | 2403 | return 0; |
2405 | nfs_writeback_done(task, calldata); | ||
2406 | } | 2404 | } |
2407 | 2405 | ||
2408 | static const struct rpc_call_ops nfs4_write_ops = { | 2406 | static void nfs4_proc_write_setup(struct nfs_write_data *data, int how) |
2409 | .rpc_call_done = nfs4_write_done, | ||
2410 | .rpc_release = nfs_writedata_release, | ||
2411 | }; | ||
2412 | |||
2413 | static void | ||
2414 | nfs4_proc_write_setup(struct nfs_write_data *data, int how) | ||
2415 | { | 2407 | { |
2416 | struct rpc_task *task = &data->task; | ||
2417 | struct rpc_message msg = { | 2408 | struct rpc_message msg = { |
2418 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE], | 2409 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE], |
2419 | .rpc_argp = &data->args, | 2410 | .rpc_argp = &data->args, |
@@ -2423,7 +2414,6 @@ nfs4_proc_write_setup(struct nfs_write_data *data, int how) | |||
2423 | struct inode *inode = data->inode; | 2414 | struct inode *inode = data->inode; |
2424 | struct nfs_server *server = NFS_SERVER(inode); | 2415 | struct nfs_server *server = NFS_SERVER(inode); |
2425 | int stable; | 2416 | int stable; |
2426 | int flags; | ||
2427 | 2417 | ||
2428 | if (how & FLUSH_STABLE) { | 2418 | if (how & FLUSH_STABLE) { |
2429 | if (!NFS_I(inode)->ncommit) | 2419 | if (!NFS_I(inode)->ncommit) |
@@ -2438,57 +2428,37 @@ nfs4_proc_write_setup(struct nfs_write_data *data, int how) | |||
2438 | 2428 | ||
2439 | data->timestamp = jiffies; | 2429 | data->timestamp = jiffies; |
2440 | 2430 | ||
2441 | /* Set the initial flags for the task. */ | ||
2442 | flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC; | ||
2443 | |||
2444 | /* Finalize the task. */ | 2431 | /* Finalize the task. */ |
2445 | rpc_init_task(task, NFS_CLIENT(inode), flags, &nfs4_write_ops, data); | 2432 | rpc_call_setup(&data->task, &msg, 0); |
2446 | rpc_call_setup(task, &msg, 0); | ||
2447 | } | 2433 | } |
2448 | 2434 | ||
2449 | static void nfs4_commit_done(struct rpc_task *task, void *calldata) | 2435 | static int nfs4_commit_done(struct rpc_task *task, struct nfs_write_data *data) |
2450 | { | 2436 | { |
2451 | struct nfs_write_data *data = calldata; | ||
2452 | struct inode *inode = data->inode; | 2437 | struct inode *inode = data->inode; |
2453 | 2438 | ||
2454 | if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) { | 2439 | if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) { |
2455 | rpc_restart_call(task); | 2440 | rpc_restart_call(task); |
2456 | return; | 2441 | return -EAGAIN; |
2457 | } | 2442 | } |
2458 | if (task->tk_status >= 0) | 2443 | if (task->tk_status >= 0) |
2459 | nfs_post_op_update_inode(inode, data->res.fattr); | 2444 | nfs_post_op_update_inode(inode, data->res.fattr); |
2460 | /* Call back common NFS writeback processing */ | 2445 | return 0; |
2461 | nfs_commit_done(task, calldata); | ||
2462 | } | 2446 | } |
2463 | 2447 | ||
2464 | static const struct rpc_call_ops nfs4_commit_ops = { | 2448 | static void nfs4_proc_commit_setup(struct nfs_write_data *data, int how) |
2465 | .rpc_call_done = nfs4_commit_done, | ||
2466 | .rpc_release = nfs_commit_release, | ||
2467 | }; | ||
2468 | |||
2469 | static void | ||
2470 | nfs4_proc_commit_setup(struct nfs_write_data *data, int how) | ||
2471 | { | 2449 | { |
2472 | struct rpc_task *task = &data->task; | ||
2473 | struct rpc_message msg = { | 2450 | struct rpc_message msg = { |
2474 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT], | 2451 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT], |
2475 | .rpc_argp = &data->args, | 2452 | .rpc_argp = &data->args, |
2476 | .rpc_resp = &data->res, | 2453 | .rpc_resp = &data->res, |
2477 | .rpc_cred = data->cred, | 2454 | .rpc_cred = data->cred, |
2478 | }; | 2455 | }; |
2479 | struct inode *inode = data->inode; | 2456 | struct nfs_server *server = NFS_SERVER(data->inode); |
2480 | struct nfs_server *server = NFS_SERVER(inode); | ||
2481 | int flags; | ||
2482 | 2457 | ||
2483 | data->args.bitmask = server->attr_bitmask; | 2458 | data->args.bitmask = server->attr_bitmask; |
2484 | data->res.server = server; | 2459 | data->res.server = server; |
2485 | 2460 | ||
2486 | /* Set the initial flags for the task. */ | 2461 | rpc_call_setup(&data->task, &msg, 0); |
2487 | flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC; | ||
2488 | |||
2489 | /* Finalize the task. */ | ||
2490 | rpc_init_task(task, NFS_CLIENT(inode), flags, &nfs4_commit_ops, data); | ||
2491 | rpc_call_setup(task, &msg, 0); | ||
2492 | } | 2462 | } |
2493 | 2463 | ||
2494 | /* | 2464 | /* |
@@ -3648,7 +3618,9 @@ struct nfs_rpc_ops nfs_v4_clientops = { | |||
3648 | .decode_dirent = nfs4_decode_dirent, | 3618 | .decode_dirent = nfs4_decode_dirent, |
3649 | .read_setup = nfs4_proc_read_setup, | 3619 | .read_setup = nfs4_proc_read_setup, |
3650 | .write_setup = nfs4_proc_write_setup, | 3620 | .write_setup = nfs4_proc_write_setup, |
3621 | .write_done = nfs4_write_done, | ||
3651 | .commit_setup = nfs4_proc_commit_setup, | 3622 | .commit_setup = nfs4_proc_commit_setup, |
3623 | .commit_done = nfs4_commit_done, | ||
3652 | .file_open = nfs_open, | 3624 | .file_open = nfs_open, |
3653 | .file_release = nfs_release, | 3625 | .file_release = nfs_release, |
3654 | .lock = nfs4_proc_lock, | 3626 | .lock = nfs4_proc_lock, |