Messages in this thread Patch in this message | | | Date | Wed, 8 Sep 2010 18:07:10 +0800 | From | Cong Meng <> | Subject | [PATCH] vfs: calculate block-size correctly |
| |
I sent this patch half mount ago, but no response at all. If anything is wrong, please tell me. Thanks a lots. This is my first time to send patch to linux kernel.
The invocation of __getblk(bdev, block, size) will cause kernel stall if the @size parameter is not equal to the blockr-size of @bdev, which is saved in bdev->bd_inode->i_blkbits.
submit_bh() has the similar problem.
This patch calculates the block-size using i_blkbits. So that, for example, __getblk() can get a 4K buffer head while the block-size of @bdev is 1K.
Signed-off-by: Cong Meng <mcpacino@gmail.com> --- fs/buffer.c | 7 ++----- 1 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/fs/buffer.c b/fs/buffer.c index 3e7dca2..f7f9d33 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -1051,10 +1051,7 @@ grow_buffers(struct block_device *bdev, sector_t block, int size) pgoff_t index; int sizebits; - sizebits = -1; - do { - sizebits++; - } while ((size << sizebits) < PAGE_SIZE); + sizebits = PAGE_CACHE_SHIFT - bdev->bd_inode->i_blkbits; index = block >> sizebits; @@ -2924,7 +2921,7 @@ int submit_bh(int rw, struct buffer_head * bh) */ bio = bio_alloc(GFP_NOIO, 1); - bio->bi_sector = bh->b_blocknr * (bh->b_size >> 9); + bio->bi_sector = bh->b_blocknr << (bh->b_bdev->bd_inode->i_blkbits - 9); bio->bi_bdev = bh->b_bdev; bio->bi_io_vec[0].bv_page = bh->b_page; bio->bi_io_vec[0].bv_len = bh->b_size;
| |