diff options
author | Christoph Hellwig <hch@sgi.com> | 2006-01-10 23:40:13 -0500 |
---|---|---|
committer | Nathan Scott <nathans@sgi.com> | 2006-01-10 23:40:13 -0500 |
commit | f6d6d4fcd180f8e47bf6b13fc6cce1e6c156d0ea (patch) | |
tree | 2d4e981bb61f564904f7b7ca1ab69d163c0f69dd /fs/xfs/linux-2.6/xfs_aops.h | |
parent | ce8e922c0e79c8093452ba9a124981332b75706b (diff) |
[XFS] Initial pass at going directly-to-bio on the buffered IO path. This
allows us to submit much larger I/Os instead of sending down lots of small
buffer_heads. To do this we need to have a rather complicated I/O
submission and completion tracking infrastructure. Part of the latter has
been merged already a long time ago for direct I/O support. Part of the
problem is that we need to track sub-pagesize regions and for that we
still need buffer_heads for the time beeing. Long-term I hope we can move
to better data strucutures and/or maybe move this to fs/mpage.c instead of
having it in XFS. Original patch from Nathan Scott with various updates
from David Chinner and Christoph Hellwig.
SGI-PV: 947118
SGI-Modid: xfs-linux-melb:xfs-kern:203822a
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_aops.h')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_aops.h | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/fs/xfs/linux-2.6/xfs_aops.h b/fs/xfs/linux-2.6/xfs_aops.h index 4720758a9ade..55339dd5a30d 100644 --- a/fs/xfs/linux-2.6/xfs_aops.h +++ b/fs/xfs/linux-2.6/xfs_aops.h | |||
@@ -23,14 +23,24 @@ extern mempool_t *xfs_ioend_pool; | |||
23 | 23 | ||
24 | typedef void (*xfs_ioend_func_t)(void *); | 24 | typedef void (*xfs_ioend_func_t)(void *); |
25 | 25 | ||
26 | /* | ||
27 | * xfs_ioend struct manages large extent writes for XFS. | ||
28 | * It can manage several multi-page bio's at once. | ||
29 | */ | ||
26 | typedef struct xfs_ioend { | 30 | typedef struct xfs_ioend { |
31 | struct xfs_ioend *io_list; /* next ioend in chain */ | ||
32 | unsigned int io_type; /* delalloc / unwritten */ | ||
27 | unsigned int io_uptodate; /* I/O status register */ | 33 | unsigned int io_uptodate; /* I/O status register */ |
28 | atomic_t io_remaining; /* hold count */ | 34 | atomic_t io_remaining; /* hold count */ |
29 | struct vnode *io_vnode; /* file being written to */ | 35 | struct vnode *io_vnode; /* file being written to */ |
30 | struct buffer_head *io_buffer_head;/* buffer linked list head */ | 36 | struct buffer_head *io_buffer_head;/* buffer linked list head */ |
37 | struct buffer_head *io_buffer_tail;/* buffer linked list tail */ | ||
31 | size_t io_size; /* size of the extent */ | 38 | size_t io_size; /* size of the extent */ |
32 | xfs_off_t io_offset; /* offset in the file */ | 39 | xfs_off_t io_offset; /* offset in the file */ |
33 | struct work_struct io_work; /* xfsdatad work queue */ | 40 | struct work_struct io_work; /* xfsdatad work queue */ |
34 | } xfs_ioend_t; | 41 | } xfs_ioend_t; |
35 | 42 | ||
43 | extern struct address_space_operations linvfs_aops; | ||
44 | extern int linvfs_get_block(struct inode *, sector_t, struct buffer_head *, int); | ||
45 | |||
36 | #endif /* __XFS_IOPS_H__ */ | 46 | #endif /* __XFS_IOPS_H__ */ |