different block sizes, as in 512, 1024, 2048, 4096. DirectIO read
will check user request alignment is valid for at least one device.
Signed-off-by: jim owens <jim6336@gmail.com>
---
fs/btrfs/volumes.c | 24 +++++++++++++++++++++++-
fs/btrfs/volumes.h | 3 +++
2 files changed, 26 insertions(+), 1 deletions(-)
@@ -573,10 +573,14 @@ static int __btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
u64 devid;
int seeding = 1;
int ret = 0;
+ u32 dio_min_blocksize = PAGE_SIZE;
list_for_each_entry(device, head, dev_list) {
- if (device->bdev)
+ if (device->bdev) {
+ dio_min_blocksize = min_t(u32, dio_min_blocksize,
+ bdev_logical_block_size(device->bdev));
continue;
+ }
if (!device->name)
continue;
@@ -627,6 +631,8 @@ static int __btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
list_add(&device->dev_alloc_list,
&fs_devices->alloc_list);
}
+ dio_min_blocksize = min_t(u32, dio_min_blocksize,
+ bdev_logical_block_size(device->bdev));
continue;
error_brelse:
@@ -646,6 +652,7 @@ error:
fs_devices->latest_devid = latest_devid;
fs_devices->latest_trans = latest_transid;
fs_devices->total_rw_bytes = 0;
+ fs_devices->dio_min_blocksize = dio_min_blocksize;
out:
return ret;
}
@@ -1126,6 +1133,7 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path)
u64 num_devices;
u8 *dev_uuid;
int ret = 0;
+ u32 dio_min_blocksize;
mutex_lock(&uuid_mutex);
mutex_lock(&root->fs_info->volume_mutex);
@@ -1277,6 +1285,14 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path)
kfree(device);
ret = 0;
+ dio_min_blocksize = PAGE_SIZE;
+ list_for_each_entry(device,
+ &root->fs_info->fs_devices->devices, dev_list)
+ if (device->bdev)
+ dio_min_blocksize = min_t(u32, dio_min_blocksize,
+ bdev_logical_block_size(device->bdev));
+ root->fs_info->fs_devices->dio_min_blocksize = dio_min_blocksize;
+
error_brelse:
brelse(bh);
error_close:
@@ -1556,6 +1572,12 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path)
ret = btrfs_relocate_sys_chunks(root);
BUG_ON(ret);
}
+
+ if (!ret)
+ root->fs_info->fs_devices->dio_min_blocksize = min_t(u32,
+ root->fs_info->fs_devices->dio_min_blocksize,
+ bdev_logical_block_size(bdev));
+
out:
mutex_unlock(&root->fs_info->volume_mutex);
return ret;
@@ -117,6 +117,9 @@ struct btrfs_fs_devices {
* nonrot flag set
*/
int rotating;
+
+ /* smallest logical blocksize possible in file system for direct IO */
+ u32 dio_min_blocksize;
};
struct btrfs_bio_stripe {