Skip to content

Commit

Permalink
btrfs: round down size diff when shrinking/growing device
Browse files Browse the repository at this point in the history
Further testing showed that the fix introduced in 7dfb8be ("btrfs:
Round down values which are written for total_bytes_size") was
insufficient and it could still lead to discrepancies between the
total_bytes in the super block and the device total bytes. So this patch
also ensures that the difference between old/new sizes when
shrinking/growing is also rounded down. This ensure that we won't be
subtracting/adding a non-sectorsize multiples to the superblock/device
total sizees.

Fixes: 7dfb8be ("btrfs: Round down values which are written for total_bytes_size")
Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
  • Loading branch information
Nikolay Borisov authored and David Sterba committed Jul 24, 2017
1 parent 17024ad commit 0e4324a
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions fs/btrfs/volumes.c
Original file line number Diff line number Diff line change
Expand Up @@ -2702,7 +2702,7 @@ int btrfs_grow_device(struct btrfs_trans_handle *trans,

mutex_lock(&fs_info->chunk_mutex);
old_total = btrfs_super_total_bytes(super_copy);
diff = new_size - device->total_bytes;
diff = round_down(new_size - device->total_bytes, fs_info->sectorsize);

if (new_size <= device->total_bytes ||
device->is_tgtdev_for_dev_replace) {
Expand Down Expand Up @@ -4406,7 +4406,7 @@ int btrfs_shrink_device(struct btrfs_device *device, u64 new_size)
u64 diff;

new_size = round_down(new_size, fs_info->sectorsize);
diff = old_size - new_size;
diff = round_down(old_size - new_size, fs_info->sectorsize);

if (device->is_tgtdev_for_dev_replace)
return -EINVAL;
Expand Down

0 comments on commit 0e4324a

Please sign in to comment.