diff options
| -rw-r--r-- | fs/nfs/write.c | 60 |
1 files changed, 33 insertions, 27 deletions
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 92b4a6614fd3..bf672faa4885 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c | |||
| @@ -1293,32 +1293,49 @@ static void nfs_commitdata_release(void *data) | |||
| 1293 | nfs_commit_free(wdata); | 1293 | nfs_commit_free(wdata); |
| 1294 | } | 1294 | } |
| 1295 | 1295 | ||
| 1296 | /* | 1296 | static int nfs_initiate_commit(struct nfs_write_data *data, struct rpc_clnt *clnt, |
| 1297 | * Set up the argument/result storage required for the RPC call. | 1297 | const struct rpc_call_ops *call_ops, |
| 1298 | */ | 1298 | int how) |
| 1299 | static int nfs_commit_rpcsetup(struct list_head *head, | ||
| 1300 | struct nfs_write_data *data, | ||
| 1301 | int how) | ||
| 1302 | { | 1299 | { |
| 1303 | struct nfs_page *first = nfs_list_entry(head->next); | ||
| 1304 | struct inode *inode = first->wb_context->path.dentry->d_inode; | ||
| 1305 | int priority = flush_task_priority(how); | ||
| 1306 | struct rpc_task *task; | 1300 | struct rpc_task *task; |
| 1301 | int priority = flush_task_priority(how); | ||
| 1307 | struct rpc_message msg = { | 1302 | struct rpc_message msg = { |
| 1308 | .rpc_argp = &data->args, | 1303 | .rpc_argp = &data->args, |
| 1309 | .rpc_resp = &data->res, | 1304 | .rpc_resp = &data->res, |
| 1310 | .rpc_cred = first->wb_context->cred, | 1305 | .rpc_cred = data->cred, |
| 1311 | }; | 1306 | }; |
| 1312 | struct rpc_task_setup task_setup_data = { | 1307 | struct rpc_task_setup task_setup_data = { |
| 1313 | .task = &data->task, | 1308 | .task = &data->task, |
| 1314 | .rpc_client = NFS_CLIENT(inode), | 1309 | .rpc_client = clnt, |
| 1315 | .rpc_message = &msg, | 1310 | .rpc_message = &msg, |
| 1316 | .callback_ops = &nfs_commit_ops, | 1311 | .callback_ops = call_ops, |
| 1317 | .callback_data = data, | 1312 | .callback_data = data, |
| 1318 | .workqueue = nfsiod_workqueue, | 1313 | .workqueue = nfsiod_workqueue, |
| 1319 | .flags = RPC_TASK_ASYNC, | 1314 | .flags = RPC_TASK_ASYNC, |
| 1320 | .priority = priority, | 1315 | .priority = priority, |
| 1321 | }; | 1316 | }; |
| 1317 | /* Set up the initial task struct. */ | ||
| 1318 | NFS_PROTO(data->inode)->commit_setup(data, &msg); | ||
| 1319 | |||
| 1320 | dprintk("NFS: %5u initiated commit call\n", data->task.tk_pid); | ||
| 1321 | |||
| 1322 | task = rpc_run_task(&task_setup_data); | ||
| 1323 | if (IS_ERR(task)) | ||
| 1324 | return PTR_ERR(task); | ||
| 1325 | if (how & FLUSH_SYNC) | ||
| 1326 | rpc_wait_for_completion_task(task); | ||
| 1327 | rpc_put_task(task); | ||
| 1328 | return 0; | ||
| 1329 | } | ||
| 1330 | |||
| 1331 | /* | ||
| 1332 | * Set up the argument/result storage required for the RPC call. | ||
| 1333 | */ | ||
| 1334 | static void nfs_init_commit(struct nfs_write_data *data, | ||
| 1335 | struct list_head *head) | ||
| 1336 | { | ||
| 1337 | struct nfs_page *first = nfs_list_entry(head->next); | ||
| 1338 | struct inode *inode = first->wb_context->path.dentry->d_inode; | ||
| 1322 | 1339 | ||
| 1323 | /* Set up the RPC argument and reply structs | 1340 | /* Set up the RPC argument and reply structs |
| 1324 | * NB: take care not to mess about with data->commit et al. */ | 1341 | * NB: take care not to mess about with data->commit et al. */ |
| @@ -1326,7 +1343,8 @@ static int nfs_commit_rpcsetup(struct list_head *head, | |||
| 1326 | list_splice_init(head, &data->pages); | 1343 | list_splice_init(head, &data->pages); |
| 1327 | 1344 | ||
| 1328 | data->inode = inode; | 1345 | data->inode = inode; |
| 1329 | data->cred = msg.rpc_cred; | 1346 | data->cred = first->wb_context->cred; |
| 1347 | data->mds_ops = &nfs_commit_ops; | ||
| 1330 | 1348 | ||
| 1331 | data->args.fh = NFS_FH(data->inode); | 1349 | data->args.fh = NFS_FH(data->inode); |
| 1332 | /* Note: we always request a commit of the entire inode */ | 1350 | /* Note: we always request a commit of the entire inode */ |
| @@ -1337,19 +1355,6 @@ static int nfs_commit_rpcsetup(struct list_head *head, | |||
| 1337 | data->res.fattr = &data->fattr; | 1355 | data->res.fattr = &data->fattr; |
| 1338 | data->res.verf = &data->verf; | 1356 | data->res.verf = &data->verf; |
| 1339 | nfs_fattr_init(&data->fattr); | 1357 | nfs_fattr_init(&data->fattr); |
| 1340 | |||
| 1341 | /* Set up the initial task struct. */ | ||
| 1342 | NFS_PROTO(inode)->commit_setup(data, &msg); | ||
| 1343 | |||
| 1344 | dprintk("NFS: %5u initiated commit call\n", data->task.tk_pid); | ||
| 1345 | |||
| 1346 | task = rpc_run_task(&task_setup_data); | ||
| 1347 | if (IS_ERR(task)) | ||
| 1348 | return PTR_ERR(task); | ||
| 1349 | if (how & FLUSH_SYNC) | ||
| 1350 | rpc_wait_for_completion_task(task); | ||
| 1351 | rpc_put_task(task); | ||
| 1352 | return 0; | ||
| 1353 | } | 1358 | } |
| 1354 | 1359 | ||
| 1355 | /* | 1360 | /* |
| @@ -1367,7 +1372,8 @@ nfs_commit_list(struct inode *inode, struct list_head *head, int how) | |||
| 1367 | goto out_bad; | 1372 | goto out_bad; |
| 1368 | 1373 | ||
| 1369 | /* Set up the argument struct */ | 1374 | /* Set up the argument struct */ |
| 1370 | return nfs_commit_rpcsetup(head, data, how); | 1375 | nfs_init_commit(data, head); |
| 1376 | return nfs_initiate_commit(data, NFS_CLIENT(inode), data->mds_ops, how); | ||
| 1371 | out_bad: | 1377 | out_bad: |
| 1372 | while (!list_empty(head)) { | 1378 | while (!list_empty(head)) { |
| 1373 | req = nfs_list_entry(head->next); | 1379 | req = nfs_list_entry(head->next); |
