Module Name: src
Committed By: hannken
Date: Wed May 22 08:45:32 UTC 2019
Modified Files:
src/external/cddl/osnet/dist/uts/common/fs/zfs: dsl_dataset.c dsl_dir.c
spa.c zfs_ioctl.c zfs_vfsops.c zvol.c
src/external/cddl/osnet/dist/uts/common/fs/zfs/sys: zvol.h
Log Message:
Enable the zvol minor management to create and remove device nodes.
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 \
src/external/cddl/osnet/dist/uts/common/fs/zfs/dsl_dataset.c
cvs rdiff -u -r1.2 -r1.3 \
src/external/cddl/osnet/dist/uts/common/fs/zfs/dsl_dir.c
cvs rdiff -u -r1.8 -r1.9 src/external/cddl/osnet/dist/uts/common/fs/zfs/spa.c
cvs rdiff -u -r1.18 -r1.19 \
src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c
cvs rdiff -u -r1.22 -r1.23 \
src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c
cvs rdiff -u -r1.9 -r1.10 \
src/external/cddl/osnet/dist/uts/common/fs/zfs/zvol.c
cvs rdiff -u -r1.4 -r1.5 \
src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/zvol.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/dsl_dataset.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/dsl_dataset.c:1.3 src/external/cddl/osnet/dist/uts/common/fs/zfs/dsl_dataset.c:1.4
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/dsl_dataset.c:1.3 Mon May 28 21:05:07 2018
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/dsl_dataset.c Wed May 22 08:45:32 2019
@@ -1612,7 +1612,7 @@ dsl_dataset_snapshot(nvlist_t *snaps, nv
fnvlist_free(suspended);
}
-#ifdef __FreeBSD__
+#if defined(__FreeBSD__) || defined(__NetBSD__)
#ifdef _KERNEL
if (error == 0) {
for (pair = nvlist_next_nvpair(snaps, NULL); pair != NULL;
@@ -2164,7 +2164,7 @@ static int
dsl_dataset_rename_snapshot_sync_impl(dsl_pool_t *dp,
dsl_dataset_t *hds, void *arg)
{
-#ifdef __FreeBSD__
+#if defined(__FreeBSD__) || defined(__NetBSD__)
#ifdef _KERNEL
char *oldname, *newname;
#endif
@@ -2197,7 +2197,7 @@ dsl_dataset_rename_snapshot_sync_impl(ds
dsl_dataset_phys(hds)->ds_snapnames_zapobj,
ds->ds_snapname, 8, 1, &ds->ds_object, tx));
-#ifdef __FreeBSD__
+#if defined(__FreeBSD__) || defined(__NetBSD__)
#ifdef _KERNEL
oldname = kmem_alloc(MAXPATHLEN, KM_SLEEP);
newname = kmem_alloc(MAXPATHLEN, KM_SLEEP);
@@ -2640,7 +2640,7 @@ dsl_dataset_promote_sync(void *arg, dmu_
dsl_dir_t *odd = NULL;
uint64_t oldnext_obj;
int64_t delta;
-#if defined(__FreeBSD__) && defined(_KERNEL)
+#if (defined(__FreeBSD__) || defined(__NetBSD__)) && defined(_KERNEL)
char *oldname, *newname;
#endif
@@ -2710,7 +2710,7 @@ dsl_dataset_promote_sync(void *arg, dmu_
dsl_dir_phys(dd)->dd_clones, origin_head->ds_object, tx));
}
-#if defined(__FreeBSD__) && defined(_KERNEL)
+#if (defined(__FreeBSD__) || defined(__NetBSD__)) && defined(_KERNEL)
/* Take the spa_namespace_lock early so zvol renames don't deadlock. */
mutex_enter(&spa_namespace_lock);
@@ -2752,7 +2752,7 @@ dsl_dataset_promote_sync(void *arg, dmu_
VERIFY0(dsl_dir_hold_obj(dp, dd->dd_object,
NULL, ds, &ds->ds_dir));
-#if defined(__FreeBSD__) && defined(_KERNEL)
+#if (defined(__FreeBSD__) || defined(__NetBSD__)) && defined(_KERNEL)
dsl_dataset_name(ds, newname);
zfsvfs_update_fromname(oldname, newname);
zvol_rename_minors(oldname, newname);
Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/dsl_dir.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/dsl_dir.c:1.2 src/external/cddl/osnet/dist/uts/common/fs/zfs/dsl_dir.c:1.3
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/dsl_dir.c:1.2 Mon May 28 21:05:07 2018
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/dsl_dir.c Wed May 22 08:45:32 2019
@@ -1912,7 +1912,7 @@ dsl_dir_rename_sync(void *arg, dmu_tx_t
VERIFY0(zap_add(mos, dsl_dir_phys(newparent)->dd_child_dir_zapobj,
dd->dd_myname, 8, 1, &dd->dd_object, tx));
-#ifdef __FreeBSD__
+#if defined(__FreeBSD__) || defined(__NetBSD__)
#ifdef _KERNEL
zfsvfs_update_fromname(ddra->ddra_oldname, ddra->ddra_newname);
zvol_rename_minors(ddra->ddra_oldname, ddra->ddra_newname);
Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/spa.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/spa.c:1.8 src/external/cddl/osnet/dist/uts/common/fs/zfs/spa.c:1.9
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/spa.c:1.8 Tue May 7 08:49:59 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/spa.c Wed May 22 08:45:32 2019
@@ -3226,7 +3226,7 @@ spa_open_common(const char *pool, spa_t
spa->spa_last_ubsync_txg = 0;
spa->spa_load_txg = 0;
mutex_exit(&spa_namespace_lock);
-#ifdef __FreeBSD__
+#if defined(__FreeBSD__) || defined(__NetBSD__)
#ifdef _KERNEL
if (firstopen)
zvol_create_minors(spa->spa_name);
@@ -4508,7 +4508,7 @@ spa_import(const char *pool, nvlist_t *c
mutex_exit(&spa_namespace_lock);
-#ifdef __FreeBSD__
+#if defined(__FreeBSD__) || defined(__NetBSD__)
#ifdef _KERNEL
zvol_create_minors(pool);
#endif
Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c:1.18 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c:1.19
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c:1.18 Wed May 22 08:44:48 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c Wed May 22 08:45:32 2019
@@ -3360,10 +3360,8 @@ zfs_ioc_create(const char *fsname, nvlis
if (error != 0)
(void) dsl_destroy_head(fsname);
}
-#ifdef __FreeBSD__
if (error == 0 && type == DMU_OST_ZVOL)
zvol_create_minors(fsname);
-#endif
return (error);
}
@@ -3405,10 +3403,8 @@ zfs_ioc_clone(const char *fsname, nvlist
if (error != 0)
(void) dsl_destroy_head(fsname);
}
-#ifdef __FreeBSD__
if (error == 0)
zvol_create_minors(fsname);
-#endif
return (error);
}
@@ -3681,9 +3677,7 @@ zfs_ioc_destroy_snaps(const char *poolna
error = zfs_unmount_snap(name);
if (error != 0)
return (error);
-#if defined(__FreeBSD__)
zvol_remove_minors(name);
-#endif
}
return (dsl_destroy_snapshots_nvl(snaps, defer, outnvl));
@@ -3807,7 +3801,7 @@ zfs_ioc_destroy(zfs_cmd_t *zc)
else
err = dsl_destroy_head(zc->zc_name);
if (zc->zc_objset_type == DMU_OST_ZVOL && err == 0)
-#ifdef __FreeBSD__
+#if defined(__FreeBSD__) || defined(__NetBSD__)
zvol_remove_minors(zc->zc_name);
#else
(void) zvol_remove_minor(zc->zc_name);
@@ -4550,10 +4544,8 @@ zfs_ioc_recv(zfs_cmd_t *zc)
}
#endif
-#ifdef __FreeBSD__
if (error == 0)
zvol_create_minors(tofs);
-#endif
/*
* On error, restore the original props.
@@ -6166,7 +6158,9 @@ zfsdev_minor_alloc(void)
static minor_t last_minor;
minor_t m;
+#ifndef __NetBSD__
ASSERT(MUTEX_HELD(&spa_namespace_lock));
+#endif
for (m = last_minor + 1; m != last_minor; m++) {
if (m > ZFSDEV_MAX_MINOR)
Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c:1.22 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c:1.23
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c:1.22 Mon Apr 15 12:59:38 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c Wed May 22 08:45:32 2019
@@ -2956,7 +2956,7 @@ zfs_get_zplprop(objset_t *os, zfs_prop_t
return (error);
}
-#ifdef __FreeBSD_kernel__
+#if defined(__FreeBSD_kernel__) || defined(__NetBSD__)
#ifdef _KERNEL
void
zfsvfs_update_fromname(const char *oldname, const char *newname)
@@ -2968,8 +2968,14 @@ zfsvfs_update_fromname(const char *oldna
oldlen = strlen(oldname);
+#ifdef __NetBSD__
+ mount_iterator_t *iter;
+ mountlist_iterator_init(&iter);
+ while ((mp = mountlist_iterator_next(iter)) != NULL) {
+#else
mtx_lock(&mountlist_mtx);
TAILQ_FOREACH(mp, &mountlist, mnt_list) {
+#endif
fromname = mp->mnt_stat.f_mntfromname;
if (strcmp(fromname, oldname) == 0) {
(void)strlcpy(fromname, newname,
@@ -2985,7 +2991,11 @@ zfsvfs_update_fromname(const char *oldna
continue;
}
}
+#ifdef __NetBSD__
+ mountlist_iterator_destroy(iter);
+#else
mtx_unlock(&mountlist_mtx);
+#endif
}
#endif
#endif
Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zvol.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zvol.c:1.9 src/external/cddl/osnet/dist/uts/common/fs/zfs/zvol.c:1.10
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zvol.c:1.9 Wed May 22 08:44:48 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zvol.c Wed May 22 08:45:32 2019
@@ -870,7 +870,7 @@ zvol_create_minor(const char *name)
(void) strlcpy(zv->zv_name, name, MAXPATHLEN);
zv->zv_min_bs = DEV_BSHIFT;
-#ifdef illumos
+#if defined(illumos) || defined(__NetBSD__)
zv->zv_minor = minor;
#endif
zv->zv_objset = os;
@@ -950,12 +950,17 @@ zvol_remove_zv(zvol_state_t *zv)
char nmbuf[20];
minor_t minor = zv->zv_minor;
- /* XXXNETBSD needs changes here */
- (void) snprintf(nmbuf, sizeof (nmbuf), "%u,raw", zv->zv_minor);
+ LIST_REMOVE(zv, zv_links);
+
+ (void) snprintf(nmbuf, sizeof (nmbuf), "%s", zv->zv_name);
ddi_remove_minor_node(zfs_dip, nmbuf);
- (void) snprintf(nmbuf, sizeof (nmbuf), "%u", zv->zv_minor);
+ (void) snprintf(nmbuf, sizeof (nmbuf), "%s", zv->zv_name);
ddi_remove_minor_node(zfs_dip, nmbuf);
+
+ disk_detach(&zv->zv_dk);
+ disk_destroy(&zv->zv_dk);
+ mutex_destroy(&zv->zv_dklock);
#endif
avl_destroy(&zv->zv_znode.z_range_avl);
@@ -983,6 +988,11 @@ zvol_remove_minor(const char *name)
mutex_exit(&zfsdev_state_lock);
return (SET_ERROR(ENXIO));
}
+#ifdef __NetBSD__
+ disk_detach(&zv->zv_dk);
+ disk_destroy(&zv->zv_dk);
+ mutex_destroy(&zv->zv_dklock);
+#endif
rc = zvol_remove_zv(zv);
mutex_exit(&zfsdev_state_lock);
return (rc);
@@ -1058,12 +1068,6 @@ zvol_last_close(zvol_state_t *zv)
dmu_objset_disown(zv->zv_objset, zvol_tag);
zv->zv_objset = NULL;
-#ifdef __NetBSD__xxx
- /* the old code has this here, but it's in the wrong place. */
- disk_detach(&zv->zv_dk);
- disk_destroy(&zv->zv_dk);
- mutex_destroy(&zv->zv_dklock);
-#endif
}
#ifdef illumos
@@ -3125,6 +3129,7 @@ zvol_geom_worker(void *arg)
}
}
}
+#endif
extern boolean_t dataset_name_hidden(const char *name);
@@ -3243,6 +3248,26 @@ zvol_create_minors(const char *name)
return (0);
}
+#ifdef __NetBSD__
+void
+zvol_rename_minor(zvol_state_t *zv, const char *newname)
+{
+ char *nm;
+ minor_t minor = zv->zv_minor;
+
+ nm = PNBUF_GET();
+ strlcpy(nm, newname, MAXPATHLEN);
+ ddi_remove_minor_node(zfs_dip, zv->zv_name);
+ (void)ddi_create_minor_node(zfs_dip, nm, S_IFCHR, minor, DDI_PSEUDO, 0);
+ (void)ddi_create_minor_node(zfs_dip, nm, S_IFBLK, minor, DDI_PSEUDO, 0);
+ PNBUF_PUT(nm);
+
+ strlcpy(zv->zv_name, newname, sizeof(zv->zv_name));
+ /* XXX Update dk_name? */
+}
+#endif
+
+#ifdef __FreeBSD__
static void
zvol_rename_minor(zvol_state_t *zv, const char *newname)
{
@@ -3297,6 +3322,7 @@ zvol_rename_minor(zvol_state_t *zv, cons
}
strlcpy(zv->zv_name, newname, sizeof(zv->zv_name));
}
+#endif
void
zvol_rename_minors(const char *oldname, const char *newname)
@@ -3337,6 +3363,7 @@ zvol_rename_minors(const char *oldname,
PICKUP_GIANT();
}
+#ifdef __FreeBSD__
static int
zvol_d_open(struct cdev *dev, int flags, int fmt, struct thread *td)
{
Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/zvol.h
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/zvol.h:1.4 src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/zvol.h:1.5
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/zvol.h:1.4 Mon May 28 21:05:07 2018
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/zvol.h Wed May 22 08:45:32 2019
@@ -75,7 +75,7 @@ extern void zvol_log_write_minor(void *m
ssize_t resid, boolean_t sync);
#endif /* illumos */
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
extern int zvol_create_minors(const char *name);
extern void zvol_rename_minors(const char *oldname, const char *newname);
#endif