zvol: fix delayed update to block device ro entry
The change in the zvol readonly property does not update the block device readonly entry until the first IO to the ZVOL. This patch addresses the issue by updating the block device readonly property from the set property IOCTL call. Reviewed-by: Tony Hutter <hutter2@llnl.gov> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Alexander Motin <mav@FreeBSD.org> Signed-off-by: Ameer Hamza <ahamza@ixsystems.com> Closes #15409
This commit is contained in:
parent
60387facd2
commit
9ccdb8becd
|
@ -52,6 +52,7 @@ extern void zvol_create_cb(objset_t *, void *, cred_t *, dmu_tx_t *);
|
||||||
extern int zvol_set_volsize(const char *, uint64_t);
|
extern int zvol_set_volsize(const char *, uint64_t);
|
||||||
extern int zvol_set_volthreading(const char *, boolean_t);
|
extern int zvol_set_volthreading(const char *, boolean_t);
|
||||||
extern int zvol_set_common(const char *, zfs_prop_t, zprop_source_t, uint64_t);
|
extern int zvol_set_common(const char *, zfs_prop_t, zprop_source_t, uint64_t);
|
||||||
|
extern int zvol_set_ro(const char *, boolean_t);
|
||||||
extern zvol_state_handle_t *zvol_suspend(const char *);
|
extern zvol_state_handle_t *zvol_suspend(const char *);
|
||||||
extern int zvol_resume(zvol_state_handle_t *);
|
extern int zvol_resume(zvol_state_handle_t *);
|
||||||
extern void *zvol_tag(zvol_state_handle_t *);
|
extern void *zvol_tag(zvol_state_handle_t *);
|
||||||
|
|
|
@ -2535,6 +2535,15 @@ zfs_prop_set_special(const char *dsname, zprop_source_t source,
|
||||||
case ZFS_PROP_VOLMODE:
|
case ZFS_PROP_VOLMODE:
|
||||||
err = zvol_set_common(dsname, prop, source, intval);
|
err = zvol_set_common(dsname, prop, source, intval);
|
||||||
break;
|
break;
|
||||||
|
case ZFS_PROP_READONLY:
|
||||||
|
err = zvol_set_ro(dsname, intval);
|
||||||
|
/*
|
||||||
|
* Set err to -1 to force the zfs_set_prop_nvlist code down the
|
||||||
|
* default path to set the value in the nvlist.
|
||||||
|
*/
|
||||||
|
if (err == 0)
|
||||||
|
err = -1;
|
||||||
|
break;
|
||||||
case ZFS_PROP_VERSION:
|
case ZFS_PROP_VERSION:
|
||||||
{
|
{
|
||||||
zfsvfs_t *zfsvfs;
|
zfsvfs_t *zfsvfs;
|
||||||
|
|
|
@ -383,6 +383,26 @@ zvol_set_volthreading(const char *name, boolean_t value)
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Update zvol ro property.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
zvol_set_ro(const char *name, boolean_t value)
|
||||||
|
{
|
||||||
|
zvol_state_t *zv = zvol_find_by_name(name, RW_NONE);
|
||||||
|
if (zv == NULL)
|
||||||
|
return (-1);
|
||||||
|
if (value) {
|
||||||
|
zvol_os_set_disk_ro(zv, 1);
|
||||||
|
zv->zv_flags |= ZVOL_RDONLY;
|
||||||
|
} else {
|
||||||
|
zvol_os_set_disk_ro(zv, 0);
|
||||||
|
zv->zv_flags &= ~ZVOL_RDONLY;
|
||||||
|
}
|
||||||
|
mutex_exit(&zv->zv_state_lock);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sanity check volume block size.
|
* Sanity check volume block size.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue