Skip to content

Commit

Permalink
block_write_full_page: Use synchronous writes for WBC_SYNC_ALL writeb…
Browse files Browse the repository at this point in the history
…acks

When doing synchronous writes because wbc->sync_mode is set to
WBC_SYNC_ALL, send the write request using WRITE_SYNC, so that we
don't unduly block system calls such as fsync().

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Acked-by: Jan Kara <jack@suse.cz>
  • Loading branch information
Theodore Ts'o committed Mar 28, 2009
1 parent 8e0ee43 commit a64c861
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions fs/buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -1714,6 +1714,7 @@ static int __block_write_full_page(struct inode *inode, struct page *page,
struct buffer_head *bh, *head;
const unsigned blocksize = 1 << inode->i_blkbits;
int nr_underway = 0;
int write_op = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE);

BUG_ON(!PageLocked(page));

Expand Down Expand Up @@ -1805,7 +1806,7 @@ static int __block_write_full_page(struct inode *inode, struct page *page,
do {
struct buffer_head *next = bh->b_this_page;
if (buffer_async_write(bh)) {
submit_bh(WRITE, bh);
submit_bh(write_op, bh);
nr_underway++;
}
bh = next;
Expand Down Expand Up @@ -1859,7 +1860,7 @@ static int __block_write_full_page(struct inode *inode, struct page *page,
struct buffer_head *next = bh->b_this_page;
if (buffer_async_write(bh)) {
clear_buffer_dirty(bh);
submit_bh(WRITE, bh);
submit_bh(write_op, bh);
nr_underway++;
}
bh = next;
Expand Down

0 comments on commit a64c861

Please sign in to comment.