Skip to content

Commit c60df6a

Browse files
ixhamzatonyhutter
authored andcommitted
linux/zvol_os: fix zvol queue limits initialization
zvol queue limits initialization depends on `zv_volblocksize`, but it is initialized later, leading to several limits being initialized with incorrect values, including `max_discard_*` limits. This also causes `blkdiscard` command to consistently fail, as `blk_ioctl_discard` reads `bdev_max_discard_sectors()` limits as 0, leading to failure. The fix is straightforward: initialize `zv->zv_volblocksize` early, before setting the queue limits. This PR should fix `zvol/zvol_misc/zvol_misc_trim` failure on recent PRs, as the test case issues `blkdiscard` for a zvol. Additionally, `zvol_misc_trim` was recently enabled in `6c7d41a`, which is why the issue wasn't identified earlier. Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: Tony Hutter <[email protected]> Signed-off-by: Ameer Hamza <[email protected]> Closes #16454
1 parent d8fa32a commit c60df6a

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

module/os/linux/zfs/zvol_os.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,7 +1343,7 @@ zvol_alloc_blk_mq(zvol_state_t *zv, zvol_queue_limits_t *limits)
13431343
* request queue and generic disk structures for the block device.
13441344
*/
13451345
static zvol_state_t *
1346-
zvol_alloc(dev_t dev, const char *name)
1346+
zvol_alloc(dev_t dev, const char *name, uint64_t volblocksize)
13471347
{
13481348
zvol_state_t *zv;
13491349
struct zvol_state_os *zso;
@@ -1363,6 +1363,7 @@ zvol_alloc(dev_t dev, const char *name)
13631363
zso = kmem_zalloc(sizeof (struct zvol_state_os), KM_SLEEP);
13641364
zv->zv_zso = zso;
13651365
zv->zv_volmode = volmode;
1366+
zv->zv_volblocksize = volblocksize;
13661367

13671368
list_link_init(&zv->zv_next);
13681369
mutex_init(&zv->zv_state_lock, NULL, MUTEX_DEFAULT, NULL);
@@ -1649,7 +1650,8 @@ zvol_os_create_minor(const char *name)
16491650
if (error)
16501651
goto out_dmu_objset_disown;
16511652

1652-
zv = zvol_alloc(MKDEV(zvol_major, minor), name);
1653+
zv = zvol_alloc(MKDEV(zvol_major, minor), name,
1654+
doi->doi_data_block_size);
16531655
if (zv == NULL) {
16541656
error = SET_ERROR(EAGAIN);
16551657
goto out_dmu_objset_disown;
@@ -1659,7 +1661,6 @@ zvol_os_create_minor(const char *name)
16591661
if (dmu_objset_is_snapshot(os))
16601662
zv->zv_flags |= ZVOL_RDONLY;
16611663

1662-
zv->zv_volblocksize = doi->doi_data_block_size;
16631664
zv->zv_volsize = volsize;
16641665
zv->zv_objset = os;
16651666

0 commit comments

Comments
 (0)