提交 cbcc8326 编写于 作者: L Li Zefan 提交者: David Sterba

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: NLi Zefan <lizf@cn.fujitsu.com>
上级 60ccf82f
...@@ -1087,7 +1087,6 @@ int btrfs_defrag_file(struct inode *inode, struct file *file, ...@@ -1087,7 +1087,6 @@ int btrfs_defrag_file(struct inode *inode, struct file *file,
defrag_count += ret; defrag_count += ret;
balance_dirty_pages_ratelimited_nr(inode->i_mapping, ret); balance_dirty_pages_ratelimited_nr(inode->i_mapping, ret);
i += ret;
if (newer_than) { if (newer_than) {
if (newer_off == (u64)-1) if (newer_off == (u64)-1)
...@@ -1107,7 +1106,10 @@ int btrfs_defrag_file(struct inode *inode, struct file *file, ...@@ -1107,7 +1106,10 @@ int btrfs_defrag_file(struct inode *inode, struct file *file,
break; break;
} }
} else { } else {
i++; if (ret > 0)
i += ret;
else
i++;
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册