summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/block_dev.c11
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);