From 6ab19c10539b8e9db703d6c20e274aee9cd56569 Mon Sep 17 00:00:00 2001 From: Chris Mason Date: Mon, 29 Oct 2007 14:36:41 -0400 Subject: [PATCH] --- yaml --- r: 128519 b: refs/heads/master c: 2ff3e9b61d02b03e3157f7d43ba20ee1452814de h: refs/heads/master i: 128517: 900876410fe52fe4bf381040ec5eeed976367ba5 128515: ca92f361a63a629810d99a57a24584d470090c4c 128511: 6650f35ceef35f32d9d9adead2d60123fc14fcd2 v: v3 --- [refs] | 2 +- trunk/fs/btrfs/file.c | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index ad9186e409e0..aa70838bac83 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b56baf5bedccd3258643b09289f17ceab3ddea52 +refs/heads/master: 2ff3e9b61d02b03e3157f7d43ba20ee1452814de diff --git a/trunk/fs/btrfs/file.c b/trunk/fs/btrfs/file.c index 9260d3478aad..843e920388ed 100644 --- a/trunk/fs/btrfs/file.c +++ b/trunk/fs/btrfs/file.c @@ -635,8 +635,9 @@ static ssize_t btrfs_file_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { loff_t pos; - size_t num_written = 0; - int err = 0; + loff_t start_pos; + ssize_t num_written = 0; + ssize_t err = 0; int ret = 0; struct inode *inode = file->f_path.dentry->d_inode; struct btrfs_root *root = BTRFS_I(inode)->root; @@ -652,7 +653,10 @@ static ssize_t btrfs_file_write(struct file *file, const char __user *buf, pinned[1] = NULL; if (file->f_flags & O_DIRECT) return -EINVAL; + pos = *ppos; + start_pos = pos; + vfs_check_frozen(inode->i_sb, SB_FREEZE_WRITE); current->backing_dev_info = inode->i_mapping->backing_dev_info; err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); @@ -743,6 +747,13 @@ static ssize_t btrfs_file_write(struct file *file, const char __user *buf, if (pinned[1]) page_cache_release(pinned[1]); *ppos = pos; + + if (num_written > 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) { + err = sync_page_range(inode, inode->i_mapping, + start_pos, num_written); + if (err < 0) + num_written = err; + } current->backing_dev_info = NULL; return num_written ? num_written : err; }