diff options
Diffstat (limited to 'usr/src/uts/common/fs/zfs/dsl_dataset.c')
-rw-r--r-- | usr/src/uts/common/fs/zfs/dsl_dataset.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/usr/src/uts/common/fs/zfs/dsl_dataset.c b/usr/src/uts/common/fs/zfs/dsl_dataset.c index edc36e72ba..5e33e024ea 100644 --- a/usr/src/uts/common/fs/zfs/dsl_dataset.c +++ b/usr/src/uts/common/fs/zfs/dsl_dataset.c @@ -3470,6 +3470,7 @@ struct dsl_ds_holdarg { char *htag; char *snapname; boolean_t recursive; + boolean_t gotone; char failed[MAXPATHLEN]; }; @@ -3489,6 +3490,7 @@ dsl_dataset_user_hold_one(char *dsname, void *arg) error = dsl_dataset_hold(name, ha->dstg, &ds); kmem_free(name, buflen); if (error == 0) { + ha->gotone = B_TRUE; dsl_sync_task_create(ha->dstg, dsl_dataset_user_hold_check, dsl_dataset_user_hold_sync, ds, ha->htag, 0); } else if (error == ENOENT && ha->recursive) { @@ -3542,6 +3544,9 @@ dsl_dataset_user_hold(char *dsname, char *snapname, char *htag, dsl_dataset_rele(ds, ha->dstg); } + if (error == 0 && recursive && !ha->gotone) + error = ENOENT; + if (error) (void) strcpy(dsname, ha->failed); @@ -3692,6 +3697,8 @@ dsl_dataset_user_release_one(char *dsname, void *arg) if (error) return (error); + ha->gotone = B_TRUE; + ASSERT(dsl_dataset_is_snapshot(ds)); error = dsl_dataset_release_might_destroy(ds, ha->htag, &might_destroy); @@ -3781,6 +3788,9 @@ dsl_dataset_user_release(char *dsname, char *snapname, char *htag, kmem_free(ra, sizeof (struct dsl_ds_releasearg)); } + if (error == 0 && recursive && !ha->gotone) + error = ENOENT; + if (error) (void) strcpy(dsname, ha->failed); |