svn commit: r243768 - stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Andriy Gapon
avg at FreeBSD.org
Sat Dec 1 19:12:55 UTC 2012
Author: avg
Date: Sat Dec 1 19:12:55 2012
New Revision: 243768
URL: http://svnweb.freebsd.org/changeset/base/243768
Log:
MFC r242575: zfs_dirlook: bailout early if directory is unlinked
Modified:
stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/cddl/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c
==============================================================================
--- stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c Sat Dec 1 19:12:43 2012 (r243767)
+++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c Sat Dec 1 19:12:55 2012 (r243768)
@@ -374,8 +374,15 @@ zfs_dirlook(znode_t *dzp, char *name, vn
znode_t *zp;
int error = 0;
uint64_t parent;
+ int unlinked;
if (name[0] == 0 || (name[0] == '.' && name[1] == 0)) {
+ mutex_enter(&dzp->z_lock);
+ unlinked = dzp->z_unlinked;
+ mutex_exit(&dzp->z_lock);
+ if (unlinked)
+ return (ENOENT);
+
*vpp = ZTOV(dzp);
VN_HOLD(*vpp);
} else if (name[0] == '.' && name[1] == '.' && name[2] == 0) {
@@ -394,6 +401,13 @@ zfs_dirlook(znode_t *dzp, char *name, vn
NULL, NULL, NULL);
return (error);
}
+
+ mutex_enter(&dzp->z_lock);
+ unlinked = dzp->z_unlinked;
+ mutex_exit(&dzp->z_lock);
+ if (unlinked)
+ return (ENOENT);
+
rw_enter(&dzp->z_parent_lock, RW_READER);
error = zfs_zget(zfsvfs, parent, &zp);
if (error == 0)
More information about the svn-src-stable-8
mailing list