summaryrefslogtreecommitdiff
path: root/fs/buffer.c
diff options
context:
space:
mode:
authorAndrew Morton <akpm@zip.com.au>2002-07-14 03:26:41 -0700
committerLinus Torvalds <torvalds@home.transmeta.com>2002-07-14 03:26:41 -0700
commite4e4cd485d1fab1ef03507847a49a0e090b35e64 (patch)
treed6eff405f0785c76f597f11ecb69f9a60865d4f4 /fs/buffer.c
parent42ec8bc1d0bd11f0ebcb05c4c4a02065c08f4e73 (diff)
[PATCH] fix O_DIRECT oops
inode->i_sb->s_bdev is NULL when the inode refers to a blockdev. Use the get_block() result instead.
Diffstat (limited to 'fs/buffer.c')
-rw-r--r--fs/buffer.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/buffer.c b/fs/buffer.c
index 07ab2f0108bb..3ff70e744ad3 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -2316,8 +2316,9 @@ int generic_direct_IO(int rw, struct inode *inode,
struct kiobuf *iobuf, unsigned long blocknr,
int blocksize, get_block_t *get_block)
{
- int i, nr_blocks, retval;
+ int i, nr_blocks, retval = 0;
sector_t *blocks = iobuf->blocks;
+ struct block_device *bdev = NULL;
nr_blocks = iobuf->length / blocksize;
/* build the blocklist */
@@ -2347,11 +2348,12 @@ int generic_direct_IO(int rw, struct inode *inode,
BUG();
}
blocks[i] = bh.b_blocknr;
+ bdev = bh.b_bdev;
}
/* This does not understand multi-device filesystems currently */
- retval = brw_kiovec(rw, 1, &iobuf,
- inode->i_sb->s_bdev, blocks, blocksize);
+ if (bdev)
+ retval = brw_kiovec(rw, 1, &iobuf, bdev, blocks, blocksize);
out:
return retval;