Changeset View
Changeset View
Standalone View
Standalone View
lib/libbe/be_info.c
Show All 24 Lines | |||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
* SUCH DAMAGE. | * SUCH DAMAGE. | ||||
*/ | */ | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include <sys/zfs_context.h> | #include <sys/zfs_context.h> | ||||
#include <libzfsbootenv.h> | |||||
#include "be.h" | #include "be.h" | ||||
#include "be_impl.h" | #include "be_impl.h" | ||||
static int snapshot_proplist_update(zfs_handle_t *hdl, prop_data_t *data); | static int snapshot_proplist_update(zfs_handle_t *hdl, prop_data_t *data); | ||||
/* | /* | ||||
* Returns the name of the active boot environment | * Returns the name of the active boot environment | ||||
▲ Show 20 Lines • Show All 62 Lines • ▼ Show 20 Lines | |||||
int | int | ||||
be_get_bootenv_props(libbe_handle_t *lbh, nvlist_t *dsnvl) | be_get_bootenv_props(libbe_handle_t *lbh, nvlist_t *dsnvl) | ||||
{ | { | ||||
prop_data_t data; | prop_data_t data; | ||||
data.lbh = lbh; | data.lbh = lbh; | ||||
data.list = dsnvl; | data.list = dsnvl; | ||||
data.single_object = false; | data.single_object = false; | ||||
data.bootonce = NULL; | |||||
return (be_proplist_update(&data)); | return (be_proplist_update(&data)); | ||||
} | } | ||||
int | int | ||||
be_get_dataset_props(libbe_handle_t *lbh, const char *name, nvlist_t *props) | be_get_dataset_props(libbe_handle_t *lbh, const char *name, nvlist_t *props) | ||||
{ | { | ||||
zfs_handle_t *snap_hdl; | zfs_handle_t *snap_hdl; | ||||
prop_data_t data; | prop_data_t data; | ||||
int ret; | int ret; | ||||
data.lbh = lbh; | data.lbh = lbh; | ||||
data.list = props; | data.list = props; | ||||
data.single_object = true; | data.single_object = true; | ||||
data.bootonce = NULL; | |||||
if ((snap_hdl = zfs_open(lbh->lzh, name, | if ((snap_hdl = zfs_open(lbh->lzh, name, | ||||
ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT)) == NULL) | ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT)) == NULL) | ||||
return (BE_ERR_ZFSOPEN); | return (BE_ERR_ZFSOPEN); | ||||
ret = prop_list_builder_cb(snap_hdl, &data); | ret = prop_list_builder_cb(snap_hdl, &data); | ||||
zfs_close(snap_hdl); | zfs_close(snap_hdl); | ||||
return (ret); | return (ret); | ||||
} | } | ||||
int | int | ||||
be_get_dataset_snapshots(libbe_handle_t *lbh, const char *name, nvlist_t *props) | be_get_dataset_snapshots(libbe_handle_t *lbh, const char *name, nvlist_t *props) | ||||
{ | { | ||||
zfs_handle_t *ds_hdl; | zfs_handle_t *ds_hdl; | ||||
prop_data_t data; | prop_data_t data; | ||||
int ret; | int ret; | ||||
data.lbh = lbh; | data.lbh = lbh; | ||||
data.list = props; | data.list = props; | ||||
data.single_object = false; | data.single_object = false; | ||||
data.bootonce = NULL; | |||||
if ((ds_hdl = zfs_open(lbh->lzh, name, | if ((ds_hdl = zfs_open(lbh->lzh, name, | ||||
ZFS_TYPE_FILESYSTEM)) == NULL) | ZFS_TYPE_FILESYSTEM)) == NULL) | ||||
return (BE_ERR_ZFSOPEN); | return (BE_ERR_ZFSOPEN); | ||||
ret = snapshot_proplist_update(ds_hdl, &data); | ret = snapshot_proplist_update(ds_hdl, &data); | ||||
zfs_close(ds_hdl); | zfs_close(ds_hdl); | ||||
return (ret); | return (ret); | ||||
} | } | ||||
Show All 23 Lines | prop_list_builder_cb(zfs_handle_t *zfs_hdl, void *data_p) | ||||
if (data->single_object) | if (data->single_object) | ||||
props = data->list; | props = data->list; | ||||
else | else | ||||
nvlist_alloc(&props, NV_UNIQUE_NAME, KM_SLEEP); | nvlist_alloc(&props, NV_UNIQUE_NAME, KM_SLEEP); | ||||
dataset = zfs_get_name(zfs_hdl); | dataset = zfs_get_name(zfs_hdl); | ||||
nvlist_add_string(props, "dataset", dataset); | nvlist_add_string(props, "dataset", dataset); | ||||
if (data->bootonce != NULL && | |||||
strcmp(dataset, data->bootonce) == 0) | |||||
nvlist_add_boolean_value(props, "bootonce", true); | |||||
name = strrchr(dataset, '/') + 1; | name = strrchr(dataset, '/') + 1; | ||||
nvlist_add_string(props, "name", name); | nvlist_add_string(props, "name", name); | ||||
mounted = zfs_is_mounted(zfs_hdl, &mountpoint); | mounted = zfs_is_mounted(zfs_hdl, &mountpoint); | ||||
if (mounted) | if (mounted) | ||||
nvlist_add_string(props, "mounted", mountpoint); | nvlist_add_string(props, "mounted", mountpoint); | ||||
▲ Show 20 Lines • Show All 50 Lines • ▼ Show 20 Lines | |||||
int | int | ||||
be_proplist_update(prop_data_t *data) | be_proplist_update(prop_data_t *data) | ||||
{ | { | ||||
zfs_handle_t *root_hdl; | zfs_handle_t *root_hdl; | ||||
if ((root_hdl = zfs_open(data->lbh->lzh, data->lbh->root, | if ((root_hdl = zfs_open(data->lbh->lzh, data->lbh->root, | ||||
ZFS_TYPE_FILESYSTEM)) == NULL) | ZFS_TYPE_FILESYSTEM)) == NULL) | ||||
return (BE_ERR_ZFSOPEN); | return (BE_ERR_ZFSOPEN); | ||||
(void) lzbe_get_boot_device(zpool_get_name(data->lbh->active_phandle), | |||||
&data->bootonce); | |||||
/* XXX TODO: some error checking here */ | /* XXX TODO: some error checking here */ | ||||
zfs_iter_filesystems(root_hdl, prop_list_builder_cb, data); | zfs_iter_filesystems(root_hdl, prop_list_builder_cb, data); | ||||
zfs_close(root_hdl); | zfs_close(root_hdl); | ||||
return (0); | return (0); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 52 Lines • Show Last 20 Lines |