summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Evans <kevans@FreeBSD.org>2018-11-19 02:16:20 +0000
committerKyle Evans <kevans@FreeBSD.org>2018-11-19 02:16:20 +0000
commitaf43c24d3d8bebf0ec88c2c449886cf14039a501 (patch)
tree7558071f05c6448ce393342892a0fa98f5a3df0c
parentcc624025b462a013629c52adc7db6adacf2d42f8 (diff)
Notes
-rw-r--r--lib/libbe/be.c15
-rw-r--r--lib/libbe/be_impl.h1
2 files changed, 15 insertions, 1 deletions
diff --git a/lib/libbe/be.c b/lib/libbe/be.c
index 973ebb1adeb9..d084702bedce 100644
--- a/lib/libbe/be.c
+++ b/lib/libbe/be.c
@@ -305,6 +305,7 @@ be_deep_clone_prop(int prop, void *cb)
zprop_source_t src;
char pval[BE_MAXPATHLEN];
char source[BE_MAXPATHLEN];
+ char *val;
dccb = cb;
/* Skip some properties we don't want to touch */
@@ -324,7 +325,15 @@ be_deep_clone_prop(int prop, void *cb)
if (src != ZPROP_SRC_LOCAL)
return (ZPROP_CONT);
- nvlist_add_string(dccb->props, zfs_prop_to_name(prop), (char *)pval);
+ /* Augment mountpoint with altroot, if needed */
+ val = pval;
+ if (prop == ZFS_PROP_MOUNTPOINT && *dccb->altroot != '\0') {
+ if (pval[strlen(dccb->altroot)] == '\0')
+ strlcpy(pval, "/", sizeof(pval));
+ else
+ val = pval + strlen(dccb->altroot);
+ }
+ nvlist_add_string(dccb->props, zfs_prop_to_name(prop), val);
return (ZPROP_CONT);
}
@@ -367,6 +376,10 @@ be_deep_clone(zfs_handle_t *ds, void *data)
dccb.zhp = ds;
dccb.props = props;
+ if (zpool_get_prop(isdc->lbh->active_phandle, ZPOOL_PROP_ALTROOT,
+ dccb.altroot, sizeof(dccb.altroot), NULL, true) != 0 ||
+ strcmp(dccb.altroot, "-") == 0)
+ *dccb.altroot = '\0';
if (zprop_iter(be_deep_clone_prop, &dccb, B_FALSE, B_FALSE,
ZFS_TYPE_FILESYSTEM) == ZPROP_INVAL)
return (-1);
diff --git a/lib/libbe/be_impl.h b/lib/libbe/be_impl.h
index 99c783a1a646..093b3c01e17e 100644
--- a/lib/libbe/be_impl.h
+++ b/lib/libbe/be_impl.h
@@ -55,6 +55,7 @@ struct libbe_deep_clone {
struct libbe_dccb {
zfs_handle_t *zhp;
nvlist_t *props;
+ char altroot[MAXPATHLEN];
};
typedef struct prop_data {