diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h index c3d47ba1707..62e9ba847fd 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h @@ -426,7 +426,11 @@ extern int zfs_secpolicy_destroy_perms(const char *, cred_t *); extern int zfs_busy(void); extern void zfs_unmount_snap(const char *); extern void zfs_destroy_unmount_origin(const char *); +#ifdef illumos extern int getzfsvfs_impl(struct objset *, struct zfsvfs **); +#else +extern int getzfsvfs_impl(struct objset *, vfs_t **); +#endif extern int getzfsvfs(const char *, struct zfsvfs **); /* diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zcp_get.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zcp_get.c index fd85e27a63f..964b5f1037a 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zcp_get.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zcp_get.c @@ -226,7 +226,9 @@ get_temporary_prop(dsl_dataset_t *ds, zfs_prop_t zfs_prop, uint64_t *val, return (0); #else int error; +#ifdef illumos zfsvfs_t *zfvp; +#endif vfs_t *vfsp; objset_t *os; uint64_t tmp = *val; @@ -235,12 +237,12 @@ get_temporary_prop(dsl_dataset_t *ds, zfs_prop_t zfs_prop, uint64_t *val, if (error != 0) return (error); - error = getzfsvfs_impl(os, &zfvp); + error = getzfsvfs_impl(os, &vfsp); if (error != 0) return (error); - +#ifdef illumos vfsp = zfvp->z_vfs; - +#endif switch (zfs_prop) { case ZFS_PROP_ATIME: if (vfs_optionisset(vfsp, MNTOPT_NOATIME, NULL)) diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c index cf8c303fb23..562a6cd8fd5 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c @@ -1448,9 +1448,9 @@ put_nvlist(zfs_cmd_t *zc, nvlist_t *nvl) } int -getzfsvfs_impl(objset_t *os, zfsvfs_t **zfvp) +getzfsvfs_impl(objset_t *os, vfs_t **vfsp) { - vfs_t *vfsp; + zfsvfs_t *zfvp; int error = 0; if (dmu_objset_type(os) != DMU_OST_ZFS) { @@ -1458,9 +1458,10 @@ getzfsvfs_impl(objset_t *os, zfsvfs_t **zfvp) } mutex_enter(&os->os_user_ptr_lock); - *zfvp = dmu_objset_get_user(os); - if (*zfvp) { - vfs_ref((*zfvp)->z_vfs); + zfvp = dmu_objset_get_user(os); + if (zfvp) { + *vfsp = zfvp->z_vfs; + vfs_ref(zfvp->z_vfs); } else { error = SET_ERROR(ESRCH); } @@ -1468,57 +1469,31 @@ getzfsvfs_impl(objset_t *os, zfsvfs_t **zfvp) return (error); } -#ifdef illumos int getzfsvfs(const char *dsname, zfsvfs_t **zfvp) { objset_t *os; + vfs_t *vfsp; int error; error = dmu_objset_hold(dsname, FTAG, &os); if (error != 0) return (error); - - error = getzfsvfs_impl(os, zfvp); + error = getzfsvfs_impl(os, &vfsp); dmu_objset_rele(os, FTAG); - return (error); -} - -#else - -static int -getzfsvfs_ref(const char *dsname, zfsvfs_t **zfvp) -{ - objset_t *os; - int error; - - error = dmu_objset_hold(dsname, FTAG, &os); if (error != 0) return (error); - error = getzfsvfs_impl(os, zfvp); - dmu_objset_rele(os, FTAG); - return (error); -} - -int -getzfsvfs(const char *dsname, zfsvfs_t **zfvp) -{ - objset_t *os; - int error; - - error = getzfsvfs_ref(dsname, zfvp); - if (error != 0) - return (error); - error = vfs_busy((*zfvp)->z_vfs, 0); - vfs_rel((*zfvp)->z_vfs); + error = vfs_busy(vfsp, 0); + vfs_rel(vfsp); if (error != 0) { *zfvp = NULL; error = SET_ERROR(ESRCH); + } else { + *zfvp = vfsp->vfs_data; } return (error); } -#endif /* * Find a zfsvfs_t for a mounted filesystem, or create our own, in which @@ -3597,7 +3572,7 @@ zfs_unmount_snap(const char *snapname) if (strchr(snapname, '@') == NULL) return; - int err = getzfsvfs_ref(snapname, &zfsvfs); + int err = getzfsvfs(snapname, &zfsvfs); if (err != 0) { ASSERT3P(zfsvfs, ==, NULL); return; @@ -3619,6 +3594,8 @@ zfs_unmount_snap(const char *snapname) #ifdef illumos (void) dounmount(vfsp, MS_FORCE, kcred); #else + vfs_ref(vfsp); + vfs_unbusy(vfsp); (void) dounmount(vfsp, MS_FORCE, curthread); #endif }