diff options
author | Andrew Morton <akpm@osdl.org> | 2006-03-24 06:18:04 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-24 10:33:25 -0500 |
commit | ebcf28e1c7a295f3321249dd235ad2e45938fdd9 (patch) | |
tree | fdd2e131e627af55d3741a7fafad0edaa61410c1 /mm/filemap.c | |
parent | 469eb4d03878b676418f853011ebfb54ccf83a5e (diff) |
[PATCH] fadvise(): write commands
Add two new linux-specific fadvise extensions():
LINUX_FADV_ASYNC_WRITE: start async writeout of any dirty pages between file
offsets `offset' and `offset+len'. Any pages which are currently under
writeout are skipped, whether or not they are dirty.
LINUX_FADV_WRITE_WAIT: wait upon writeout of any dirty pages between file
offsets `offset' and `offset+len'.
By combining these two operations the application may do several things:
LINUX_FADV_ASYNC_WRITE: push some or all of the dirty pages at the disk.
LINUX_FADV_WRITE_WAIT, LINUX_FADV_ASYNC_WRITE: push all of the currently dirty
pages at the disk.
LINUX_FADV_WRITE_WAIT, LINUX_FADV_ASYNC_WRITE, LINUX_FADV_WRITE_WAIT: push all
of the currently dirty pages at the disk, wait until they have been written.
It should be noted that none of these operations write out the file's
metadata. So unless the application is strictly performing overwrites of
already-instantiated disk blocks, there are no guarantees here that the data
will be available after a crash.
To complete this suite of operations I guess we should have a "sync file
metadata only" operation. This gives applications access to all the building
blocks needed for all sorts of sync operations. But sync-metadata doesn't fit
well with the fadvise() interface. Probably it should be a new syscall:
sys_fmetadatasync().
The patch also diddles with the meaning of `endbyte' in sys_fadvise64_64().
It is made to represent that last affected byte in the file (ie: it is
inclusive). Generally, all these byterange and pagerange functions are
inclusive so we can easily represent EOF with -1.
As Ulrich notes, these two functions are somewhat abusive of the fadvise()
concept, which appears to be "set the future policy for this fd".
But these commands are a perfect fit with the fadvise() impementation, and
several of the existing fadvise() commands are synchronous and don't affect
future policy either. I think we can live with the slight incongruity.
Cc: Michael Kerrisk <mtk-manpages@gmx.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm/filemap.c')
-rw-r--r-- | mm/filemap.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index c1b1708cc95d..3ef20739e725 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -183,8 +183,8 @@ static int sync_page(void *word) | |||
183 | * these two operations is that if a dirty page/buffer is encountered, it must | 183 | * these two operations is that if a dirty page/buffer is encountered, it must |
184 | * be waited upon, and not just skipped over. | 184 | * be waited upon, and not just skipped over. |
185 | */ | 185 | */ |
186 | static int __filemap_fdatawrite_range(struct address_space *mapping, | 186 | int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start, |
187 | loff_t start, loff_t end, int sync_mode) | 187 | loff_t end, int sync_mode) |
188 | { | 188 | { |
189 | int ret; | 189 | int ret; |
190 | struct writeback_control wbc = { | 190 | struct writeback_control wbc = { |
@@ -213,8 +213,8 @@ int filemap_fdatawrite(struct address_space *mapping) | |||
213 | } | 213 | } |
214 | EXPORT_SYMBOL(filemap_fdatawrite); | 214 | EXPORT_SYMBOL(filemap_fdatawrite); |
215 | 215 | ||
216 | static int filemap_fdatawrite_range(struct address_space *mapping, | 216 | static int filemap_fdatawrite_range(struct address_space *mapping, loff_t start, |
217 | loff_t start, loff_t end) | 217 | loff_t end) |
218 | { | 218 | { |
219 | return __filemap_fdatawrite_range(mapping, start, end, WB_SYNC_ALL); | 219 | return __filemap_fdatawrite_range(mapping, start, end, WB_SYNC_ALL); |
220 | } | 220 | } |
@@ -233,7 +233,7 @@ EXPORT_SYMBOL(filemap_flush); | |||
233 | * Wait for writeback to complete against pages indexed by start->end | 233 | * Wait for writeback to complete against pages indexed by start->end |
234 | * inclusive | 234 | * inclusive |
235 | */ | 235 | */ |
236 | static int wait_on_page_writeback_range(struct address_space *mapping, | 236 | int wait_on_page_writeback_range(struct address_space *mapping, |
237 | pgoff_t start, pgoff_t end) | 237 | pgoff_t start, pgoff_t end) |
238 | { | 238 | { |
239 | struct pagevec pvec; | 239 | struct pagevec pvec; |