summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
index cf99d68..7430c83 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
@@ -1344,7 +1344,15 @@ zfsctl_umount_snapshots(vfs_t *vfsp, int fflags, cred_t *cr)
if (vn_ismntpt(sep->se_root)) {
error = zfsctl_unmount_snap(sep, fflags, cr);
if (error) {
- avl_add(&sdp->sd_snaps, sep);
+ /*
+ * Before reinserting snapshot to the tree,
+ * check if it was actually removed. For example
+ * when snapshot mount point is busy, we will
+ * have an error here, but there will be no need
+ * to reinsert snapshot.
+ */
+ if (avl_find(&sdp->sd_snaps, sep, NULL) == NULL)
+ avl_add(&sdp->sd_snaps, sep);
break;
}
}
OpenPOWER on IntegriCloud