|
@@ -104,6 +104,20 @@ void invalidate_bdev(struct block_device *bdev)
|
|
|
}
|
|
}
|
|
|
EXPORT_SYMBOL(invalidate_bdev);
|
|
EXPORT_SYMBOL(invalidate_bdev);
|
|
|
|
|
|
|
|
|
|
+static void set_init_blocksize(struct block_device *bdev)
|
|
|
|
|
+{
|
|
|
|
|
+ unsigned bsize = bdev_logical_block_size(bdev);
|
|
|
|
|
+ loff_t size = i_size_read(bdev->bd_inode);
|
|
|
|
|
+
|
|
|
|
|
+ while (bsize < PAGE_SIZE) {
|
|
|
|
|
+ if (size & bsize)
|
|
|
|
|
+ break;
|
|
|
|
|
+ bsize <<= 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ bdev->bd_block_size = bsize;
|
|
|
|
|
+ bdev->bd_inode->i_blkbits = blksize_bits(bsize);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
int set_blocksize(struct block_device *bdev, int size)
|
|
int set_blocksize(struct block_device *bdev, int size)
|
|
|
{
|
|
{
|
|
|
/* Size must be a power of two, and between 512 and PAGE_SIZE */
|
|
/* Size must be a power of two, and between 512 and PAGE_SIZE */
|
|
@@ -1408,18 +1422,9 @@ EXPORT_SYMBOL(check_disk_change);
|
|
|
|
|
|
|
|
void bd_set_size(struct block_device *bdev, loff_t size)
|
|
void bd_set_size(struct block_device *bdev, loff_t size)
|
|
|
{
|
|
{
|
|
|
- unsigned bsize = bdev_logical_block_size(bdev);
|
|
|
|
|
-
|
|
|
|
|
inode_lock(bdev->bd_inode);
|
|
inode_lock(bdev->bd_inode);
|
|
|
i_size_write(bdev->bd_inode, size);
|
|
i_size_write(bdev->bd_inode, size);
|
|
|
inode_unlock(bdev->bd_inode);
|
|
inode_unlock(bdev->bd_inode);
|
|
|
- while (bsize < PAGE_SIZE) {
|
|
|
|
|
- if (size & bsize)
|
|
|
|
|
- break;
|
|
|
|
|
- bsize <<= 1;
|
|
|
|
|
- }
|
|
|
|
|
- bdev->bd_block_size = bsize;
|
|
|
|
|
- bdev->bd_inode->i_blkbits = blksize_bits(bsize);
|
|
|
|
|
}
|
|
}
|
|
|
EXPORT_SYMBOL(bd_set_size);
|
|
EXPORT_SYMBOL(bd_set_size);
|
|
|
|
|
|
|
@@ -1496,8 +1501,10 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (!ret)
|
|
|
|
|
|
|
+ if (!ret) {
|
|
|
bd_set_size(bdev,(loff_t)get_capacity(disk)<<9);
|
|
bd_set_size(bdev,(loff_t)get_capacity(disk)<<9);
|
|
|
|
|
+ set_init_blocksize(bdev);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
* If the device is invalidated, rescan partition
|
|
* If the device is invalidated, rescan partition
|
|
@@ -1532,6 +1539,7 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
|
|
|
goto out_clear;
|
|
goto out_clear;
|
|
|
}
|
|
}
|
|
|
bd_set_size(bdev, (loff_t)bdev->bd_part->nr_sects << 9);
|
|
bd_set_size(bdev, (loff_t)bdev->bd_part->nr_sects << 9);
|
|
|
|
|
+ set_init_blocksize(bdev);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (bdev->bd_bdi == &noop_backing_dev_info)
|
|
if (bdev->bd_bdi == &noop_backing_dev_info)
|