summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/libspl/Makefile.am7
-rw-r--r--lib/libspl/include/limits.h5
-rw-r--r--lib/libspl/include/zone.h9
-rw-r--r--lib/libspl/os/freebsd/zone.c46
-rw-r--r--lib/libspl/zone.c31
-rw-r--r--lib/libzfs/libzfs_changelist.c8
-rw-r--r--lib/libzfs/libzfs_dataset.c32
-rw-r--r--lib/libzpool/kernel.c6
8 files changed, 90 insertions, 54 deletions
diff --git a/lib/libspl/Makefile.am b/lib/libspl/Makefile.am
index f576d69248fa..fc4f27c64e3e 100644
--- a/lib/libspl/Makefile.am
+++ b/lib/libspl/Makefile.am
@@ -27,7 +27,6 @@ USER_C = \
strlcat.c \
strlcpy.c \
timestamp.c \
- zone.c \
include/sys/list.h \
include/sys/list_impl.h
@@ -35,7 +34,8 @@ if BUILD_LINUX
USER_C += \
os/linux/getexecname.c \
os/linux/gethostid.c \
- os/linux/getmntany.c
+ os/linux/getmntany.c \
+ os/linux/zone.c
endif
if BUILD_FREEBSD
@@ -43,7 +43,8 @@ USER_C += \
os/freebsd/getexecname.c \
os/freebsd/gethostid.c \
os/freebsd/getmntany.c \
- os/freebsd/mnttab.c
+ os/freebsd/mnttab.c \
+ os/freebsd/zone.c
endif
libspl_la_SOURCES = \
diff --git a/lib/libspl/include/limits.h b/lib/libspl/include/limits.h
index 1a42cfec469c..5d996eb846d1 100644
--- a/lib/libspl/include/limits.h
+++ b/lib/libspl/include/limits.h
@@ -25,16 +25,21 @@
*/
#include_next <limits.h>
+#include <float.h>
#ifndef _LIBSPL_LIMITS_H
#define _LIBSPL_LIMITS_H
+#ifndef DBL_DIG
#define DBL_DIG 15
#define DBL_MAX 1.7976931348623157081452E+308
#define DBL_MIN 2.2250738585072013830903E-308
+#endif
+#ifndef FLT_DIG
#define FLT_DIG 6
#define FLT_MAX 3.4028234663852885981170E+38F
#define FLT_MIN 1.1754943508222875079688E-38F
+#endif
#endif /* _LIBSPL_LIMITS_H */
diff --git a/lib/libspl/include/zone.h b/lib/libspl/include/zone.h
index b4a6deb40ce4..b0ac2d9bc610 100644
--- a/lib/libspl/include/zone.h
+++ b/lib/libspl/include/zone.h
@@ -26,25 +26,16 @@
#ifndef _LIBSPL_ZONE_H
#define _LIBSPL_ZONE_H
-
-
#include <sys/types.h>
#include <sys/zone.h>
-#include <sys/priv.h>
#ifdef __cplusplus
extern "C" {
#endif
#define GLOBAL_ZONEID 0
-#define GLOBAL_ZONEID_NAME "global"
-/*
- * Functions for mapping between id and name for active zones.
- */
extern zoneid_t getzoneid(void);
-extern zoneid_t getzoneidbyname(const char *);
-extern ssize_t getzonenamebyid(zoneid_t, char *, size_t);
#ifdef __cplusplus
}
diff --git a/lib/libspl/os/freebsd/zone.c b/lib/libspl/os/freebsd/zone.c
new file mode 100644
index 000000000000..c07cb0532e16
--- /dev/null
+++ b/lib/libspl/os/freebsd/zone.c
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2007 Pawel Jakub Dawidek <pjd@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <stdlib.h>
+#include <assert.h>
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <zone.h>
+
+zoneid_t
+getzoneid(void)
+{
+ size_t size;
+ int jailid;
+
+ /* Information that we are in jail or not is enough for our needs. */
+ size = sizeof (jailid);
+ if (sysctlbyname("security.jail.jailed", &jailid, &size, NULL, 0) == -1)
+ assert(!"No security.jail.jailed sysctl!");
+ return ((zoneid_t)jailid);
+}
diff --git a/lib/libspl/zone.c b/lib/libspl/zone.c
index 5ca93b224d9e..a71c4e0b275b 100644
--- a/lib/libspl/zone.c
+++ b/lib/libspl/zone.c
@@ -24,40 +24,9 @@
*/
#include <zone.h>
-#include <string.h>
-#include <errno.h>
zoneid_t
getzoneid()
{
return (GLOBAL_ZONEID);
}
-
-zoneid_t
-getzoneidbyname(const char *name)
-{
- if (name == NULL)
- return (GLOBAL_ZONEID);
-
- if (strcmp(name, GLOBAL_ZONEID_NAME) == 0)
- return (GLOBAL_ZONEID);
-
- return (EINVAL);
-}
-
-ssize_t
-getzonenamebyid(zoneid_t id, char *buf, size_t buflen)
-{
- if (id != GLOBAL_ZONEID)
- return (EINVAL);
-
- ssize_t ret = strlen(GLOBAL_ZONEID_NAME) + 1;
-
- if (buf == NULL || buflen == 0)
- return (ret);
-
- strncpy(buf, GLOBAL_ZONEID_NAME, buflen);
- buf[buflen - 1] = '\0';
-
- return (ret);
-}
diff --git a/lib/libzfs/libzfs_changelist.c b/lib/libzfs/libzfs_changelist.c
index fec2fd5f2648..1592b75eb098 100644
--- a/lib/libzfs/libzfs_changelist.c
+++ b/lib/libzfs/libzfs_changelist.c
@@ -128,6 +128,8 @@ changelist_prefix(prop_changelist_t *clp)
*/
switch (clp->cl_prop) {
case ZFS_PROP_MOUNTPOINT:
+ if (clp->cl_gflags & CL_GATHER_DONT_UNMOUNT)
+ break;
if (zfs_unmount(cn->cn_handle, NULL,
clp->cl_mflags) != 0) {
ret = -1;
@@ -184,7 +186,8 @@ changelist_postfix(prop_changelist_t *clp)
if ((cn = uu_avl_last(clp->cl_tree)) == NULL)
return (0);
- if (clp->cl_prop == ZFS_PROP_MOUNTPOINT)
+ if (clp->cl_prop == ZFS_PROP_MOUNTPOINT &&
+ !(clp->cl_gflags & CL_GATHER_DONT_UNMOUNT))
remove_mountpoint(cn->cn_handle);
/*
@@ -235,7 +238,8 @@ changelist_postfix(prop_changelist_t *clp)
needs_key = (zfs_prop_get_int(cn->cn_handle,
ZFS_PROP_KEYSTATUS) == ZFS_KEYSTATUS_UNAVAILABLE);
- mounted = zfs_is_mounted(cn->cn_handle, NULL);
+ mounted = (clp->cl_gflags & CL_GATHER_DONT_UNMOUNT) ||
+ zfs_is_mounted(cn->cn_handle, NULL);
if (!mounted && !needs_key && (cn->cn_mounted ||
((sharenfs || sharesmb || clp->cl_waslegacy) &&
diff --git a/lib/libzfs/libzfs_dataset.c b/lib/libzfs/libzfs_dataset.c
index d548cc0ecabc..2c707f23f4b0 100644
--- a/lib/libzfs/libzfs_dataset.c
+++ b/lib/libzfs/libzfs_dataset.c
@@ -4370,14 +4370,14 @@ zfs_rollback(zfs_handle_t *zhp, zfs_handle_t *snap, boolean_t force)
* Renames the given dataset.
*/
int
-zfs_rename(zfs_handle_t *zhp, const char *target, boolean_t recursive,
- boolean_t force_unmount)
+zfs_rename(zfs_handle_t *zhp, const char *target, renameflags_t flags)
{
int ret = 0;
zfs_cmd_t zc = {"\0"};
char *delim;
prop_changelist_t *cl = NULL;
char parent[ZFS_MAX_DATASET_NAME_LEN];
+ char property[ZFS_MAXPROPLEN];
libzfs_handle_t *hdl = zhp->zfs_hdl;
char errbuf[1024];
@@ -4429,7 +4429,7 @@ zfs_rename(zfs_handle_t *zhp, const char *target, boolean_t recursive,
if (!zfs_validate_name(hdl, target, zhp->zfs_type, B_TRUE))
return (zfs_error(hdl, EZFS_INVALIDNAME, errbuf));
} else {
- if (recursive) {
+ if (flags.recursive) {
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
"recursive rename must be a snapshot"));
return (zfs_error(hdl, EZFS_BADTYPE, errbuf));
@@ -4470,8 +4470,19 @@ zfs_rename(zfs_handle_t *zhp, const char *target, boolean_t recursive,
return (zfs_error(hdl, EZFS_ZONED, errbuf));
}
- if (recursive) {
- zfs_handle_t *zhrp;
+ /*
+ * Avoid unmounting file systems with mountpoint property set to
+ * 'legacy' or 'none' even if -u option is not given.
+ */
+ if (zhp->zfs_type == ZFS_TYPE_FILESYSTEM &&
+ !flags.recursive && !flags.nounmount &&
+ zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, property,
+ sizeof (property), NULL, NULL, 0, B_FALSE) == 0 &&
+ (strcmp(property, "legacy") == 0 ||
+ strcmp(property, "none") == 0)) {
+ flags.nounmount = B_TRUE;
+ }
+ if (flags.recursive) {
char *parentname = zfs_strdup(zhp->zfs_hdl, zhp->zfs_name);
if (parentname == NULL) {
ret = -1;
@@ -4479,7 +4490,8 @@ zfs_rename(zfs_handle_t *zhp, const char *target, boolean_t recursive,
}
delim = strchr(parentname, '@');
*delim = '\0';
- zhrp = zfs_open(zhp->zfs_hdl, parentname, ZFS_TYPE_DATASET);
+ zfs_handle_t *zhrp = zfs_open(zhp->zfs_hdl, parentname,
+ ZFS_TYPE_DATASET);
free(parentname);
if (zhrp == NULL) {
ret = -1;
@@ -4488,8 +4500,9 @@ zfs_rename(zfs_handle_t *zhp, const char *target, boolean_t recursive,
zfs_close(zhrp);
} else if (zhp->zfs_type != ZFS_TYPE_SNAPSHOT) {
if ((cl = changelist_gather(zhp, ZFS_PROP_NAME,
+ flags.nounmount ? CL_GATHER_DONT_UNMOUNT :
CL_GATHER_ITER_MOUNTED,
- force_unmount ? MS_FORCE : 0)) == NULL)
+ flags.forceunmount ? MS_FORCE : 0)) == NULL)
return (-1);
if (changelist_haszonedchild(cl)) {
@@ -4513,7 +4526,8 @@ zfs_rename(zfs_handle_t *zhp, const char *target, boolean_t recursive,
(void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name));
(void) strlcpy(zc.zc_value, target, sizeof (zc.zc_value));
- zc.zc_cookie = recursive;
+ zc.zc_cookie = !!flags.recursive;
+ zc.zc_cookie |= (!!flags.nounmount) << 1;
if ((ret = zfs_ioctl(zhp->zfs_hdl, ZFS_IOC_RENAME, &zc)) != 0) {
/*
@@ -4523,7 +4537,7 @@ zfs_rename(zfs_handle_t *zhp, const char *target, boolean_t recursive,
(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
"cannot rename '%s'"), zc.zc_name);
- if (recursive && errno == EEXIST) {
+ if (flags.recursive && errno == EEXIST) {
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
"a child dataset already has a snapshot "
"with the new name"));
diff --git a/lib/libzpool/kernel.c b/lib/libzpool/kernel.c
index cba1d242b843..145b21d40f99 100644
--- a/lib/libzpool/kernel.c
+++ b/lib/libzpool/kernel.c
@@ -41,6 +41,7 @@
#include <sys/utsname.h>
#include <sys/zfs_context.h>
#include <sys/zfs_onexit.h>
+#include <sys/zfs_vfsops.h>
#include <sys/zstd/zstd.h>
#include <sys/zvol.h>
#include <zfs_fletcher.h>
@@ -1408,3 +1409,8 @@ zfs_file_put(int fd)
{
abort();
}
+
+void
+zfsvfs_update_fromname(const char *oldname, const char *newname)
+{
+}