diff options
author | Li Zefan <lizf@cn.fujitsu.com> | 2011-09-02 03:56:25 -0400 |
---|---|---|
committer | David Sterba <dsterba@suse.cz> | 2011-10-20 12:10:34 -0400 |
commit | cbcc83265d929ac71553c1b5dafdb830171af947 (patch) | |
tree | 4628b3eaf8e6d20681814d23a15ba174ae69ccb9 /fs/btrfs/ioctl.c | |
parent | 60ccf82f5b6e26e10d41783464ca469c070c7d49 (diff) |
Btrfs: fix defragmentation regression
There's an off-by-one bug:
# create a file with lots of 4K file extents
# btrfs fi defrag /mnt/file
# sync
# filefrag -v /mnt/file
Filesystem type is: 9123683e
File size of /mnt/file is 1228800 (300 blocks, blocksize 4096)
ext logical physical expected length flags
0 0 3372 64
1 64 3136 3435 1
2 65 3436 3136 64
3 129 3201 3499 1
4 130 3500 3201 64
5 194 3266 3563 1
6 195 3564 3266 64
7 259 3331 3627 1
8 260 3628 3331 40 eof
After this patch:
...
# filefrag -v /mnt/file
Filesystem type is: 9123683e
File size of /mnt/file is 1228800 (300 blocks, blocksize 4096)
ext logical physical expected length flags
0 0 3372 300 eof
/mnt/file: 1 extent found
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Diffstat (limited to 'fs/btrfs/ioctl.c')
-rw-r--r-- | fs/btrfs/ioctl.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 8ccc106f4e18..b39f7bf92704 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -1087,7 +1087,6 @@ int btrfs_defrag_file(struct inode *inode, struct file *file, | |||
1087 | 1087 | ||
1088 | defrag_count += ret; | 1088 | defrag_count += ret; |
1089 | balance_dirty_pages_ratelimited_nr(inode->i_mapping, ret); | 1089 | balance_dirty_pages_ratelimited_nr(inode->i_mapping, ret); |
1090 | i += ret; | ||
1091 | 1090 | ||
1092 | if (newer_than) { | 1091 | if (newer_than) { |
1093 | if (newer_off == (u64)-1) | 1092 | if (newer_off == (u64)-1) |
@@ -1107,7 +1106,10 @@ int btrfs_defrag_file(struct inode *inode, struct file *file, | |||
1107 | break; | 1106 | break; |
1108 | } | 1107 | } |
1109 | } else { | 1108 | } else { |
1110 | i++; | 1109 | if (ret > 0) |
1110 | i += ret; | ||
1111 | else | ||
1112 | i++; | ||
1111 | } | 1113 | } |
1112 | } | 1114 | } |
1113 | 1115 | ||