[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>
This commit is contained in:
parent
ce8e922c0e
commit
f6d6d4fcd1
4 changed files with 431 additions and 364 deletions
File diff suppressed because it is too large
Load diff
|
@ -23,14 +23,24 @@ extern mempool_t *xfs_ioend_pool;
|
|||
|
||||
typedef void (*xfs_ioend_func_t)(void *);
|
||||
|
||||
/*
|
||||
* xfs_ioend struct manages large extent writes for XFS.
|
||||
* It can manage several multi-page bio's at once.
|
||||
*/
|
||||
typedef struct xfs_ioend {
|
||||
struct xfs_ioend *io_list; /* next ioend in chain */
|
||||
unsigned int io_type; /* delalloc / unwritten */
|
||||
unsigned int io_uptodate; /* I/O status register */
|
||||
atomic_t io_remaining; /* hold count */
|
||||
struct vnode *io_vnode; /* file being written to */
|
||||
struct buffer_head *io_buffer_head;/* buffer linked list head */
|
||||
struct buffer_head *io_buffer_tail;/* buffer linked list tail */
|
||||
size_t io_size; /* size of the extent */
|
||||
xfs_off_t io_offset; /* offset in the file */
|
||||
struct work_struct io_work; /* xfsdatad work queue */
|
||||
} xfs_ioend_t;
|
||||
|
||||
extern struct address_space_operations linvfs_aops;
|
||||
extern int linvfs_get_block(struct inode *, sector_t, struct buffer_head *, int);
|
||||
|
||||
#endif /* __XFS_IOPS_H__ */
|
||||
|
|
|
@ -26,11 +26,6 @@ extern struct file_operations linvfs_file_operations;
|
|||
extern struct file_operations linvfs_invis_file_operations;
|
||||
extern struct file_operations linvfs_dir_operations;
|
||||
|
||||
extern struct address_space_operations linvfs_aops;
|
||||
|
||||
extern int linvfs_get_block(struct inode *, sector_t, struct buffer_head *, int);
|
||||
extern void linvfs_unwritten_done(struct buffer_head *, int);
|
||||
|
||||
extern int xfs_ioctl(struct bhv_desc *, struct inode *, struct file *,
|
||||
int, unsigned int, void __user *);
|
||||
|
||||
|
|
|
@ -110,10 +110,6 @@
|
|||
* delalloc and these ondisk-uninitialised buffers.
|
||||
*/
|
||||
BUFFER_FNS(PrivateStart, unwritten);
|
||||
static inline void set_buffer_unwritten_io(struct buffer_head *bh)
|
||||
{
|
||||
bh->b_end_io = linvfs_unwritten_done;
|
||||
}
|
||||
|
||||
#define restricted_chown xfs_params.restrict_chown.val
|
||||
#define irix_sgid_inherit xfs_params.sgid_inherit.val
|
||||
|
|
Loading…
Reference in a new issue