diff options
author | Andrew Morton <akpm@osdl.org> | 2005-11-16 18:07:01 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-01-06 14:58:38 -0500 |
commit | 22905f775dd6a8b73be99826dcad07ceec00244b (patch) | |
tree | 960c0ad3d10fa208a31b78256788f332e5ebdd48 | |
parent | d99cf9d679a520d67f81d805b7cb91c68e1847f0 (diff) |
identify multipage ->writepages() calls
NFS needs to be able to distinguish between single-page ->writepage() calls and
multipage ->writepages() calls.
For the single-page writepage calls NFS can kick off the I/O within the
context of ->writepage().
For multipage ->writepages calls, nfs_writepage() will leave the I/O pending
and nfs_writepages() will kick off the I/O when it all has been queued up
within NFS.
Cc: Trond Myklebust <trond.myklebust@fys.uio.no>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r-- | include/linux/writeback.h | 9 | ||||
-rw-r--r-- | mm/page-writeback.c | 10 |
2 files changed, 13 insertions, 6 deletions
diff --git a/include/linux/writeback.h b/include/linux/writeback.h index 64a36ba43b2f..b096159086e8 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h | |||
@@ -53,10 +53,11 @@ struct writeback_control { | |||
53 | loff_t start; | 53 | loff_t start; |
54 | loff_t end; | 54 | loff_t end; |
55 | 55 | ||
56 | unsigned nonblocking:1; /* Don't get stuck on request queues */ | 56 | unsigned nonblocking:1; /* Don't get stuck on request queues */ |
57 | unsigned encountered_congestion:1; /* An output: a queue is full */ | 57 | unsigned encountered_congestion:1; /* An output: a queue is full */ |
58 | unsigned for_kupdate:1; /* A kupdate writeback */ | 58 | unsigned for_kupdate:1; /* A kupdate writeback */ |
59 | unsigned for_reclaim:1; /* Invoked from the page allocator */ | 59 | unsigned for_reclaim:1; /* Invoked from the page allocator */ |
60 | unsigned for_writepages:1; /* This is a writepages() call */ | ||
60 | }; | 61 | }; |
61 | 62 | ||
62 | /* | 63 | /* |
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 0166ea15c9ee..5240e426c1f7 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c | |||
@@ -550,11 +550,17 @@ void __init page_writeback_init(void) | |||
550 | 550 | ||
551 | int do_writepages(struct address_space *mapping, struct writeback_control *wbc) | 551 | int do_writepages(struct address_space *mapping, struct writeback_control *wbc) |
552 | { | 552 | { |
553 | int ret; | ||
554 | |||
553 | if (wbc->nr_to_write <= 0) | 555 | if (wbc->nr_to_write <= 0) |
554 | return 0; | 556 | return 0; |
557 | wbc->for_writepages = 1; | ||
555 | if (mapping->a_ops->writepages) | 558 | if (mapping->a_ops->writepages) |
556 | return mapping->a_ops->writepages(mapping, wbc); | 559 | ret = mapping->a_ops->writepages(mapping, wbc); |
557 | return generic_writepages(mapping, wbc); | 560 | else |
561 | ret = generic_writepages(mapping, wbc); | ||
562 | wbc->for_writepages = 0; | ||
563 | return ret; | ||
558 | } | 564 | } |
559 | 565 | ||
560 | /** | 566 | /** |