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

Reply via email to