diff options
author | Christoph Hellwig <hch@lst.de> | 2010-03-05 03:21:37 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2010-03-05 13:25:52 -0500 |
commit | a9185b41a4f84971b930c519f0c63bd450c4810d (patch) | |
tree | 268cf4e206cca12fb9e1dd68984e7c190e465b46 /fs/fs-writeback.c | |
parent | 26821ed40b4230259e770c9911180f38fcaa6f59 (diff) |
pass writeback_control to ->write_inode
This gives the filesystem more information about the writeback that
is happening. Trond requested this for the NFS unstable write handling,
and other filesystems might benefit from this too by beeing able to
distinguish between the different callers in more detail.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/fs-writeback.c')
-rw-r--r-- | fs/fs-writeback.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 5f2721b1e4be..76fc4d594acb 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
@@ -381,10 +381,10 @@ static void queue_io(struct bdi_writeback *wb, unsigned long *older_than_this) | |||
381 | move_expired_inodes(&wb->b_dirty, &wb->b_io, older_than_this); | 381 | move_expired_inodes(&wb->b_dirty, &wb->b_io, older_than_this); |
382 | } | 382 | } |
383 | 383 | ||
384 | static int write_inode(struct inode *inode, int sync) | 384 | static int write_inode(struct inode *inode, struct writeback_control *wbc) |
385 | { | 385 | { |
386 | if (inode->i_sb->s_op->write_inode && !is_bad_inode(inode)) | 386 | if (inode->i_sb->s_op->write_inode && !is_bad_inode(inode)) |
387 | return inode->i_sb->s_op->write_inode(inode, sync); | 387 | return inode->i_sb->s_op->write_inode(inode, wbc); |
388 | return 0; | 388 | return 0; |
389 | } | 389 | } |
390 | 390 | ||
@@ -421,7 +421,6 @@ static int | |||
421 | writeback_single_inode(struct inode *inode, struct writeback_control *wbc) | 421 | writeback_single_inode(struct inode *inode, struct writeback_control *wbc) |
422 | { | 422 | { |
423 | struct address_space *mapping = inode->i_mapping; | 423 | struct address_space *mapping = inode->i_mapping; |
424 | int wait = wbc->sync_mode == WB_SYNC_ALL; | ||
425 | unsigned dirty; | 424 | unsigned dirty; |
426 | int ret; | 425 | int ret; |
427 | 426 | ||
@@ -439,7 +438,7 @@ writeback_single_inode(struct inode *inode, struct writeback_control *wbc) | |||
439 | * We'll have another go at writing back this inode when we | 438 | * We'll have another go at writing back this inode when we |
440 | * completed a full scan of b_io. | 439 | * completed a full scan of b_io. |
441 | */ | 440 | */ |
442 | if (!wait) { | 441 | if (wbc->sync_mode != WB_SYNC_ALL) { |
443 | requeue_io(inode); | 442 | requeue_io(inode); |
444 | return 0; | 443 | return 0; |
445 | } | 444 | } |
@@ -466,7 +465,7 @@ writeback_single_inode(struct inode *inode, struct writeback_control *wbc) | |||
466 | * This is important for filesystems that modify metadata on data | 465 | * This is important for filesystems that modify metadata on data |
467 | * I/O completion. | 466 | * I/O completion. |
468 | */ | 467 | */ |
469 | if (wait) { | 468 | if (wbc->sync_mode == WB_SYNC_ALL) { |
470 | int err = filemap_fdatawait(mapping); | 469 | int err = filemap_fdatawait(mapping); |
471 | if (ret == 0) | 470 | if (ret == 0) |
472 | ret = err; | 471 | ret = err; |
@@ -474,7 +473,7 @@ writeback_single_inode(struct inode *inode, struct writeback_control *wbc) | |||
474 | 473 | ||
475 | /* Don't write the inode if only I_DIRTY_PAGES was set */ | 474 | /* Don't write the inode if only I_DIRTY_PAGES was set */ |
476 | if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { | 475 | if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { |
477 | int err = write_inode(inode, wait); | 476 | int err = write_inode(inode, wbc); |
478 | if (ret == 0) | 477 | if (ret == 0) |
479 | ret = err; | 478 | ret = err; |
480 | } | 479 | } |