|
@@ -2385,7 +2385,8 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
|
|
|
device->io_width = fs_info->sectorsize;
|
|
|
device->io_align = fs_info->sectorsize;
|
|
|
device->sector_size = fs_info->sectorsize;
|
|
|
- device->total_bytes = i_size_read(bdev->bd_inode);
|
|
|
+ device->total_bytes = round_down(i_size_read(bdev->bd_inode),
|
|
|
+ fs_info->sectorsize);
|
|
|
device->disk_total_bytes = device->total_bytes;
|
|
|
device->commit_total_bytes = device->total_bytes;
|
|
|
device->fs_info = fs_info;
|
|
@@ -2422,7 +2423,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
|
|
|
|
|
|
tmp = btrfs_super_total_bytes(fs_info->super_copy);
|
|
|
btrfs_set_super_total_bytes(fs_info->super_copy,
|
|
|
- tmp + device->total_bytes);
|
|
|
+ round_down(tmp + device->total_bytes, fs_info->sectorsize));
|
|
|
|
|
|
tmp = btrfs_super_num_devices(fs_info->super_copy);
|
|
|
btrfs_set_super_num_devices(fs_info->super_copy, tmp + 1);
|
|
@@ -2685,6 +2686,8 @@ int btrfs_grow_device(struct btrfs_trans_handle *trans,
|
|
|
if (!device->writeable)
|
|
|
return -EACCES;
|
|
|
|
|
|
+ new_size = round_down(new_size, fs_info->sectorsize);
|
|
|
+
|
|
|
mutex_lock(&fs_info->chunk_mutex);
|
|
|
old_total = btrfs_super_total_bytes(super_copy);
|
|
|
diff = new_size - device->total_bytes;
|
|
@@ -2697,7 +2700,8 @@ int btrfs_grow_device(struct btrfs_trans_handle *trans,
|
|
|
|
|
|
fs_devices = fs_info->fs_devices;
|
|
|
|
|
|
- btrfs_set_super_total_bytes(super_copy, old_total + diff);
|
|
|
+ btrfs_set_super_total_bytes(super_copy,
|
|
|
+ round_down(old_total + diff, fs_info->sectorsize));
|
|
|
device->fs_devices->total_rw_bytes += diff;
|
|
|
|
|
|
btrfs_device_set_total_bytes(device, new_size);
|
|
@@ -4387,7 +4391,10 @@ int btrfs_shrink_device(struct btrfs_device *device, u64 new_size)
|
|
|
struct btrfs_super_block *super_copy = fs_info->super_copy;
|
|
|
u64 old_total = btrfs_super_total_bytes(super_copy);
|
|
|
u64 old_size = btrfs_device_get_total_bytes(device);
|
|
|
- u64 diff = old_size - new_size;
|
|
|
+ u64 diff;
|
|
|
+
|
|
|
+ new_size = round_down(new_size, fs_info->sectorsize);
|
|
|
+ diff = old_size - new_size;
|
|
|
|
|
|
if (device->is_tgtdev_for_dev_replace)
|
|
|
return -EINVAL;
|
|
@@ -4514,7 +4521,8 @@ again:
|
|
|
&fs_info->fs_devices->resized_devices);
|
|
|
|
|
|
WARN_ON(diff > old_total);
|
|
|
- btrfs_set_super_total_bytes(super_copy, old_total - diff);
|
|
|
+ btrfs_set_super_total_bytes(super_copy,
|
|
|
+ round_down(old_total - diff, fs_info->sectorsize));
|
|
|
mutex_unlock(&fs_info->chunk_mutex);
|
|
|
|
|
|
/* Now btrfs_update_device() will change the on-disk size. */
|