Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/ufs/ffs Now that softdep has left the tree the only plac...
details: https://anonhg.NetBSD.org/src/rev/b924d7305e42
branches: trunk
changeset: 748741:b924d7305e42
user: hannken <hannken%NetBSD.org@localhost>
date: Wed Nov 04 09:45:05 2009 +0000
description:
Now that softdep has left the tree the only place needing the ffs_lock()
hack is ffs_sync().
- Use the generic lock operations for ffs.
- Change ffs_sync() to omit the vnode lock while suspending.
Reviewed by: Antti Kantee <pooka%netbsd.org@localhost>
diffstat:
sys/ufs/ffs/ffs_vfsops.c | 26 +++++++++---
sys/ufs/ffs/ffs_vnops.c | 93 +++++------------------------------------------
2 files changed, 30 insertions(+), 89 deletions(-)
diffs (214 lines):
diff -r 19453f39eb5b -r b924d7305e42 sys/ufs/ffs/ffs_vfsops.c
--- a/sys/ufs/ffs/ffs_vfsops.c Tue Nov 03 22:52:59 2009 +0000
+++ b/sys/ufs/ffs/ffs_vfsops.c Wed Nov 04 09:45:05 2009 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ffs_vfsops.c,v 1.252 2009/09/13 14:30:21 bouyer Exp $ */
+/* $NetBSD: ffs_vfsops.c,v 1.253 2009/11/04 09:45:05 hannken Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.252 2009/09/13 14:30:21 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.253 2009/11/04 09:45:05 hannken Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ffs.h"
@@ -1542,7 +1542,8 @@
struct inode *ip;
struct ufsmount *ump = VFSTOUFS(mp);
struct fs *fs;
- int error, allerror = 0;
+ int lk_flags, error, allerror = 0;
+ bool is_suspending;
fs = ump->um_fs;
if (fs->fs_fmod != 0 && fs->fs_ronly != 0) { /* XXX */
@@ -1555,6 +1556,15 @@
return (ENOMEM);
fstrans_start(mp, FSTRANS_SHARED);
+ is_suspending = (fstrans_getstate(mp) == FSTRANS_SUSPENDING);
+ /*
+ * We can't lock vnodes while the file system is suspending because
+ * threads waiting on fstrans may have locked vnodes.
+ */
+ if (is_suspending)
+ lk_flags = LK_INTERLOCK;
+ else
+ lk_flags = LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK;
/*
* Write back each (modified) inode.
*/
@@ -1611,14 +1621,13 @@
mutex_exit(&vp->v_interlock);
continue;
}
- if (vp->v_type == VBLK &&
- fstrans_getstate(mp) == FSTRANS_SUSPENDING) {
+ if (vp->v_type == VBLK && is_suspending) {
mutex_exit(&vp->v_interlock);
continue;
}
vmark(mvp, vp);
mutex_exit(&mntvnode_lock);
- error = vget(vp, LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK);
+ error = vget(vp, lk_flags);
if (error) {
mutex_enter(&mntvnode_lock);
nvp = vunmark(mvp);
@@ -1640,7 +1649,10 @@
}
if (error)
allerror = error;
- vput(vp);
+ if (is_suspending)
+ vrele(vp);
+ else
+ vput(vp);
mutex_enter(&mntvnode_lock);
nvp = vunmark(mvp);
}
diff -r 19453f39eb5b -r b924d7305e42 sys/ufs/ffs/ffs_vnops.c
--- a/sys/ufs/ffs/ffs_vnops.c Tue Nov 03 22:52:59 2009 +0000
+++ b/sys/ufs/ffs/ffs_vnops.c Wed Nov 04 09:45:05 2009 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ffs_vnops.c,v 1.112 2009/03/29 10:29:00 ad Exp $ */
+/* $NetBSD: ffs_vnops.c,v 1.113 2009/11/04 09:45:05 hannken Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffs_vnops.c,v 1.112 2009/03/29 10:29:00 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_vnops.c,v 1.113 2009/11/04 09:45:05 hannken Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ffs.h"
@@ -134,12 +134,12 @@
{ &vop_abortop_desc, ufs_abortop }, /* abortop */
{ &vop_inactive_desc, ufs_inactive }, /* inactive */
{ &vop_reclaim_desc, ffs_reclaim }, /* reclaim */
- { &vop_lock_desc, ffs_lock }, /* lock */
- { &vop_unlock_desc, ffs_unlock }, /* unlock */
+ { &vop_lock_desc, ufs_lock }, /* lock */
+ { &vop_unlock_desc, ufs_unlock }, /* unlock */
{ &vop_bmap_desc, ufs_bmap }, /* bmap */
{ &vop_strategy_desc, ufs_strategy }, /* strategy */
{ &vop_print_desc, ufs_print }, /* print */
- { &vop_islocked_desc, ffs_islocked }, /* islocked */
+ { &vop_islocked_desc, ufs_islocked }, /* islocked */
{ &vop_pathconf_desc, ufs_pathconf }, /* pathconf */
{ &vop_advlock_desc, ufs_advlock }, /* advlock */
{ &vop_bwrite_desc, vn_bwrite }, /* bwrite */
@@ -188,12 +188,12 @@
{ &vop_abortop_desc, spec_abortop }, /* abortop */
{ &vop_inactive_desc, ufs_inactive }, /* inactive */
{ &vop_reclaim_desc, ffs_reclaim }, /* reclaim */
- { &vop_lock_desc, ffs_lock }, /* lock */
- { &vop_unlock_desc, ffs_unlock }, /* unlock */
+ { &vop_lock_desc, ufs_lock }, /* lock */
+ { &vop_unlock_desc, ufs_unlock }, /* unlock */
{ &vop_bmap_desc, spec_bmap }, /* bmap */
{ &vop_strategy_desc, spec_strategy }, /* strategy */
{ &vop_print_desc, ufs_print }, /* print */
- { &vop_islocked_desc, ffs_islocked }, /* islocked */
+ { &vop_islocked_desc, ufs_islocked }, /* islocked */
{ &vop_pathconf_desc, spec_pathconf }, /* pathconf */
{ &vop_advlock_desc, spec_advlock }, /* advlock */
{ &vop_bwrite_desc, vn_bwrite }, /* bwrite */
@@ -242,12 +242,12 @@
{ &vop_abortop_desc, fifo_abortop }, /* abortop */
{ &vop_inactive_desc, ufs_inactive }, /* inactive */
{ &vop_reclaim_desc, ffs_reclaim }, /* reclaim */
- { &vop_lock_desc, ffs_lock }, /* lock */
- { &vop_unlock_desc, ffs_unlock }, /* unlock */
+ { &vop_lock_desc, ufs_lock }, /* lock */
+ { &vop_unlock_desc, ufs_unlock }, /* unlock */
{ &vop_bmap_desc, fifo_bmap }, /* bmap */
{ &vop_strategy_desc, fifo_strategy }, /* strategy */
{ &vop_print_desc, ufs_print }, /* print */
- { &vop_islocked_desc, ffs_islocked }, /* islocked */
+ { &vop_islocked_desc, ufs_islocked }, /* islocked */
{ &vop_pathconf_desc, fifo_pathconf }, /* pathconf */
{ &vop_advlock_desc, fifo_advlock }, /* advlock */
{ &vop_bwrite_desc, vn_bwrite }, /* bwrite */
@@ -788,74 +788,3 @@
/* XXX Not implemented for UFS2 file systems. */
return (EOPNOTSUPP);
}
-
-/*
- * Lock the node.
- */
-int
-ffs_lock(void *v)
-{
- struct vop_lock_args /* {
- struct vnode *a_vp;
- int a_flags;
- } */ *ap = v;
- struct vnode *vp = ap->a_vp;
- struct mount *mp = vp->v_mount;
- int flags = ap->a_flags;
-
- if ((flags & LK_INTERLOCK) != 0) {
- mutex_exit(&vp->v_interlock);
- flags &= ~LK_INTERLOCK;
- }
-
- /*
- * Fake lock during file system suspension.
- */
- if ((vp->v_type == VREG || vp->v_type == VDIR) &&
- fstrans_is_owner(mp) &&
- fstrans_getstate(mp) == FSTRANS_SUSPENDING) {
- return 0;
- }
-
- return (vlockmgr(vp->v_vnlock, flags));
-}
-
-/*
- * Unlock the node.
- */
-int
-ffs_unlock(void *v)
-{
- struct vop_unlock_args /* {
- struct vnode *a_vp;
- int a_flags;
- } */ *ap = v;
- struct vnode *vp = ap->a_vp;
- struct mount *mp = vp->v_mount;
-
- KASSERT(ap->a_flags == 0);
-
- /*
- * Fake unlock during file system suspension.
- */
- if ((vp->v_type == VREG || vp->v_type == VDIR) &&
- fstrans_is_owner(mp) &&
- fstrans_getstate(mp) == FSTRANS_SUSPENDING) {
- return 0;
- }
- return (vlockmgr(vp->v_vnlock, LK_RELEASE));
-}
-
-/*
- * Return whether or not the node is locked.
- */
-int
-ffs_islocked(void *v)
-{
- struct vop_islocked_args /* {
- struct vnode *a_vp;
- } */ *ap = v;
- struct vnode *vp = ap->a_vp;
-
- return (vlockstatus(vp->v_vnlock));
-}
Home |
Main Index |
Thread Index |
Old Index