diff options
author | Christoph Hellwig <hch@sgi.com> | 2005-09-02 06:58:38 (GMT) |
---|---|---|
committer | Nathan Scott <nathans@sgi.com> | 2005-09-02 06:58:38 (GMT) |
commit | 51c91ed52b8a9a30fcb2a465b40c20a1f11735ba (patch) | |
tree | edebb01cbfe550a2edb066d5b4185445cfff11ba /fs/xfs/linux-2.6/xfs_vnode.c | |
parent | 592cb26bda6fe69838529acf71e50a6dee7acbb4 (diff) | |
download | linux-51c91ed52b8a9a30fcb2a465b40c20a1f11735ba.tar.xz |
[XFS] add infrastructure for waiting on I/O completion at inode reclaim
time
SGI-PV: 934766
SGI-Modid: xfs-linux:xfs-kern:196854a
Signed-off-by: Christoph Hellwig <hch@sgi.com>
Signed-off-by: Nathan Scott <nathans@sgi.com>
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_vnode.c')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_vnode.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/fs/xfs/linux-2.6/xfs_vnode.c b/fs/xfs/linux-2.6/xfs_vnode.c index 654da98..46afc86 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.c +++ b/fs/xfs/linux-2.6/xfs_vnode.c @@ -42,17 +42,33 @@ DEFINE_SPINLOCK(vnumber_lock); */ #define NVSYNC 37 #define vptosync(v) (&vsync[((unsigned long)v) % NVSYNC]) -sv_t vsync[NVSYNC]; +STATIC wait_queue_head_t vsync[NVSYNC]; void vn_init(void) { - register sv_t *svp; - register int i; + int i; - for (svp = vsync, i = 0; i < NVSYNC; i++, svp++) - init_sv(svp, SV_DEFAULT, "vsy", i); + for (i = 0; i < NVSYNC; i++) + init_waitqueue_head(&vsync[i]); +} + +void +vn_iowait( + struct vnode *vp) +{ + wait_queue_head_t *wq = vptosync(vp); + + wait_event(*wq, (atomic_read(&vp->v_iocount) == 0)); +} + +void +vn_iowake( + struct vnode *vp) +{ + if (atomic_dec_and_test(&vp->v_iocount)) + wake_up(vptosync(vp)); } /* @@ -111,6 +127,8 @@ vn_initialize( /* Initialize the first behavior and the behavior chain head. */ vn_bhv_head_init(VN_BHV_HEAD(vp), "vnode"); + atomic_set(&vp->v_iocount, 0); + #ifdef XFS_VNODE_TRACE vp->v_trace = ktrace_alloc(VNODE_TRACE_SIZE, KM_SLEEP); #endif /* XFS_VNODE_TRACE */ |