summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Motin <mav@FreeBSD.org>2021-07-22 12:22:14 -0400
committerBrian Behlendorf <behlendorf1@llnl.gov>2021-08-31 10:30:21 -0700
commitd4326d25002e4b01e3ebeac396f5d0a44e1e90bf (patch)
tree93184e543a637ee20cf8da6b79e0fd9bb7dd44f3
parent7341b40b71cc2737c095c496d81973f080e1ee9a (diff)
FreeBSD: Ignore make_dev_s() errors
Since errors returned by zvol_create_minor_impl() are ignored by the common code, it is more convenient to ignore make_dev_s() errors there. It allows, for example, to get device created for the zvol after later rename instead of having it further stuck in half-created state. zvol_rename_minor() already ignores those errors. While there, switch from MAXPHYS to maxphys in FreeBSD 13+. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Tony Nguyen <tony.nguyen@delphix.com> Reviewed-by: Ryan Moeller <ryan@iXsystems.com> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Closes #12375
-rw-r--r--module/os/freebsd/zfs/zvol_os.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/module/os/freebsd/zfs/zvol_os.c b/module/os/freebsd/zfs/zvol_os.c
index 10da5b835..77f6bf75f 100644
--- a/module/os/freebsd/zfs/zvol_os.c
+++ b/module/os/freebsd/zfs/zvol_os.c
@@ -1241,7 +1241,11 @@ zvol_rename_minor(zvol_state_t *zv, const char *newname)
args.mda_si_drv2 = zv;
if (make_dev_s(&args, &dev, "%s/%s", ZVOL_DRIVER, newname)
== 0) {
+#if __FreeBSD_version > 1300130
+ dev->si_iosize_max = maxphys;
+#else
dev->si_iosize_max = MAXPHYS;
+#endif
zsd->zsd_cdev = dev;
}
}
@@ -1277,9 +1281,10 @@ zvol_free(zvol_state_t *zv)
struct zvol_state_dev *zsd = &zv->zv_zso->zso_dev;
struct cdev *dev = zsd->zsd_cdev;
- ASSERT3P(dev->si_drv2, ==, NULL);
-
- destroy_dev(dev);
+ if (dev != NULL) {
+ ASSERT3P(dev->si_drv2, ==, NULL);
+ destroy_dev(dev);
+ }
}
mutex_destroy(&zv->zv_state_lock);
@@ -1374,16 +1379,15 @@ zvol_create_minor_impl(const char *name)
args.mda_gid = GID_OPERATOR;
args.mda_mode = 0640;
args.mda_si_drv2 = zv;
- error = make_dev_s(&args, &dev, "%s/%s", ZVOL_DRIVER, name);
- if (error) {
- kmem_free(zv->zv_zso, sizeof (struct zvol_state_os));
- mutex_destroy(&zv->zv_state_lock);
- kmem_free(zv, sizeof (*zv));
- dmu_objset_disown(os, B_TRUE, FTAG);
- goto out_doi;
+ if (make_dev_s(&args, &dev, "%s/%s", ZVOL_DRIVER, name)
+ == 0) {
+#if __FreeBSD_version > 1300130
+ dev->si_iosize_max = maxphys;
+#else
+ dev->si_iosize_max = MAXPHYS;
+#endif
+ zsd->zsd_cdev = dev;
}
- dev->si_iosize_max = MAXPHYS;
- zsd->zsd_cdev = dev;
}
(void) strlcpy(zv->zv_name, name, MAXPATHLEN);
rw_init(&zv->zv_suspend_lock, NULL, RW_DEFAULT, NULL);
@@ -1456,7 +1460,8 @@ zvol_clear_private(zvol_state_t *zv)
struct zvol_state_dev *zsd = &zv->zv_zso->zso_dev;
struct cdev *dev = zsd->zsd_cdev;
- dev->si_drv2 = NULL;
+ if (dev != NULL)
+ dev->si_drv2 = NULL;
}
}