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, "