aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/write.c
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
commitada47b5fe13d89735805b566185f4885f5a3f750 (patch)
tree644b88f8a71896307d71438e9b3af49126ffb22b /fs/nfs/write.c
parent43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff)
parent3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff)
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'fs/nfs/write.c')
-rw-r--r--fs/nfs/write.c330
1 files changed, 132 insertions, 198 deletions
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 53eb26c16b50..3aea3ca98ab7 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -178,7 +178,7 @@ static int wb_priority(struct writeback_control *wbc)
178{ 178{
179 if (wbc->for_reclaim) 179 if (wbc->for_reclaim)
180 return FLUSH_HIGHPRI | FLUSH_STABLE; 180 return FLUSH_HIGHPRI | FLUSH_STABLE;
181 if (wbc->for_kupdate) 181 if (wbc->for_kupdate || wbc->for_background)
182 return FLUSH_LOWPRI; 182 return FLUSH_LOWPRI;
183 return 0; 183 return 0;
184} 184}
@@ -201,6 +201,7 @@ static int nfs_set_page_writeback(struct page *page)
201 struct inode *inode = page->mapping->host; 201 struct inode *inode = page->mapping->host;
202 struct nfs_server *nfss = NFS_SERVER(inode); 202 struct nfs_server *nfss = NFS_SERVER(inode);
203 203
204 page_cache_get(page);
204 if (atomic_long_inc_return(&nfss->writeback) > 205 if (atomic_long_inc_return(&nfss->writeback) >
205 NFS_CONGESTION_ON_THRESH) { 206 NFS_CONGESTION_ON_THRESH) {
206 set_bdi_congested(&nfss->backing_dev_info, 207 set_bdi_congested(&nfss->backing_dev_info,
@@ -216,6 +217,7 @@ static void nfs_end_page_writeback(struct page *page)
216 struct nfs_server *nfss = NFS_SERVER(inode); 217 struct nfs_server *nfss = NFS_SERVER(inode);
217 218
218 end_page_writeback(page); 219 end_page_writeback(page);
220 page_cache_release(page);
219 if (atomic_long_dec_return(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH) 221 if (atomic_long_dec_return(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH)
220 clear_bdi_congested(&nfss->backing_dev_info, BLK_RW_ASYNC); 222 clear_bdi_congested(&nfss->backing_dev_info, BLK_RW_ASYNC);
221} 223}
@@ -421,6 +423,7 @@ static void
421nfs_mark_request_dirty(struct nfs_page *req) 423nfs_mark_request_dirty(struct nfs_page *req)
422{ 424{
423 __set_page_dirty_nobuffers(req->wb_page); 425 __set_page_dirty_nobuffers(req->wb_page);
426 __mark_inode_dirty(req->wb_page->mapping->host, I_DIRTY_DATASYNC);
424} 427}
425 428
426#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) 429#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
@@ -438,6 +441,7 @@ nfs_mark_request_commit(struct nfs_page *req)
438 radix_tree_tag_set(&nfsi->nfs_page_tree, 441 radix_tree_tag_set(&nfsi->nfs_page_tree,
439 req->wb_index, 442 req->wb_index,
440 NFS_PAGE_TAG_COMMIT); 443 NFS_PAGE_TAG_COMMIT);
444 nfsi->ncommit++;
441 spin_unlock(&inode->i_lock); 445 spin_unlock(&inode->i_lock);
442 inc_zone_page_state(req->wb_page, NR_UNSTABLE_NFS); 446 inc_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
443 inc_bdi_stat(req->wb_page->mapping->backing_dev_info, BDI_RECLAIMABLE); 447 inc_bdi_stat(req->wb_page->mapping->backing_dev_info, BDI_RECLAIMABLE);
@@ -501,57 +505,6 @@ int nfs_reschedule_unstable_write(struct nfs_page *req)
501} 505}
502#endif 506#endif
503 507
504/*
505 * Wait for a request to complete.
506 *
507 * Interruptible by fatal signals only.
508 */
509static int nfs_wait_on_requests_locked(struct inode *inode, pgoff_t idx_start, unsigned int npages)
510{
511 struct nfs_inode *nfsi = NFS_I(inode);
512 struct nfs_page *req;
513 pgoff_t idx_end, next;
514 unsigned int res = 0;
515 int error;
516
517 if (npages == 0)
518 idx_end = ~0;
519 else
520 idx_end = idx_start + npages - 1;
521
522 next = idx_start;
523 while (radix_tree_gang_lookup_tag(&nfsi->nfs_page_tree, (void **)&req, next, 1, NFS_PAGE_TAG_LOCKED)) {
524 if (req->wb_index > idx_end)
525 break;
526
527 next = req->wb_index + 1;
528 BUG_ON(!NFS_WBACK_BUSY(req));
529
530 kref_get(&req->wb_kref);
531 spin_unlock(&inode->i_lock);
532 error = nfs_wait_on_request(req);
533 nfs_release_request(req);
534 spin_lock(&inode->i_lock);
535 if (error < 0)
536 return error;
537 res++;
538 }
539 return res;
540}
541
542static void nfs_cancel_commit_list(struct list_head *head)
543{
544 struct nfs_page *req;
545
546 while(!list_empty(head)) {
547 req = nfs_list_entry(head->next);
548 nfs_list_remove_request(req);
549 nfs_clear_request_commit(req);
550 nfs_inode_remove_request(req);
551 nfs_unlock_request(req);
552 }
553}
554
555#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) 508#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
556static int 509static int
557nfs_need_commit(struct nfs_inode *nfsi) 510nfs_need_commit(struct nfs_inode *nfsi)
@@ -573,11 +526,17 @@ static int
573nfs_scan_commit(struct inode *inode, struct list_head *dst, pgoff_t idx_start, unsigned int npages) 526nfs_scan_commit(struct inode *inode, struct list_head *dst, pgoff_t idx_start, unsigned int npages)
574{ 527{
575 struct nfs_inode *nfsi = NFS_I(inode); 528 struct nfs_inode *nfsi = NFS_I(inode);
529 int ret;
576 530
577 if (!nfs_need_commit(nfsi)) 531 if (!nfs_need_commit(nfsi))
578 return 0; 532 return 0;
579 533
580 return nfs_scan_list(nfsi, dst, idx_start, npages, NFS_PAGE_TAG_COMMIT); 534 ret = nfs_scan_list(nfsi, dst, idx_start, npages, NFS_PAGE_TAG_COMMIT);
535 if (ret > 0)
536 nfsi->ncommit -= ret;
537 if (nfs_need_commit(NFS_I(inode)))
538 __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
539 return ret;
581} 540}
582#else 541#else
583static inline int nfs_need_commit(struct nfs_inode *nfsi) 542static inline int nfs_need_commit(struct nfs_inode *nfsi)
@@ -642,9 +601,10 @@ static struct nfs_page *nfs_try_to_update_request(struct inode *inode,
642 spin_lock(&inode->i_lock); 601 spin_lock(&inode->i_lock);
643 } 602 }
644 603
645 if (nfs_clear_request_commit(req)) 604 if (nfs_clear_request_commit(req) &&
646 radix_tree_tag_clear(&NFS_I(inode)->nfs_page_tree, 605 radix_tree_tag_clear(&NFS_I(inode)->nfs_page_tree,
647 req->wb_index, NFS_PAGE_TAG_COMMIT); 606 req->wb_index, NFS_PAGE_TAG_COMMIT) != NULL)
607 NFS_I(inode)->ncommit--;
648 608
649 /* Okay, the request matches. Update the region */ 609 /* Okay, the request matches. Update the region */
650 if (offset < req->wb_offset) { 610 if (offset < req->wb_offset) {
@@ -703,9 +663,11 @@ static int nfs_writepage_setup(struct nfs_open_context *ctx, struct page *page,
703 req = nfs_setup_write_request(ctx, page, offset, count); 663 req = nfs_setup_write_request(ctx, page, offset, count);
704 if (IS_ERR(req)) 664 if (IS_ERR(req))
705 return PTR_ERR(req); 665 return PTR_ERR(req);
666 nfs_mark_request_dirty(req);
706 /* Update file length */ 667 /* Update file length */
707 nfs_grow_file(page, offset, count); 668 nfs_grow_file(page, offset, count);
708 nfs_mark_uptodate(page, req->wb_pgbase, req->wb_bytes); 669 nfs_mark_uptodate(page, req->wb_pgbase, req->wb_bytes);
670 nfs_mark_request_dirty(req);
709 nfs_clear_page_tag_locked(req); 671 nfs_clear_page_tag_locked(req);
710 return 0; 672 return 0;
711} 673}
@@ -774,7 +736,7 @@ int nfs_updatepage(struct file *file, struct page *page,
774 */ 736 */
775 if (nfs_write_pageuptodate(page, inode) && 737 if (nfs_write_pageuptodate(page, inode) &&
776 inode->i_flock == NULL && 738 inode->i_flock == NULL &&
777 !(file->f_flags & O_SYNC)) { 739 !(file->f_flags & O_DSYNC)) {
778 count = max(count + offset, nfs_page_length(page)); 740 count = max(count + offset, nfs_page_length(page));
779 offset = 0; 741 offset = 0;
780 } 742 }
@@ -782,8 +744,6 @@ int nfs_updatepage(struct file *file, struct page *page,
782 status = nfs_writepage_setup(ctx, page, offset, count); 744 status = nfs_writepage_setup(ctx, page, offset, count);
783 if (status < 0) 745 if (status < 0)
784 nfs_set_pageerror(page); 746 nfs_set_pageerror(page);
785 else
786 __set_page_dirty_nobuffers(page);
787 747
788 dprintk("NFS: nfs_updatepage returns %d (isize %lld)\n", 748 dprintk("NFS: nfs_updatepage returns %d (isize %lld)\n",
789 status, (long long)i_size_read(inode)); 749 status, (long long)i_size_read(inode));
@@ -792,13 +752,12 @@ int nfs_updatepage(struct file *file, struct page *page,
792 752
793static void nfs_writepage_release(struct nfs_page *req) 753static void nfs_writepage_release(struct nfs_page *req)
794{ 754{
755 struct page *page = req->wb_page;
795 756
796 if (PageError(req->wb_page) || !nfs_reschedule_unstable_write(req)) { 757 if (PageError(req->wb_page) || !nfs_reschedule_unstable_write(req))
797 nfs_end_page_writeback(req->wb_page);
798 nfs_inode_remove_request(req); 758 nfs_inode_remove_request(req);
799 } else
800 nfs_end_page_writeback(req->wb_page);
801 nfs_clear_page_tag_locked(req); 759 nfs_clear_page_tag_locked(req);
760 nfs_end_page_writeback(page);
802} 761}
803 762
804static int flush_task_priority(int how) 763static int flush_task_priority(int how)
@@ -822,7 +781,6 @@ static int nfs_write_rpcsetup(struct nfs_page *req,
822 int how) 781 int how)
823{ 782{
824 struct inode *inode = req->wb_context->path.dentry->d_inode; 783 struct inode *inode = req->wb_context->path.dentry->d_inode;
825 int flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;
826 int priority = flush_task_priority(how); 784 int priority = flush_task_priority(how);
827 struct rpc_task *task; 785 struct rpc_task *task;
828 struct rpc_message msg = { 786 struct rpc_message msg = {
@@ -837,9 +795,10 @@ static int nfs_write_rpcsetup(struct nfs_page *req,
837 .callback_ops = call_ops, 795 .callback_ops = call_ops,
838 .callback_data = data, 796 .callback_data = data,
839 .workqueue = nfsiod_workqueue, 797 .workqueue = nfsiod_workqueue,
840 .flags = flags, 798 .flags = RPC_TASK_ASYNC,
841 .priority = priority, 799 .priority = priority,
842 }; 800 };
801 int ret = 0;
843 802
844 /* Set up the RPC argument and reply structs 803 /* Set up the RPC argument and reply structs
845 * NB: take care not to mess about with data->commit et al. */ 804 * NB: take care not to mess about with data->commit et al. */
@@ -878,10 +837,18 @@ static int nfs_write_rpcsetup(struct nfs_page *req,
878 (unsigned long long)data->args.offset); 837 (unsigned long long)data->args.offset);
879 838
880 task = rpc_run_task(&task_setup_data); 839 task = rpc_run_task(&task_setup_data);
881 if (IS_ERR(task)) 840 if (IS_ERR(task)) {
882 return PTR_ERR(task); 841 ret = PTR_ERR(task);
842 goto out;
843 }
844 if (how & FLUSH_SYNC) {
845 ret = rpc_wait_for_completion_task(task);
846 if (ret == 0)
847 ret = task->tk_status;
848 }
883 rpc_put_task(task); 849 rpc_put_task(task);
884 return 0; 850out:
851 return ret;
885} 852}
886 853
887/* If a nfs_flush_* function fails, it should remove reqs from @head and 854/* If a nfs_flush_* function fails, it should remove reqs from @head and
@@ -890,9 +857,11 @@ static int nfs_write_rpcsetup(struct nfs_page *req,
890 */ 857 */
891static void nfs_redirty_request(struct nfs_page *req) 858static void nfs_redirty_request(struct nfs_page *req)
892{ 859{
860 struct page *page = req->wb_page;
861
893 nfs_mark_request_dirty(req); 862 nfs_mark_request_dirty(req);
894 nfs_end_page_writeback(req->wb_page);
895 nfs_clear_page_tag_locked(req); 863 nfs_clear_page_tag_locked(req);
864 nfs_end_page_writeback(page);
896} 865}
897 866
898/* 867/*
@@ -1127,16 +1096,15 @@ static void nfs_writeback_release_full(void *calldata)
1127 if (nfs_write_need_commit(data)) { 1096 if (nfs_write_need_commit(data)) {
1128 memcpy(&req->wb_verf, &data->verf, sizeof(req->wb_verf)); 1097 memcpy(&req->wb_verf, &data->verf, sizeof(req->wb_verf));
1129 nfs_mark_request_commit(req); 1098 nfs_mark_request_commit(req);
1130 nfs_end_page_writeback(page);
1131 dprintk(" marked for commit\n"); 1099 dprintk(" marked for commit\n");
1132 goto next; 1100 goto next;
1133 } 1101 }
1134 dprintk(" OK\n"); 1102 dprintk(" OK\n");
1135remove_request: 1103remove_request:
1136 nfs_end_page_writeback(page);
1137 nfs_inode_remove_request(req); 1104 nfs_inode_remove_request(req);
1138 next: 1105 next:
1139 nfs_clear_page_tag_locked(req); 1106 nfs_clear_page_tag_locked(req);
1107 nfs_end_page_writeback(page);
1140 } 1108 }
1141 nfs_writedata_release(calldata); 1109 nfs_writedata_release(calldata);
1142} 1110}
@@ -1216,7 +1184,7 @@ int nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)
1216 */ 1184 */
1217 argp->stable = NFS_FILE_SYNC; 1185 argp->stable = NFS_FILE_SYNC;
1218 } 1186 }
1219 nfs4_restart_rpc(task, server->nfs_client); 1187 nfs_restart_rpc(task, server->nfs_client);
1220 return -EAGAIN; 1188 return -EAGAIN;
1221 } 1189 }
1222 if (time_before(complain, jiffies)) { 1190 if (time_before(complain, jiffies)) {
@@ -1228,13 +1196,31 @@ int nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)
1228 /* Can't do anything about it except throw an error. */ 1196 /* Can't do anything about it except throw an error. */
1229 task->tk_status = -EIO; 1197 task->tk_status = -EIO;
1230 } 1198 }
1231 nfs4_sequence_free_slot(server->nfs_client, &data->res.seq_res);
1232 return 0; 1199 return 0;
1233} 1200}
1234 1201
1235 1202
1236#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) 1203#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
1237void nfs_commitdata_release(void *data) 1204static int nfs_commit_set_lock(struct nfs_inode *nfsi, int may_wait)
1205{
1206 if (!test_and_set_bit(NFS_INO_COMMIT, &nfsi->flags))
1207 return 1;
1208 if (may_wait && !out_of_line_wait_on_bit_lock(&nfsi->flags,
1209 NFS_INO_COMMIT, nfs_wait_bit_killable,
1210 TASK_KILLABLE))
1211 return 1;
1212 return 0;
1213}
1214
1215static void nfs_commit_clear_lock(struct nfs_inode *nfsi)
1216{
1217 clear_bit(NFS_INO_COMMIT, &nfsi->flags);
1218 smp_mb__after_clear_bit();
1219 wake_up_bit(&nfsi->flags, NFS_INO_COMMIT);
1220}
1221
1222
1223static void nfs_commitdata_release(void *data)
1238{ 1224{
1239 struct nfs_write_data *wdata = data; 1225 struct nfs_write_data *wdata = data;
1240 1226
@@ -1251,7 +1237,6 @@ static int nfs_commit_rpcsetup(struct list_head *head,
1251{ 1237{
1252 struct nfs_page *first = nfs_list_entry(head->next); 1238 struct nfs_page *first = nfs_list_entry(head->next);
1253 struct inode *inode = first->wb_context->path.dentry->d_inode; 1239 struct inode *inode = first->wb_context->path.dentry->d_inode;
1254 int flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;
1255 int priority = flush_task_priority(how); 1240 int priority = flush_task_priority(how);
1256 struct rpc_task *task; 1241 struct rpc_task *task;
1257 struct rpc_message msg = { 1242 struct rpc_message msg = {
@@ -1266,7 +1251,7 @@ static int nfs_commit_rpcsetup(struct list_head *head,
1266 .callback_ops = &nfs_commit_ops, 1251 .callback_ops = &nfs_commit_ops,
1267 .callback_data = data, 1252 .callback_data = data,
1268 .workqueue = nfsiod_workqueue, 1253 .workqueue = nfsiod_workqueue,
1269 .flags = flags, 1254 .flags = RPC_TASK_ASYNC,
1270 .priority = priority, 1255 .priority = priority,
1271 }; 1256 };
1272 1257
@@ -1326,6 +1311,7 @@ nfs_commit_list(struct inode *inode, struct list_head *head, int how)
1326 BDI_RECLAIMABLE); 1311 BDI_RECLAIMABLE);
1327 nfs_clear_page_tag_locked(req); 1312 nfs_clear_page_tag_locked(req);
1328 } 1313 }
1314 nfs_commit_clear_lock(NFS_I(inode));
1329 return -ENOMEM; 1315 return -ENOMEM;
1330} 1316}
1331 1317
@@ -1381,6 +1367,7 @@ static void nfs_commit_release(void *calldata)
1381 next: 1367 next:
1382 nfs_clear_page_tag_locked(req); 1368 nfs_clear_page_tag_locked(req);
1383 } 1369 }
1370 nfs_commit_clear_lock(NFS_I(data->inode));
1384 nfs_commitdata_release(calldata); 1371 nfs_commitdata_release(calldata);
1385} 1372}
1386 1373
@@ -1392,11 +1379,14 @@ static const struct rpc_call_ops nfs_commit_ops = {
1392 .rpc_release = nfs_commit_release, 1379 .rpc_release = nfs_commit_release,
1393}; 1380};
1394 1381
1395int nfs_commit_inode(struct inode *inode, int how) 1382static int nfs_commit_inode(struct inode *inode, int how)
1396{ 1383{
1397 LIST_HEAD(head); 1384 LIST_HEAD(head);
1398 int res; 1385 int may_wait = how & FLUSH_SYNC;
1386 int res = 0;
1399 1387
1388 if (!nfs_commit_set_lock(NFS_I(inode), may_wait))
1389 goto out;
1400 spin_lock(&inode->i_lock); 1390 spin_lock(&inode->i_lock);
1401 res = nfs_scan_commit(inode, &head, 0, 0); 1391 res = nfs_scan_commit(inode, &head, 0, 0);
1402 spin_unlock(&inode->i_lock); 1392 spin_unlock(&inode->i_lock);
@@ -1404,95 +1394,60 @@ int nfs_commit_inode(struct inode *inode, int how)
1404 int error = nfs_commit_list(inode, &head, how); 1394 int error = nfs_commit_list(inode, &head, how);
1405 if (error < 0) 1395 if (error < 0)
1406 return error; 1396 return error;
1407 } 1397 if (may_wait)
1398 wait_on_bit(&NFS_I(inode)->flags, NFS_INO_COMMIT,
1399 nfs_wait_bit_killable,
1400 TASK_KILLABLE);
1401 } else
1402 nfs_commit_clear_lock(NFS_I(inode));
1403out:
1408 return res; 1404 return res;
1409} 1405}
1410#else
1411static inline int nfs_commit_list(struct inode *inode, struct list_head *head, int how)
1412{
1413 return 0;
1414}
1415#endif
1416 1406
1417long nfs_sync_mapping_wait(struct address_space *mapping, struct writeback_control *wbc, int how) 1407static int nfs_commit_unstable_pages(struct inode *inode, struct writeback_control *wbc)
1418{ 1408{
1419 struct inode *inode = mapping->host; 1409 struct nfs_inode *nfsi = NFS_I(inode);
1420 pgoff_t idx_start, idx_end; 1410 int flags = FLUSH_SYNC;
1421 unsigned int npages = 0; 1411 int ret = 0;
1422 LIST_HEAD(head); 1412
1423 int nocommit = how & FLUSH_NOCOMMIT; 1413 /* Don't commit yet if this is a non-blocking flush and there are
1424 long pages, ret; 1414 * lots of outstanding writes for this mapping.
1425 1415 */
1426 /* FIXME */ 1416 if (wbc->sync_mode == WB_SYNC_NONE &&
1427 if (wbc->range_cyclic) 1417 nfsi->ncommit <= (nfsi->npages >> 1))
1428 idx_start = 0; 1418 goto out_mark_dirty;
1429 else { 1419
1430 idx_start = wbc->range_start >> PAGE_CACHE_SHIFT; 1420 if (wbc->nonblocking || wbc->for_background)
1431 idx_end = wbc->range_end >> PAGE_CACHE_SHIFT; 1421 flags = 0;
1432 if (idx_end > idx_start) { 1422 ret = nfs_commit_inode(inode, flags);
1433 pgoff_t l_npages = 1 + idx_end - idx_start; 1423 if (ret >= 0) {
1434 npages = l_npages; 1424 if (wbc->sync_mode == WB_SYNC_NONE) {
1435 if (sizeof(npages) != sizeof(l_npages) && 1425 if (ret < wbc->nr_to_write)
1436 (pgoff_t)npages != l_npages) 1426 wbc->nr_to_write -= ret;
1437 npages = 0; 1427 else
1428 wbc->nr_to_write = 0;
1438 } 1429 }
1430 return 0;
1439 } 1431 }
1440 how &= ~FLUSH_NOCOMMIT; 1432out_mark_dirty:
1441 spin_lock(&inode->i_lock); 1433 __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
1442 do {
1443 ret = nfs_wait_on_requests_locked(inode, idx_start, npages);
1444 if (ret != 0)
1445 continue;
1446 if (nocommit)
1447 break;
1448 pages = nfs_scan_commit(inode, &head, idx_start, npages);
1449 if (pages == 0)
1450 break;
1451 if (how & FLUSH_INVALIDATE) {
1452 spin_unlock(&inode->i_lock);
1453 nfs_cancel_commit_list(&head);
1454 ret = pages;
1455 spin_lock(&inode->i_lock);
1456 continue;
1457 }
1458 pages += nfs_scan_commit(inode, &head, 0, 0);
1459 spin_unlock(&inode->i_lock);
1460 ret = nfs_commit_list(inode, &head, how);
1461 spin_lock(&inode->i_lock);
1462
1463 } while (ret >= 0);
1464 spin_unlock(&inode->i_lock);
1465 return ret; 1434 return ret;
1466} 1435}
1467 1436#else
1468static int __nfs_write_mapping(struct address_space *mapping, struct writeback_control *wbc, int how) 1437static int nfs_commit_inode(struct inode *inode, int how)
1469{ 1438{
1470 int ret;
1471
1472 ret = nfs_writepages(mapping, wbc);
1473 if (ret < 0)
1474 goto out;
1475 ret = nfs_sync_mapping_wait(mapping, wbc, how);
1476 if (ret < 0)
1477 goto out;
1478 return 0; 1439 return 0;
1479out:
1480 __mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
1481 return ret;
1482} 1440}
1483 1441
1484/* Two pass sync: first using WB_SYNC_NONE, then WB_SYNC_ALL */ 1442static int nfs_commit_unstable_pages(struct inode *inode, struct writeback_control *wbc)
1485static int nfs_write_mapping(struct address_space *mapping, int how)
1486{ 1443{
1487 struct writeback_control wbc = { 1444 return 0;
1488 .bdi = mapping->backing_dev_info, 1445}
1489 .sync_mode = WB_SYNC_ALL, 1446#endif
1490 .nr_to_write = LONG_MAX,
1491 .range_start = 0,
1492 .range_end = LLONG_MAX,
1493 };
1494 1447
1495 return __nfs_write_mapping(mapping, &wbc, how); 1448int nfs_write_inode(struct inode *inode, struct writeback_control *wbc)
1449{
1450 return nfs_commit_unstable_pages(inode, wbc);
1496} 1451}
1497 1452
1498/* 1453/*
@@ -1500,37 +1455,27 @@ static int nfs_write_mapping(struct address_space *mapping, int how)
1500 */ 1455 */
1501int nfs_wb_all(struct inode *inode) 1456int nfs_wb_all(struct inode *inode)
1502{ 1457{
1503 return nfs_write_mapping(inode->i_mapping, 0); 1458 struct writeback_control wbc = {
1504} 1459 .sync_mode = WB_SYNC_ALL,
1460 .nr_to_write = LONG_MAX,
1461 .range_start = 0,
1462 .range_end = LLONG_MAX,
1463 };
1505 1464
1506int nfs_wb_nocommit(struct inode *inode) 1465 return sync_inode(inode, &wbc);
1507{
1508 return nfs_write_mapping(inode->i_mapping, FLUSH_NOCOMMIT);
1509} 1466}
1510 1467
1511int nfs_wb_page_cancel(struct inode *inode, struct page *page) 1468int nfs_wb_page_cancel(struct inode *inode, struct page *page)
1512{ 1469{
1513 struct nfs_page *req; 1470 struct nfs_page *req;
1514 loff_t range_start = page_offset(page);
1515 loff_t range_end = range_start + (loff_t)(PAGE_CACHE_SIZE - 1);
1516 struct writeback_control wbc = {
1517 .bdi = page->mapping->backing_dev_info,
1518 .sync_mode = WB_SYNC_ALL,
1519 .nr_to_write = LONG_MAX,
1520 .range_start = range_start,
1521 .range_end = range_end,
1522 };
1523 int ret = 0; 1471 int ret = 0;
1524 1472
1525 BUG_ON(!PageLocked(page)); 1473 BUG_ON(!PageLocked(page));
1526 for (;;) { 1474 for (;;) {
1475 wait_on_page_writeback(page);
1527 req = nfs_page_find_request(page); 1476 req = nfs_page_find_request(page);
1528 if (req == NULL) 1477 if (req == NULL)
1529 goto out;
1530 if (test_bit(PG_CLEAN, &req->wb_flags)) {
1531 nfs_release_request(req);
1532 break; 1478 break;
1533 }
1534 if (nfs_lock_request_dontget(req)) { 1479 if (nfs_lock_request_dontget(req)) {
1535 nfs_inode_remove_request(req); 1480 nfs_inode_remove_request(req);
1536 /* 1481 /*
@@ -1542,55 +1487,44 @@ int nfs_wb_page_cancel(struct inode *inode, struct page *page)
1542 break; 1487 break;
1543 } 1488 }
1544 ret = nfs_wait_on_request(req); 1489 ret = nfs_wait_on_request(req);
1490 nfs_release_request(req);
1545 if (ret < 0) 1491 if (ret < 0)
1546 goto out; 1492 break;
1547 } 1493 }
1548 if (!PagePrivate(page))
1549 return 0;
1550 ret = nfs_sync_mapping_wait(page->mapping, &wbc, FLUSH_INVALIDATE);
1551out:
1552 return ret; 1494 return ret;
1553} 1495}
1554 1496
1555static int nfs_wb_page_priority(struct inode *inode, struct page *page, 1497/*
1556 int how) 1498 * Write back all requests on one page - we do this before reading it.
1499 */
1500int nfs_wb_page(struct inode *inode, struct page *page)
1557{ 1501{
1558 loff_t range_start = page_offset(page); 1502 loff_t range_start = page_offset(page);
1559 loff_t range_end = range_start + (loff_t)(PAGE_CACHE_SIZE - 1); 1503 loff_t range_end = range_start + (loff_t)(PAGE_CACHE_SIZE - 1);
1560 struct writeback_control wbc = { 1504 struct writeback_control wbc = {
1561 .bdi = page->mapping->backing_dev_info,
1562 .sync_mode = WB_SYNC_ALL, 1505 .sync_mode = WB_SYNC_ALL,
1563 .nr_to_write = LONG_MAX, 1506 .nr_to_write = 0,
1564 .range_start = range_start, 1507 .range_start = range_start,
1565 .range_end = range_end, 1508 .range_end = range_end,
1566 }; 1509 };
1567 int ret; 1510 int ret;
1568 1511
1569 do { 1512 while(PagePrivate(page)) {
1513 wait_on_page_writeback(page);
1570 if (clear_page_dirty_for_io(page)) { 1514 if (clear_page_dirty_for_io(page)) {
1571 ret = nfs_writepage_locked(page, &wbc); 1515 ret = nfs_writepage_locked(page, &wbc);
1572 if (ret < 0) 1516 if (ret < 0)
1573 goto out_error; 1517 goto out_error;
1574 } else if (!PagePrivate(page)) 1518 }
1575 break; 1519 ret = sync_inode(inode, &wbc);
1576 ret = nfs_sync_mapping_wait(page->mapping, &wbc, how);
1577 if (ret < 0) 1520 if (ret < 0)
1578 goto out_error; 1521 goto out_error;
1579 } while (PagePrivate(page)); 1522 }
1580 return 0; 1523 return 0;
1581out_error: 1524out_error:
1582 __mark_inode_dirty(inode, I_DIRTY_PAGES);
1583 return ret; 1525 return ret;
1584} 1526}
1585 1527
1586/*
1587 * Write back all requests on one page - we do this before reading it.
1588 */
1589int nfs_wb_page(struct inode *inode, struct page* page)
1590{
1591 return nfs_wb_page_priority(inode, page, FLUSH_STABLE);
1592}
1593
1594#ifdef CONFIG_MIGRATION 1528#ifdef CONFIG_MIGRATION
1595int nfs_migrate_page(struct address_space *mapping, struct page *newpage, 1529int nfs_migrate_page(struct address_space *mapping, struct page *newpage,
1596 struct page *page) 1530 struct page *page)
@@ -1598,8 +1532,7 @@ int nfs_migrate_page(struct address_space *mapping, struct page *newpage,
1598 struct nfs_page *req; 1532 struct nfs_page *req;
1599 int ret; 1533 int ret;
1600 1534
1601 if (PageFsCache(page)) 1535 nfs_fscache_release_page(page, GFP_KERNEL);
1602 nfs_fscache_release_page(page, GFP_KERNEL);
1603 1536
1604 req = nfs_find_and_lock_request(page); 1537 req = nfs_find_and_lock_request(page);
1605 ret = PTR_ERR(req); 1538 ret = PTR_ERR(req);
@@ -1612,15 +1545,16 @@ int nfs_migrate_page(struct address_space *mapping, struct page *newpage,
1612 if (ret) 1545 if (ret)
1613 goto out_unlock; 1546 goto out_unlock;
1614 page_cache_get(newpage); 1547 page_cache_get(newpage);
1548 spin_lock(&mapping->host->i_lock);
1615 req->wb_page = newpage; 1549 req->wb_page = newpage;
1616 SetPagePrivate(newpage); 1550 SetPagePrivate(newpage);
1617 set_page_private(newpage, page_private(page)); 1551 set_page_private(newpage, (unsigned long)req);
1618 ClearPagePrivate(page); 1552 ClearPagePrivate(page);
1619 set_page_private(page, 0); 1553 set_page_private(page, 0);
1554 spin_unlock(&mapping->host->i_lock);
1620 page_cache_release(page); 1555 page_cache_release(page);
1621out_unlock: 1556out_unlock:
1622 nfs_clear_page_tag_locked(req); 1557 nfs_clear_page_tag_locked(req);
1623 nfs_release_request(req);
1624out: 1558out:
1625 return ret; 1559 return ret;
1626} 1560}