summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/lib/pyzfs/common/dataset.py8
-rw-r--r--usr/src/lib/pyzfs/common/holds.py4
-rw-r--r--usr/src/uts/common/fs/zfs/dsl_dataset.c10
3 files changed, 20 insertions, 2 deletions
diff --git a/usr/src/lib/pyzfs/common/dataset.py b/usr/src/lib/pyzfs/common/dataset.py
index f3adc5c364..3e8223bd95 100644
--- a/usr/src/lib/pyzfs/common/dataset.py
+++ b/usr/src/lib/pyzfs/common/dataset.py
@@ -213,12 +213,16 @@ class Dataset(object):
def snapshots_fromcmdline(dsnames, recursive):
for dsname in dsnames:
- ds = Dataset(dsname)
if not "@" in dsname:
raise zfs.util.ZFSError(errno.EINVAL,
_("cannot open %s") % dsname,
_("operation only applies to snapshots"))
- yield ds
+ try:
+ ds = Dataset(dsname)
+ yield ds
+ except zfs.util.ZFSError, e:
+ if not recursive or e.errno != errno.ENOENT:
+ raise
if recursive:
(base, snapname) = dsname.split('@')
parent = Dataset(base)
diff --git a/usr/src/lib/pyzfs/common/holds.py b/usr/src/lib/pyzfs/common/holds.py
index 93db4a15e6..a2ee38f4e8 100644
--- a/usr/src/lib/pyzfs/common/holds.py
+++ b/usr/src/lib/pyzfs/common/holds.py
@@ -61,8 +61,10 @@ def do_holds():
fields = ("name", "tag", "timestamp")
rjustfields = ()
printing = False
+ gotone = False
t = zfs.table.Table(fields, rjustfields)
for ds in zfs.dataset.snapshots_fromcmdline(args, options.recursive):
+ gotone = True
for tag, tm in ds.get_holds().iteritems():
val = {"name": ds.name, "tag": tag,
"timestamp": time.ctime(tm)}
@@ -70,3 +72,5 @@ def do_holds():
printing = True
if printing:
t.printme()
+ elif not gotone:
+ raise zfs.util.ZFSError(errno.ENOENT, _("no matching datasets"))
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);