diff options
author | Christoph Hellwig <hch@lst.de> | 2008-12-03 06:20:39 -0500 |
---|---|---|
committer | Niv Sardi <xaiki@sgi.com> | 2008-12-03 23:39:24 -0500 |
commit | 25e41b3d521f52771354a718042a753a3e77df0a (patch) | |
tree | 947d169a36fad5355abb9bc512a1a488bc13439c | |
parent | 583fa586f0e4a8222dd091ce971b85c1364f3d92 (diff) |
move vn_iowait / vn_iowake into xfs_aops.c
The whole machinery to wait on I/O completion is related to the I/O path
and should be there instead of in xfs_vnode.c. Also give the functions
more descriptive names.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <david@fromorbit.com>
Signed-off-by: Niv Sardi <xaiki@sgi.com>
-rw-r--r-- | fs/xfs/linux-2.6/xfs_aops.c | 38 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_aops.h | 3 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_super.c | 2 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_sync.c | 2 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_vnode.c | 34 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_vnode.h | 10 | ||||
-rw-r--r-- | fs/xfs/xfs_inode.c | 6 | ||||
-rw-r--r-- | fs/xfs/xfs_vnodeops.c | 7 |
8 files changed, 48 insertions, 54 deletions
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index f35dba9bf1d9..de3a198f771e 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c | |||
@@ -42,6 +42,40 @@ | |||
42 | #include <linux/pagevec.h> | 42 | #include <linux/pagevec.h> |
43 | #include <linux/writeback.h> | 43 | #include <linux/writeback.h> |
44 | 44 | ||
45 | |||
46 | /* | ||
47 | * Prime number of hash buckets since address is used as the key. | ||
48 | */ | ||
49 | #define NVSYNC 37 | ||
50 | #define to_ioend_wq(v) (&xfs_ioend_wq[((unsigned long)v) % NVSYNC]) | ||
51 | static wait_queue_head_t xfs_ioend_wq[NVSYNC]; | ||
52 | |||
53 | void __init | ||
54 | xfs_ioend_init(void) | ||
55 | { | ||
56 | int i; | ||
57 | |||
58 | for (i = 0; i < NVSYNC; i++) | ||
59 | init_waitqueue_head(&xfs_ioend_wq[i]); | ||
60 | } | ||
61 | |||
62 | void | ||
63 | xfs_ioend_wait( | ||
64 | xfs_inode_t *ip) | ||
65 | { | ||
66 | wait_queue_head_t *wq = to_ioend_wq(ip); | ||
67 | |||
68 | wait_event(*wq, (atomic_read(&ip->i_iocount) == 0)); | ||
69 | } | ||
70 | |||
71 | STATIC void | ||
72 | xfs_ioend_wake( | ||
73 | xfs_inode_t *ip) | ||
74 | { | ||
75 | if (atomic_dec_and_test(&ip->i_iocount)) | ||
76 | wake_up(to_ioend_wq(ip)); | ||
77 | } | ||
78 | |||
45 | STATIC void | 79 | STATIC void |
46 | xfs_count_page_state( | 80 | xfs_count_page_state( |
47 | struct page *page, | 81 | struct page *page, |
@@ -164,7 +198,7 @@ xfs_destroy_ioend( | |||
164 | __FILE__, __LINE__); | 198 | __FILE__, __LINE__); |
165 | } | 199 | } |
166 | 200 | ||
167 | vn_iowake(ip); | 201 | xfs_ioend_wake(ip); |
168 | mempool_free(ioend, xfs_ioend_pool); | 202 | mempool_free(ioend, xfs_ioend_pool); |
169 | } | 203 | } |
170 | 204 | ||
@@ -516,7 +550,7 @@ xfs_cancel_ioend( | |||
516 | unlock_buffer(bh); | 550 | unlock_buffer(bh); |
517 | } while ((bh = next_bh) != NULL); | 551 | } while ((bh = next_bh) != NULL); |
518 | 552 | ||
519 | vn_iowake(XFS_I(ioend->io_inode)); | 553 | xfs_ioend_wake(XFS_I(ioend->io_inode)); |
520 | mempool_free(ioend, xfs_ioend_pool); | 554 | mempool_free(ioend, xfs_ioend_pool); |
521 | } while ((ioend = next) != NULL); | 555 | } while ((ioend = next) != NULL); |
522 | } | 556 | } |
diff --git a/fs/xfs/linux-2.6/xfs_aops.h b/fs/xfs/linux-2.6/xfs_aops.h index 3ba0631a3818..7b26f5ff9692 100644 --- a/fs/xfs/linux-2.6/xfs_aops.h +++ b/fs/xfs/linux-2.6/xfs_aops.h | |||
@@ -43,4 +43,7 @@ typedef struct xfs_ioend { | |||
43 | extern const struct address_space_operations xfs_address_space_operations; | 43 | extern const struct address_space_operations xfs_address_space_operations; |
44 | extern int xfs_get_blocks(struct inode *, sector_t, struct buffer_head *, int); | 44 | extern int xfs_get_blocks(struct inode *, sector_t, struct buffer_head *, int); |
45 | 45 | ||
46 | extern void xfs_ioend_init(void); | ||
47 | extern void xfs_ioend_wait(struct xfs_inode *); | ||
48 | |||
46 | #endif /* __XFS_AOPS_H__ */ | 49 | #endif /* __XFS_AOPS_H__ */ |
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 4ebbd6820e7f..36f6cc703ef2 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -1822,7 +1822,7 @@ init_xfs_fs(void) | |||
1822 | XFS_BUILD_OPTIONS " enabled\n"); | 1822 | XFS_BUILD_OPTIONS " enabled\n"); |
1823 | 1823 | ||
1824 | ktrace_init(64); | 1824 | ktrace_init(64); |
1825 | vn_init(); | 1825 | xfs_ioend_init(); |
1826 | xfs_dir_startup(); | 1826 | xfs_dir_startup(); |
1827 | 1827 | ||
1828 | error = xfs_init_zones(); | 1828 | error = xfs_init_zones(); |
diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index d12d31b86fa0..ca5bd2951a84 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c | |||
@@ -133,7 +133,7 @@ xfs_sync_inodes_ag( | |||
133 | lock_flags |= XFS_IOLOCK_SHARED; | 133 | lock_flags |= XFS_IOLOCK_SHARED; |
134 | error = xfs_flush_pages(ip, 0, -1, fflag, FI_NONE); | 134 | error = xfs_flush_pages(ip, 0, -1, fflag, FI_NONE); |
135 | if (flags & SYNC_IOWAIT) | 135 | if (flags & SYNC_IOWAIT) |
136 | vn_iowait(ip); | 136 | xfs_ioend_wait(ip); |
137 | } | 137 | } |
138 | xfs_ilock(ip, XFS_ILOCK_SHARED); | 138 | xfs_ilock(ip, XFS_ILOCK_SHARED); |
139 | 139 | ||
diff --git a/fs/xfs/linux-2.6/xfs_vnode.c b/fs/xfs/linux-2.6/xfs_vnode.c index a8cf97a4319a..f6d141122792 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.c +++ b/fs/xfs/linux-2.6/xfs_vnode.c | |||
@@ -32,40 +32,6 @@ | |||
32 | #include "xfs_mount.h" | 32 | #include "xfs_mount.h" |
33 | 33 | ||
34 | 34 | ||
35 | /* | ||
36 | * Dedicated vnode inactive/reclaim sync wait queues. | ||
37 | * Prime number of hash buckets since address is used as the key. | ||
38 | */ | ||
39 | #define NVSYNC 37 | ||
40 | #define vptosync(v) (&vsync[((unsigned long)v) % NVSYNC]) | ||
41 | static wait_queue_head_t vsync[NVSYNC]; | ||
42 | |||
43 | void __init | ||
44 | vn_init(void) | ||
45 | { | ||
46 | int i; | ||
47 | |||
48 | for (i = 0; i < NVSYNC; i++) | ||
49 | init_waitqueue_head(&vsync[i]); | ||
50 | } | ||
51 | |||
52 | void | ||
53 | vn_iowait( | ||
54 | xfs_inode_t *ip) | ||
55 | { | ||
56 | wait_queue_head_t *wq = vptosync(ip); | ||
57 | |||
58 | wait_event(*wq, (atomic_read(&ip->i_iocount) == 0)); | ||
59 | } | ||
60 | |||
61 | void | ||
62 | vn_iowake( | ||
63 | xfs_inode_t *ip) | ||
64 | { | ||
65 | if (atomic_dec_and_test(&ip->i_iocount)) | ||
66 | wake_up(vptosync(ip)); | ||
67 | } | ||
68 | |||
69 | #ifdef XFS_INODE_TRACE | 35 | #ifdef XFS_INODE_TRACE |
70 | 36 | ||
71 | #define KTRACE_ENTER(ip, vk, s, line, ra) \ | 37 | #define KTRACE_ENTER(ip, vk, s, line, ra) \ |
diff --git a/fs/xfs/linux-2.6/xfs_vnode.h b/fs/xfs/linux-2.6/xfs_vnode.h index 07fed8837db9..bd3e05c47903 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.h +++ b/fs/xfs/linux-2.6/xfs_vnode.h | |||
@@ -54,16 +54,6 @@ struct attrlist_cursor_kern; | |||
54 | Prevent VM access to the pages until | 54 | Prevent VM access to the pages until |
55 | the operation completes. */ | 55 | the operation completes. */ |
56 | 56 | ||
57 | |||
58 | extern void vn_init(void); | ||
59 | |||
60 | /* | ||
61 | * Yeah, these don't take vnode anymore at all, all this should be | ||
62 | * cleaned up at some point. | ||
63 | */ | ||
64 | extern void vn_iowait(struct xfs_inode *ip); | ||
65 | extern void vn_iowake(struct xfs_inode *ip); | ||
66 | |||
67 | #define IHOLD(ip) \ | 57 | #define IHOLD(ip) \ |
68 | do { \ | 58 | do { \ |
69 | ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \ | 59 | ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \ |
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 4e664f57860b..063da344e185 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
@@ -1322,8 +1322,8 @@ xfs_itrunc_trace( | |||
1322 | * direct I/O with the truncate operation. Also, because we hold | 1322 | * direct I/O with the truncate operation. Also, because we hold |
1323 | * the IOLOCK in exclusive mode, we prevent new direct I/Os from being | 1323 | * the IOLOCK in exclusive mode, we prevent new direct I/Os from being |
1324 | * started until the truncate completes and drops the lock. Essentially, | 1324 | * started until the truncate completes and drops the lock. Essentially, |
1325 | * the vn_iowait() call forms an I/O barrier that provides strict ordering | 1325 | * the xfs_ioend_wait() call forms an I/O barrier that provides strict |
1326 | * between direct I/Os and the truncate operation. | 1326 | * ordering between direct I/Os and the truncate operation. |
1327 | * | 1327 | * |
1328 | * The flags parameter can have either the value XFS_ITRUNC_DEFINITE | 1328 | * The flags parameter can have either the value XFS_ITRUNC_DEFINITE |
1329 | * or XFS_ITRUNC_MAYBE. The XFS_ITRUNC_MAYBE value should be used | 1329 | * or XFS_ITRUNC_MAYBE. The XFS_ITRUNC_MAYBE value should be used |
@@ -1354,7 +1354,7 @@ xfs_itruncate_start( | |||
1354 | 1354 | ||
1355 | /* wait for the completion of any pending DIOs */ | 1355 | /* wait for the completion of any pending DIOs */ |
1356 | if (new_size == 0 || new_size < ip->i_size) | 1356 | if (new_size == 0 || new_size < ip->i_size) |
1357 | vn_iowait(ip); | 1357 | xfs_ioend_wait(ip); |
1358 | 1358 | ||
1359 | /* | 1359 | /* |
1360 | * Call toss_pages or flushinval_pages to get rid of pages | 1360 | * Call toss_pages or flushinval_pages to get rid of pages |
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index b29a0eb9c0f7..2d57aae0e310 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
@@ -338,7 +338,7 @@ xfs_setattr( | |||
338 | } | 338 | } |
339 | 339 | ||
340 | /* wait for all I/O to complete */ | 340 | /* wait for all I/O to complete */ |
341 | vn_iowait(ip); | 341 | xfs_ioend_wait(ip); |
342 | 342 | ||
343 | if (!code) | 343 | if (!code) |
344 | code = xfs_itruncate_data(ip, iattr->ia_size); | 344 | code = xfs_itruncate_data(ip, iattr->ia_size); |
@@ -2758,7 +2758,7 @@ xfs_reclaim( | |||
2758 | return 0; | 2758 | return 0; |
2759 | } | 2759 | } |
2760 | 2760 | ||
2761 | vn_iowait(ip); | 2761 | xfs_ioend_wait(ip); |
2762 | 2762 | ||
2763 | ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); | 2763 | ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); |
2764 | 2764 | ||
@@ -3149,7 +3149,8 @@ xfs_free_file_space( | |||
3149 | need_iolock = 0; | 3149 | need_iolock = 0; |
3150 | if (need_iolock) { | 3150 | if (need_iolock) { |
3151 | xfs_ilock(ip, XFS_IOLOCK_EXCL); | 3151 | xfs_ilock(ip, XFS_IOLOCK_EXCL); |
3152 | vn_iowait(ip); /* wait for the completion of any pending DIOs */ | 3152 | /* wait for the completion of any pending DIOs */ |
3153 | xfs_ioend_wait(ip); | ||
3153 | } | 3154 | } |
3154 | 3155 | ||
3155 | rounding = max_t(uint, 1 << mp->m_sb.sb_blocklog, PAGE_CACHE_SIZE); | 3156 | rounding = max_t(uint, 1 << mp->m_sb.sb_blocklog, PAGE_CACHE_SIZE); |