diff options
| -rw-r--r-- | fs/block_dev.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index 21c5b08eb8a4..6d90edef1c51 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -606,7 +606,16 @@ static int do_open(struct block_device *bdev, struct inode *inode, struct file * goto out2; } bdev->bd_inode->i_size = blkdev_size(dev); - bdev->bd_inode->i_blkbits = blksize_bits(block_size(bdev)); + if (!bdev->bd_openers) { + unsigned bsize = bdev_hardsect_size(bdev); + while (bsize < PAGE_CACHE_SIZE) { + if (bdev->bd_inode->i_size & bsize) + break; + bsize <<= 1; + } + bdev->bd_block_size = bsize; + bdev->bd_inode->i_blkbits = blksize_bits(bsize); + } bdev->bd_openers++; unlock_kernel(); up(&bdev->bd_sem); |
