svn commit: r196301 -
head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Pawel Jakub Dawidek
pjd at FreeBSD.org
Mon Aug 17 09:25:38 UTC 2009
Author: pjd
Date: Mon Aug 17 09:25:37 2009
New Revision: 196301
URL: http://svn.freebsd.org/changeset/base/196301
Log:
If z_buf is NULL, we should free znode immediately.
Noticed by: avg
Approved by: re (kib)
Modified:
head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Mon Aug 17 09:23:27 2009 (r196300)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Mon Aug 17 09:25:37 2009 (r196301)
@@ -4350,7 +4350,6 @@ zfs_freebsd_reclaim(ap)
{
vnode_t *vp = ap->a_vp;
znode_t *zp = VTOZ(vp);
- zfsvfs_t *zfsvfs;
ASSERT(zp != NULL);
@@ -4360,13 +4359,18 @@ zfs_freebsd_reclaim(ap)
vnode_destroy_vobject(vp);
mutex_enter(&zp->z_lock);
- ASSERT(zp->z_phys);
+ ASSERT(zp->z_phys != NULL);
ZTOV(zp) = NULL;
- if (!zp->z_unlinked) {
+ mutex_exit(&zp->z_lock);
+
+ if (zp->z_unlinked)
+ ; /* Do nothing. */
+ else if (zp->z_dbuf == NULL)
+ zfs_znode_free(zp);
+ else /* if (!zp->z_unlinked && zp->z_dbuf != NULL) */ {
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
int locked;
- zfsvfs = zp->z_zfsvfs;
- mutex_exit(&zp->z_lock);
locked = MUTEX_HELD(ZFS_OBJ_MUTEX(zfsvfs, zp->z_id)) ? 2 :
ZFS_OBJ_HOLD_TRYENTER(zfsvfs, zp->z_id);
if (locked == 0) {
@@ -4382,8 +4386,6 @@ zfs_freebsd_reclaim(ap)
ZFS_OBJ_HOLD_EXIT(zfsvfs, zp->z_id);
zfs_znode_free(zp);
}
- } else {
- mutex_exit(&zp->z_lock);
}
VI_LOCK(vp);
vp->v_data = NULL;
More information about the svn-src-head
mailing list