diff options
author | Kyle Evans <kevans@FreeBSD.org> | 2018-08-07 03:07:54 +0000 |
---|---|---|
committer | Kyle Evans <kevans@FreeBSD.org> | 2018-08-07 03:07:54 +0000 |
commit | 709b553cd0308060a548c1aa9c6ff026b1dcdd1e (patch) | |
tree | 96ade271040e8ad7d14b27d1faaba740bdddc6e7 /lib/libbe/be_info.c | |
parent | 9c65c7fb48ca4907091fe75075e7fbdf11ed9840 (diff) | |
download | src-709b553cd0308060a548c1aa9c6ff026b1dcdd1e.tar.gz src-709b553cd0308060a548c1aa9c6ff026b1dcdd1e.zip |
libbe(3): Check that dataset is to be mounted at / for be_exists
This makes the be_exists behavior match the comments that assert that we've
already checked that the dataset derived from the BE name is set to mount at
/.
Other changes of note:
- bectl_list sees another change; changing mountpoint based on mount status
turns out to be a bad idea, so instead make the mounted property of the
returned nvlist the path that it's mounted at
- Always return the "mountpoint" property in "mountpoint" if it's ste
Notes
Notes:
svn path=/projects/bectl/; revision=337406
Diffstat (limited to 'lib/libbe/be_info.c')
-rw-r--r-- | lib/libbe/be_info.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/lib/libbe/be_info.c b/lib/libbe/be_info.c index fa7c2254d724..04bbd71c4f7b 100644 --- a/lib/libbe/be_info.c +++ b/lib/libbe/be_info.c @@ -172,10 +172,13 @@ prop_list_builder_cb(zfs_handle_t *zfs_hdl, void *data_p) nvlist_add_string(props, "name", name); mounted = zfs_is_mounted(zfs_hdl, &mountpoint); - nvlist_add_boolean_value(props, "mounted", mounted); if (mounted) - nvlist_add_string(props, "mountpoint", mountpoint); + nvlist_add_string(props, "mounted", mountpoint); + + if (zfs_prop_get(zfs_hdl, ZFS_PROP_MOUNTPOINT, buf, 512, + NULL, NULL, 0, 1) == 0) + nvlist_add_string(props, "mountpoint", buf); if (zfs_prop_get(zfs_hdl, ZFS_PROP_ORIGIN, buf, 512, NULL, NULL, 0, 1) == 0) @@ -282,12 +285,32 @@ bool be_exists(libbe_handle_t *lbh, char *be) { char buf[BE_MAXPATHLEN]; + nvlist_t *dsprops; + char *mntpoint; + bool valid; be_root_concat(lbh, be, buf); - /* - * XXX TODO: check mountpoint prop and see if its /, AND that result - * with below expression. - */ - return (zfs_dataset_exists(lbh->lzh, buf, ZFS_TYPE_DATASET)); + if (!zfs_dataset_exists(lbh->lzh, buf, ZFS_TYPE_DATASET)) + return (false); + + /* Also check if it's mounted at / */ + if (be_prop_list_alloc(&dsprops) != 0) { + set_error(lbh, BE_ERR_UNKNOWN); + return (false); + } + + if (be_get_dataset_props(lbh, buf, dsprops) != 0) { + nvlist_free(dsprops); + return (false); + } + + if (nvlist_lookup_string(dsprops, "mountpoint", &mntpoint) == 0) { + valid = (strcmp(mntpoint, "/") == 0); + nvlist_free(dsprops); + return (valid); + } + + nvlist_free(dsprops); + return (false); } |