From e4e4cd485d1fab1ef03507847a49a0e090b35e64 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Sun, 14 Jul 2002 03:26:41 -0700 Subject: [PATCH] [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. --- fs/buffer.c | 8 +++++--- 1 file 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; -- 2.47.3