Changeset View
Changeset View
Standalone View
Standalone View
cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
Show First 20 Lines • Show All 4,543 Lines • ▼ Show 20 Lines | zfs_hold_nvl(zfs_handle_t *zhp, int cleanup_fd, nvlist_t *holds) | ||||
return (ret); | return (ret); | ||||
} | } | ||||
static int | static int | ||||
zfs_release_one(zfs_handle_t *zhp, void *arg) | zfs_release_one(zfs_handle_t *zhp, void *arg) | ||||
{ | { | ||||
struct holdarg *ha = arg; | struct holdarg *ha = arg; | ||||
char name[ZFS_MAXNAMELEN]; | char name[ZFS_MAXNAMELEN]; | ||||
int rv = 0; | int rv = 0, rvs = 0; | ||||
nvlist_t *existing_holds; | nvlist_t *existing_holds; | ||||
nvpair_t *nvp = NULL; | |||||
if (ha->snapname == NULL) { | |||||
if (lzc_get_holds(zhp->zfs_name, &existing_holds) != 0) { | |||||
ha->error = ENOENT; | |||||
} else { | |||||
while ((nvp = nvlist_next_nvpair(existing_holds, nvp)) | |||||
!= NULL) { | |||||
const char *zname = zfs_get_name(zhp); | |||||
const char *tag = nvpair_name(nvp); | |||||
nvlist_t *torelease = fnvlist_alloc(); | |||||
if (strcmp(ha->tag, tag) == 0) { | |||||
fnvlist_add_boolean(torelease, ha->tag); | |||||
fnvlist_add_nvlist(ha->nvl, zname, torelease); | |||||
fnvlist_free(torelease); | |||||
} | |||||
} | |||||
} | |||||
if (!nvlist_exists(existing_holds, ha->tag)) | |||||
ha->error = ESRCH; | |||||
if (zhp->zfs_type != ZFS_TYPE_SNAPSHOT) { | |||||
rvs = zfs_iter_snapshots(zhp, B_FALSE, zfs_release_one, ha); | |||||
if (ha->recursive) | |||||
rv = zfs_iter_filesystems(zhp, zfs_release_one, ha); | |||||
} | |||||
zfs_close(zhp); | |||||
return (rv + rvs); | |||||
} | |||||
(void) snprintf(name, sizeof (name), | (void) snprintf(name, sizeof (name), | ||||
"%s@%s", zhp->zfs_name, ha->snapname); | "%s@%s", zhp->zfs_name, ha->snapname); | ||||
if (lzc_get_holds(name, &existing_holds) != 0) { | if (lzc_get_holds(name, &existing_holds) != 0) { | ||||
ha->error = ENOENT; | ha->error = ENOENT; | ||||
} else if (!nvlist_exists(existing_holds, ha->tag)) { | } else if (!nvlist_exists(existing_holds, ha->tag)) { | ||||
ha->error = ESRCH; | ha->error = ESRCH; | ||||
} else { | } else { | ||||
Show All 25 Lines | zfs_release(zfs_handle_t *zhp, const char *snapname, const char *tag, | ||||
ha.tag = tag; | ha.tag = tag; | ||||
ha.recursive = recursive; | ha.recursive = recursive; | ||||
ha.error = 0; | ha.error = 0; | ||||
(void) zfs_release_one(zfs_handle_dup(zhp), &ha); | (void) zfs_release_one(zfs_handle_dup(zhp), &ha); | ||||
if (nvlist_empty(ha.nvl)) { | if (nvlist_empty(ha.nvl)) { | ||||
fnvlist_free(ha.nvl); | fnvlist_free(ha.nvl); | ||||
ret = ha.error; | ret = ha.error; | ||||
if (snapname == NULL) { | |||||
(void) snprintf(errbuf, sizeof (errbuf), | (void) snprintf(errbuf, sizeof (errbuf), | ||||
dgettext(TEXT_DOMAIN, | dgettext(TEXT_DOMAIN, | ||||
"cannot release holds from '%s'"), | |||||
zhp->zfs_name); | |||||
} else { | |||||
(void) snprintf(errbuf, sizeof (errbuf), | |||||
dgettext(TEXT_DOMAIN, | |||||
"cannot release hold from snapshot '%s@%s'"), | "cannot release hold from snapshot '%s@%s'"), | ||||
zhp->zfs_name, snapname); | zhp->zfs_name, snapname); | ||||
} | |||||
if (ret == ESRCH) { | if (ret == ESRCH) { | ||||
(void) zfs_error(hdl, EZFS_REFTAG_RELE, errbuf); | (void) zfs_error(hdl, EZFS_REFTAG_RELE, errbuf); | ||||
} else { | } else { | ||||
(void) zfs_standard_error(hdl, ret, errbuf); | (void) zfs_standard_error(hdl, ret, errbuf); | ||||
} | } | ||||
return (ret); | return (ret); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 289 Lines • Show Last 20 Lines |