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