diff options
| author | Andrew Morton <akpm@zip.com.au> | 2002-07-14 03:26:41 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-07-14 03:26:41 -0700 |
| commit | e4e4cd485d1fab1ef03507847a49a0e090b35e64 (patch) | |
| tree | d6eff405f0785c76f597f11ecb69f9a60865d4f4 /fs/buffer.c | |
| parent | 42ec8bc1d0bd11f0ebcb05c4c4a02065c08f4e73 (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.c | 8 |
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; |
