mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
[PATCH] revert blockdev direct io back to 2.6.19 version
Andrew Vasquez is reporting as-iosched oopses and a 65% throughput slowdown due to the recent special-casing of direct-io against blockdevs. We don't know why either of these things are occurring. The patch minimally reverts us back to the 2.6.19 code for a 2.6.20 release. Cc: Andrew Vasquez <andrew.vasquez@qlogic.com> Cc: Ken Chen <kenchen@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
8560a10e16
commit
b2e895dbd8
1 changed files with 41 additions and 0 deletions
|
@ -129,6 +129,46 @@ blkdev_get_block(struct inode *inode, sector_t iblock,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
blkdev_get_blocks(struct inode *inode, sector_t iblock,
|
||||
struct buffer_head *bh, int create)
|
||||
{
|
||||
sector_t end_block = max_block(I_BDEV(inode));
|
||||
unsigned long max_blocks = bh->b_size >> inode->i_blkbits;
|
||||
|
||||
if ((iblock + max_blocks) > end_block) {
|
||||
max_blocks = end_block - iblock;
|
||||
if ((long)max_blocks <= 0) {
|
||||
if (create)
|
||||
return -EIO; /* write fully beyond EOF */
|
||||
/*
|
||||
* It is a read which is fully beyond EOF. We return
|
||||
* a !buffer_mapped buffer
|
||||
*/
|
||||
max_blocks = 0;
|
||||
}
|
||||
}
|
||||
|
||||
bh->b_bdev = I_BDEV(inode);
|
||||
bh->b_blocknr = iblock;
|
||||
bh->b_size = max_blocks << inode->i_blkbits;
|
||||
if (max_blocks)
|
||||
set_buffer_mapped(bh);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
blkdev_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
|
||||
loff_t offset, unsigned long nr_segs)
|
||||
{
|
||||
struct file *file = iocb->ki_filp;
|
||||
struct inode *inode = file->f_mapping->host;
|
||||
|
||||
return blockdev_direct_IO_no_locking(rw, iocb, inode, I_BDEV(inode),
|
||||
iov, offset, nr_segs, blkdev_get_blocks, NULL);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int blk_end_aio(struct bio *bio, unsigned int bytes_done, int error)
|
||||
{
|
||||
struct kiocb *iocb = bio->bi_private;
|
||||
|
@ -323,6 +363,7 @@ backout:
|
|||
return PTR_ERR(page);
|
||||
goto completion;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int blkdev_writepage(struct page *page, struct writeback_control *wbc)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue