diff options
author | Li Zefan <lizf@cn.fujitsu.com> | 2011-09-08 10:26:51 +0800 |
---|---|---|
committer | David Sterba <dsterba@suse.cz> | 2011-10-20 18:10:44 +0200 |
commit | f0dd9592a1aa014b3a01aa2be7e795aae040d65b (patch) | |
tree | a57eaec0eb40c490254af749c2bda77534002e9e /fs/btrfs/inode.c | |
parent | 560f7d75457f86a43970aa413e334e394082dce4 (diff) | |
download | op-kernel-dev-f0dd9592a1aa014b3a01aa2be7e795aae040d65b.zip op-kernel-dev-f0dd9592a1aa014b3a01aa2be7e795aae040d65b.tar.gz |
Btrfs: fix direct-io vs nodatacow
To reproduce the bug:
# mount -o nodatacow /dev/sda7 /mnt/
# dd if=/dev/zero of=/mnt/tmp bs=4K count=1
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.000136115 s, 30.1 MB/s
# dd if=/dev/zero of=/mnt/tmp bs=4K count=1 conv=notrunc oflag=direct
dd: writing `/mnt/tmp': Input/output error
1+0 records in
0+0 records out
btrfs_ordered_update_i_size() may return 1, but btrfs_endio_direct_write()
mistakenly takes it as an error.
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 81d4f68..65474d9 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -5777,8 +5777,7 @@ again: if (test_bit(BTRFS_ORDERED_NOCOW, &ordered->flags)) { ret = btrfs_ordered_update_i_size(inode, 0, ordered); if (!ret) - ret = btrfs_update_inode(trans, root, inode); - err = ret; + err = btrfs_update_inode(trans, root, inode); goto out; } |