Lines Matching refs:lbh
58 libbe_handle_t *lbh; member
65 static int be_create_child_noent(libbe_handle_t *lbh, const char *active,
67 static int be_create_child_cloned(libbe_handle_t *lbh, const char *active);
78 be_locate_rootfs(libbe_handle_t *lbh) in be_locate_rootfs() argument
96 zfs = zfs_path_to_zhandle(lbh->lzh, "/", ZFS_TYPE_FILESYSTEM); in be_locate_rootfs()
100 strlcpy(lbh->rootfs, zfs_get_name(zfs), sizeof(lbh->rootfs)); in be_locate_rootfs()
113 libbe_handle_t *lbh; in libbe_init() local
117 lbh = NULL; in libbe_init()
130 if ((lbh = calloc(1, sizeof(libbe_handle_t))) == NULL) in libbe_init()
133 if ((lbh->lzh = libzfs_init()) == NULL) in libbe_init()
140 if (be_locate_rootfs(lbh) != 0) { in libbe_init()
143 *lbh->rootfs = '\0'; in libbe_init()
147 strlcpy(lbh->root, lbh->rootfs, sizeof(lbh->root)); in libbe_init()
148 pos = strrchr(lbh->root, '/'); in libbe_init()
153 strlcpy(lbh->root, root, sizeof(lbh->root)); in libbe_init()
155 if ((pos = strchr(lbh->root, '/')) == NULL) in libbe_init()
158 pnamelen = pos - lbh->root; in libbe_init()
163 strlcpy(poolname, lbh->root, pnamelen + 1); in libbe_init()
164 if ((lbh->active_phandle = zpool_open(lbh->lzh, poolname)) == NULL) in libbe_init()
169 if (zpool_get_prop(lbh->active_phandle, ZPOOL_PROP_BOOTFS, lbh->bootfs, in libbe_init()
170 sizeof(lbh->bootfs), NULL, true) != 0) in libbe_init()
173 if (zpool_get_prop(lbh->active_phandle, ZPOOL_PROP_ALTROOT, in libbe_init()
176 lbh->altroot_len = strlen(altroot); in libbe_init()
178 (void) lzbe_get_boot_device(zpool_get_name(lbh->active_phandle), in libbe_init()
179 &lbh->bootonce); in libbe_init()
181 return (lbh); in libbe_init()
183 if (lbh != NULL) { in libbe_init()
184 if (lbh->active_phandle != NULL) in libbe_init()
185 zpool_close(lbh->active_phandle); in libbe_init()
186 if (lbh->lzh != NULL) in libbe_init()
187 libzfs_fini(lbh->lzh); in libbe_init()
188 free(lbh); in libbe_init()
199 libbe_close(libbe_handle_t *lbh) in libbe_close() argument
202 if (lbh->active_phandle != NULL) in libbe_close()
203 zpool_close(lbh->active_phandle); in libbe_close()
204 libzfs_fini(lbh->lzh); in libbe_close()
206 free(lbh->bootonce); in libbe_close()
207 free(lbh); in libbe_close()
347 zfs_open(bdd->lbh->lzh, entry->name, ZFS_TYPE_FILESYSTEM) in be_promote_dependent_clones()
396 if (!zfs_dataset_exists(bdd->lbh->lzh, path, ZFS_TYPE_SNAPSHOT)) in be_destroy_cb()
398 snap = zfs_open(bdd->lbh->lzh, path, ZFS_TYPE_SNAPSHOT); in be_destroy_cb()
412 be_destroy_internal(libbe_handle_t *lbh, const char *name, int options, in be_destroy_internal() argument
422 bdd.lbh = lbh; in be_destroy_internal()
428 be_root_concat(lbh, name, path); in be_destroy_internal()
431 if (!zfs_dataset_exists(lbh->lzh, path, ZFS_TYPE_FILESYSTEM)) in be_destroy_internal()
432 return (set_error(lbh, BE_ERR_NOENT)); in be_destroy_internal()
434 if (strcmp(path, lbh->rootfs) == 0 || in be_destroy_internal()
435 strcmp(path, lbh->bootfs) == 0) in be_destroy_internal()
436 return (set_error(lbh, BE_ERR_DESTROYACT)); in be_destroy_internal()
438 fs = zfs_open(lbh->lzh, path, ZFS_TYPE_FILESYSTEM); in be_destroy_internal()
440 return (set_error(lbh, BE_ERR_ZFSOPEN)); in be_destroy_internal()
448 return (set_error(lbh, BE_ERR_DESTROYMNT)); in be_destroy_internal()
453 if (lbh->bootonce != NULL && in be_destroy_internal()
454 strcmp(path, lbh->bootonce) == 0) in be_destroy_internal()
456 zpool_get_name(lbh->active_phandle), lzbe_add, NULL); in be_destroy_internal()
466 if (!zfs_dataset_exists(lbh->lzh, path, ZFS_TYPE_SNAPSHOT)) in be_destroy_internal()
467 return (set_error(lbh, BE_ERR_NOENT)); in be_destroy_internal()
471 return (set_error(lbh, BE_ERR_NOMEM)); in be_destroy_internal()
473 fs = zfs_open(lbh->lzh, path, ZFS_TYPE_DATASET); in be_destroy_internal()
476 return (set_error(lbh, BE_ERR_ZFSOPEN)); in be_destroy_internal()
497 return (set_error(lbh, err)); in be_destroy_internal()
508 return (set_error(lbh, BE_ERR_NOORIGIN)); in be_destroy_internal()
520 be_is_auto_snapshot_name(lbh, origin)) in be_destroy_internal()
529 return (set_error(lbh, BE_ERR_DESTROYMNT)); in be_destroy_internal()
530 return (set_error(lbh, BE_ERR_UNKNOWN)); in be_destroy_internal()
537 rootlen = strlen(lbh->root); in be_destroy_internal()
539 return (set_error(lbh, BE_ERR_INVORIGIN)); in be_destroy_internal()
546 if (strncmp(origin, lbh->root, rootlen) != 0 || origin[rootlen] != '/') in be_destroy_internal()
549 return (be_destroy_internal(lbh, origin + rootlen + 1, in be_destroy_internal()
554 be_destroy(libbe_handle_t *lbh, const char *name, int options) in be_destroy() argument
564 return (set_error(lbh, BE_ERR_UNKNOWN)); in be_destroy()
565 return (be_destroy_internal(lbh, name, options, false)); in be_destroy()
569 be_setup_snapshot_name(libbe_handle_t *lbh, char *buf, size_t buflen) in be_setup_snapshot_name() argument
583 if (!zfs_dataset_exists(lbh->lzh, buf, ZFS_TYPE_SNAPSHOT)) in be_setup_snapshot_name()
589 be_is_auto_snapshot_name(libbe_handle_t *lbh __unused, const char *name) in be_is_auto_snapshot_name()
608 be_snapshot(libbe_handle_t *lbh, const char *source, const char *snap_name, in be_snapshot() argument
614 be_root_concat(lbh, source, buf); in be_snapshot()
616 if ((err = be_exists(lbh, buf)) != 0) in be_snapshot()
617 return (set_error(lbh, err)); in be_snapshot()
621 return (set_error(lbh, BE_ERR_INVALIDNAME)); in be_snapshot()
624 return (set_error(lbh, BE_ERR_INVALIDNAME)); in be_snapshot()
630 be_setup_snapshot_name(lbh, buf, sizeof(buf)); in be_snapshot()
634 return (set_error(lbh, BE_ERR_INVALIDNAME)); in be_snapshot()
636 if ((err = zfs_snapshot(lbh->lzh, buf, recursive, NULL)) != 0) { in be_snapshot()
639 return (set_error(lbh, BE_ERR_INVALIDNAME)); in be_snapshot()
649 return (set_error(lbh, BE_ERR_NOPOOL)); in be_snapshot()
650 return (set_error(lbh, BE_ERR_UNKNOWN)); in be_snapshot()
662 be_create(libbe_handle_t *lbh, const char *name) in be_create() argument
666 err = be_create_from_existing(lbh, name, be_active_path(lbh)); in be_create()
668 return (set_error(lbh, err)); in be_create()
718 val = be_mountpoint_augmented(dccb->lbh, val); in be_deep_clone_prop()
741 pos = strstr(dspath, ldc->lbh->root); in be_get_path()
748 snprintf(result, result_size, "%s/%s", ldc->lbh->root, ldc->bename); in be_get_path()
751 pos += strlen(ldc->lbh->root) + 1; in be_get_path()
782 if (zfs_dataset_exists(ldc->lbh->lzh, be_path, ZFS_TYPE_DATASET)) in be_clone_cb()
786 if (!zfs_dataset_exists(ldc->lbh->lzh, snap_path, ZFS_TYPE_SNAPSHOT)) in be_clone_cb()
790 zfs_open(ldc->lbh->lzh, snap_path, ZFS_TYPE_SNAPSHOT)) == NULL) in be_clone_cb()
796 dccb.lbh = ldc->lbh; in be_clone_cb()
825 be_clone(libbe_handle_t *lbh, const char *bename, const char *snapshot, int depth) in be_clone() argument
834 if ((err = be_validate_name(lbh, bename)) != 0) in be_clone()
835 return (set_error(lbh, err)); in be_clone()
841 if ((err = be_root_concat(lbh, snapshot, snap_path)) != 0) in be_clone()
842 return (set_error(lbh, err)); in be_clone()
845 if ((err = be_validate_snap(lbh, snap_path)) != 0) in be_clone()
846 return (set_error(lbh, err)); in be_clone()
850 return (set_error(lbh, BE_ERR_UNKNOWN)); in be_clone()
856 return (set_error(lbh, BE_ERR_UNKNOWN)); in be_clone()
862 ldc.lbh = lbh; in be_clone()
869 parent_hdl = zfs_open(lbh->lzh, parentname, ZFS_TYPE_DATASET); in be_clone()
875 return (set_error(lbh, err)); in be_clone()
881 int be_create_depth(libbe_handle_t *lbh, const char *bename, in be_create_depth() argument
884 return (be_clone(lbh, bename, snap, depth)); in be_create_depth()
891 be_create_from_existing_snap(libbe_handle_t *lbh, const char *bename, in be_create_from_existing_snap() argument
894 return (be_clone(lbh, bename, snap, -1)); in be_create_from_existing_snap()
902 be_create_from_existing(libbe_handle_t *lbh, const char *bename, const char *old) in be_create_from_existing() argument
907 if ((err = be_snapshot(lbh, old, NULL, true, snap)) != 0) in be_create_from_existing()
908 return (set_error(lbh, err)); in be_create_from_existing()
910 err = be_clone(lbh, bename, snap, -1); in be_create_from_existing()
912 return (set_error(lbh, err)); in be_create_from_existing()
922 be_validate_snap(libbe_handle_t *lbh, const char *snap_name) in be_validate_snap() argument
931 if (!zfs_dataset_exists(lbh->lzh, snap_name, in be_validate_snap()
948 be_root_concat(libbe_handle_t *lbh, const char *name, char *result) in be_root_concat() argument
953 root_len = strlen(lbh->root); in be_root_concat()
957 if (strstr(name, lbh->root) != name) in be_root_concat()
966 snprintf(result, BE_MAXPATHLEN, "%s/%s", lbh->root, in be_root_concat()
982 be_validate_name(libbe_handle_t *lbh, const char *name) in be_validate_name() argument
989 if (strlen(lbh->root) + 1 + strlen(name) > MAXNAMELEN) in be_validate_name()
1014 be_rename(libbe_handle_t *lbh, const char *old, const char *new) in be_rename() argument
1025 if ((err = be_validate_name(lbh, new)) != 0) in be_rename()
1026 return (set_error(lbh, err)); in be_rename()
1027 if ((err = be_root_concat(lbh, old, full_old)) != 0) in be_rename()
1028 return (set_error(lbh, err)); in be_rename()
1029 if ((err = be_root_concat(lbh, new, full_new)) != 0) in be_rename()
1030 return (set_error(lbh, err)); in be_rename()
1032 if (!zfs_dataset_exists(lbh->lzh, full_old, ZFS_TYPE_DATASET)) in be_rename()
1033 return (set_error(lbh, BE_ERR_NOENT)); in be_rename()
1035 if (zfs_dataset_exists(lbh->lzh, full_new, ZFS_TYPE_DATASET)) in be_rename()
1036 return (set_error(lbh, BE_ERR_EXISTS)); in be_rename()
1038 if ((zfs_hdl = zfs_open(lbh->lzh, full_old, in be_rename()
1040 return (set_error(lbh, BE_ERR_ZFSOPEN)); in be_rename()
1051 if (lbh->bootonce != NULL && in be_rename()
1052 strcmp(full_old, lbh->bootonce) == 0) in be_rename()
1053 err = be_activate(lbh, new, true); in be_rename()
1057 return (set_error(lbh, err)); in be_rename()
1062 be_export(libbe_handle_t *lbh, const char *bootenv, int fd) in be_export() argument
1070 if ((err = be_snapshot(lbh, bootenv, NULL, true, snap_name)) != 0) in be_export()
1074 be_root_concat(lbh, snap_name, buf); in be_export()
1076 if ((zfs = zfs_open(lbh->lzh, buf, ZFS_TYPE_DATASET)) == NULL) in be_export()
1077 return (set_error(lbh, BE_ERR_ZFSOPEN)); in be_export()
1087 be_import(libbe_handle_t *lbh, const char *bootenv, int fd) in be_import() argument
1095 be_root_concat(lbh, bootenv, buf); in be_import()
1097 if ((err = zfs_receive(lbh->lzh, buf, NULL, &flags, fd, NULL)) != 0) { in be_import()
1100 return (set_error(lbh, BE_ERR_NOORIGIN)); in be_import()
1102 return (set_error(lbh, BE_ERR_NOENT)); in be_import()
1104 return (set_error(lbh, BE_ERR_IO)); in be_import()
1106 return (set_error(lbh, BE_ERR_UNKNOWN)); in be_import()
1110 if ((zfs = zfs_open(lbh->lzh, buf, ZFS_TYPE_FILESYSTEM)) == NULL) in be_import()
1111 return (set_error(lbh, BE_ERR_ZFSOPEN)); in be_import()
1123 return (set_error(lbh, BE_ERR_UNKNOWN)); in be_import()
1130 be_create_child_noent(libbe_handle_t *lbh, const char *active, in be_create_child_noent() argument
1142 if ((err = zfs_create(lbh->lzh, active, ZFS_TYPE_DATASET, in be_create_child_noent()
1146 return (set_error(lbh, BE_ERR_EXISTS)); in be_create_child_noent()
1148 return (set_error(lbh, BE_ERR_NOENT)); in be_create_child_noent()
1151 return (set_error(lbh, BE_ERR_NOPOOL)); in be_create_child_noent()
1155 return (set_error(lbh, BE_ERR_UNKNOWN)); in be_create_child_noent()
1160 if ((zfs = zfs_open(lbh->lzh, active, ZFS_TYPE_DATASET)) == NULL) in be_create_child_noent()
1161 return (set_error(lbh, BE_ERR_ZFSOPEN)); in be_create_child_noent()
1172 return (set_error(lbh, BE_ERR_NOMEM)); in be_create_child_noent()
1173 return (set_error(lbh, BE_ERR_UNKNOWN)); in be_create_child_noent()
1180 be_create_child_cloned(libbe_handle_t *lbh, const char *active) in be_create_child_cloned() argument
1194 return (set_error(lbh, BE_ERR_UNKNOWN)); in be_create_child_cloned()
1196 be_root_concat(lbh, tmp, buf); in be_create_child_cloned()
1198 if ((err = zfs_snapshot(lbh->lzh, buf, false, NULL)) != 0) { in be_create_child_cloned()
1201 return (set_error(lbh, BE_ERR_INVALIDNAME)); in be_create_child_cloned()
1211 return (set_error(lbh, BE_ERR_NOPOOL)); in be_create_child_cloned()
1212 return (set_error(lbh, BE_ERR_UNKNOWN)); in be_create_child_cloned()
1217 if ((zfs = zfs_open(lbh->lzh, buf, ZFS_TYPE_SNAPSHOT)) == NULL) in be_create_child_cloned()
1222 return (set_error(lbh, BE_ERR_UNKNOWN)); in be_create_child_cloned()
1230 be_add_child(libbe_handle_t *lbh, const char *child_path, bool cp_if_exists) in be_add_child() argument
1239 return (set_error(lbh, BE_ERR_BADPATH)); in be_add_child()
1241 strlcpy(active, be_active_path(lbh), BE_MAXPATHLEN); in be_add_child()
1253 zfs_create(lbh->lzh, buf, ZFS_TYPE_DATASET, props); in be_add_child()
1259 return (set_error(lbh, BE_ERR_PATHLEN)); in be_add_child()
1264 return (set_error(lbh, BE_ERR_UNKNOWN)); in be_add_child()
1265 return (be_create_child_noent(lbh, active, child_path)); in be_add_child()
1268 return (be_create_child_cloned(lbh, active)); in be_add_child()
1269 return (set_error(lbh, BE_ERR_EXISTS)); in be_add_child()
1278 be_deactivate(libbe_handle_t *lbh, const char *ds, bool temporary) in be_deactivate() argument
1284 zpool_get_name(lbh->active_phandle), lzbe_add, NULL)); in be_deactivate()
1287 if ((zfs = zfs_open(lbh->lzh, ds, ZFS_TYPE_DATASET)) == NULL) in be_deactivate()
1321 be_activate(libbe_handle_t *lbh, const char *bootenv, bool temporary) in be_activate() argument
1328 be_root_concat(lbh, bootenv, be_path); in be_activate()
1331 if ((err = be_exists(lbh, be_path)) != 0) in be_activate()
1332 return (set_error(lbh, err)); in be_activate()
1336 zpool_get_name(lbh->active_phandle), lzbe_add, be_path)); in be_activate()
1338 if (strncmp(lbh->bootfs, "-", 1) != 0 && in be_activate()
1339 be_deactivate(lbh, lbh->bootfs, false) != 0) in be_activate()
1343 err = zpool_set_prop(lbh->active_phandle, "bootfs", be_path); in be_activate()
1348 zhp = zfs_open(lbh->lzh, be_path, ZFS_TYPE_FILESYSTEM); in be_activate()