diff options
| author | Pawel Jakub Dawidek <pjd@FreeBSD.org> | 2007-04-24 16:57:53 +0000 |
|---|---|---|
| committer | Pawel Jakub Dawidek <pjd@FreeBSD.org> | 2007-04-24 16:57:53 +0000 |
| commit | f13f73887690da7b66ddaeb038f9d79bd3031c24 (patch) | |
| tree | f2582897a7c88233bf5accf729e00e4adce24070 /sys/cddl | |
| parent | 0cdad5e2289100eeafacac357029ee4631acced9 (diff) | |
Notes
Diffstat (limited to 'sys/cddl')
| -rw-r--r-- | sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c | 39 | ||||
| -rw-r--r-- | sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c | 4 |
2 files changed, 22 insertions, 21 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c index 2d154819ab4d..d434cfc44045 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c @@ -3400,11 +3400,6 @@ zfs_freebsd_inactive(ap) { vnode_t *vp = ap->a_vp; - /* - * Destroy the vm object and flush associated pages. - */ - vnode_destroy_vobject(vp); - zfs_inactive(vp, ap->a_td->td_ucred); return (0); } @@ -3416,28 +3411,38 @@ zfs_freebsd_reclaim(ap) struct thread *a_td; } */ *ap; { - vnode_t *vp = ap->a_vp; + vnode_t *vp = ap->a_vp; znode_t *zp = VTOZ(vp); + zfsvfs_t *zfsvfs; + int rele = 1; + + ASSERT(zp != NULL); - if (zp != NULL) - mutex_enter(&zp->z_lock); -#if 0 /* - * We do it from zfs_inactive(), because after zfs_inactive() we can't - * VOP_WRITE() to the vnode. - */ /* * Destroy the vm object and flush associated pages. */ vnode_destroy_vobject(vp); -#endif + + mutex_enter(&zp->z_lock); + ASSERT(zp->z_phys); + ASSERT(zp->z_dbuf_held); + zfsvfs = zp->z_zfsvfs; + if (!zp->z_unlinked) { + zp->z_dbuf_held = 0; + ZTOV(zp) = NULL; + mutex_exit(&zp->z_lock); + dmu_buf_rele(zp->z_dbuf, NULL); + } else { + mutex_exit(&zp->z_lock); + } VI_LOCK(vp); + if (vp->v_count > 0) + rele = 0; vp->v_data = NULL; - if (zp != NULL) - zp->z_vnode = NULL; ASSERT(vp->v_holdcnt > 1); vdropl(vp); - if (zp != NULL) - mutex_exit(&zp->z_lock); + if (!zp->z_unlinked && rele) + VFS_RELE(zfsvfs->z_vfs); return (0); } diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c index 966f5030f176..9bb8ad080244 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c @@ -683,12 +683,8 @@ zfs_zinactive(znode_t *zp) } ASSERT(zp->z_phys); ASSERT(zp->z_dbuf_held); - - zp->z_dbuf_held = 0; mutex_exit(&zp->z_lock); - dmu_buf_rele(zp->z_dbuf, NULL); ZFS_OBJ_HOLD_EXIT(zfsvfs, z_id); - VFS_RELE(zfsvfs->z_vfs); } /* |
