Module Name: src
Committed By: riastradh
Date: Mon Oct 15 22:43:50 UTC 2012
Modified Files:
src/external/cddl/osnet/dist/uts/common/fs/zfs: zfs_dir.c
Log Message:
Simplify zfs dirlock reference counting.
No need to pass dzp around; dl has a pointer to it.
To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 \
src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_dir.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_dir.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_dir.c:1.6 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_dir.c:1.7
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_dir.c:1.6 Mon Oct 15 14:03:06 2012
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_dir.c Mon Oct 15 22:43:50 2012
@@ -103,11 +103,10 @@ zfs_match_find(zfsvfs_t *zfsvfs, znode_t
*/
static int
-zfs_dirlock_hold(zfs_dirlock_t *dl, znode_t *dzp)
+zfs_dirlock_hold(zfs_dirlock_t *dl)
{
- (void)dzp; /* ignore */
- KASSERT(mutex_owned(&dzp->z_lock));
+ KASSERT(mutex_owned(&dl->dl_dzp->z_lock));
if (dl->dl_refcnt >= ULONG_MAX) /* XXX Name this constant. */
return (ENFILE); /* XXX What to do? */
@@ -117,11 +116,10 @@ zfs_dirlock_hold(zfs_dirlock_t *dl, znod
}
static void
-zfs_dirlock_rele(zfs_dirlock_t *dl, znode_t *dzp)
+zfs_dirlock_rele(zfs_dirlock_t *dl)
{
- (void)dzp; /* ignore */
- KASSERT(mutex_owned(&dzp->z_lock));
+ KASSERT(mutex_owned(&dl->dl_dzp->z_lock));
KASSERT(dl->dl_refcnt > 0);
if (--dl->dl_refcnt == 0) {
@@ -291,7 +289,7 @@ zfs_dirent_lock(zfs_dirlock_t **dlpp, zn
}
if ((flag & ZSHARED) && dl->dl_sharecnt != 0)
break;
- error = zfs_dirlock_hold(dl, dzp);
+ error = zfs_dirlock_hold(dl);
if (error) {
mutex_exit(&dzp->z_lock);
if (!(flag & ZHAVELOCK))
@@ -299,7 +297,7 @@ zfs_dirent_lock(zfs_dirlock_t **dlpp, zn
return (error);
}
cv_wait(&dl->dl_cv, &dzp->z_lock);
- zfs_dirlock_rele(dl, dzp);
+ zfs_dirlock_rele(dl);
}
/*
@@ -401,7 +399,7 @@ zfs_dirent_unlock(zfs_dirlock_t *dl)
prev_dl = &cur_dl->dl_next;
*prev_dl = dl->dl_next;
cv_broadcast(&dl->dl_cv);
- zfs_dirlock_rele(dl, dzp);
+ zfs_dirlock_rele(dl);
mutex_exit(&dzp->z_lock);
}
@@ -796,7 +794,11 @@ zfs_link_destroy(zfs_dirlock_t *dl, znod
if (zp_is_dir && !zfs_dirempty(zp)) { /* dir not empty */
mutex_exit(&zp->z_lock);
vn_vfsunlock(vp);
+#ifdef __NetBSD__ /* XXX Make our dumb tests happier... */
+ return (ENOTEMPTY);
+#else
return (EEXIST);
+#endif
}
if (zp->z_phys->zp_links <= zp_is_dir) {
zfs_panic_recover("zfs: link count on vnode %p is %u, "