static struct kmem_cache *asmfs_inode_cachep;
static struct kmem_cache *asmdisk_cachep;
+static bool use_logical_block_size = false;
+module_param(use_logical_block_size, bool, 0644);
+MODULE_PARM_DESC(use_logical_block_size,
+ "Prefer logical block size over physical (Y=logical, N=physical [default])");
+
+static inline unsigned int asm_block_size(struct block_device *bdev)
+{
+ if (use_logical_block_size)
+ return bdev_logical_block_size(bdev);
+
+ return bdev_physical_block_size(bdev);
+}
+
/*
* asmfs super-block data in memory
*/
if (ret)
goto out;
- ret = set_blocksize(bdev, bdev_physical_block_size(bdev));
+ ret = set_blocksize(bdev, asm_block_size(bdev));
if (ret)
goto out_get;
bdev = d->d_bdev;
- r->r_count = ioc->rcount_asm_ioc * bdev_physical_block_size(bdev);
+ r->r_count = ioc->rcount_asm_ioc * asm_block_size(bdev);
/* linux only supports unsigned long size sector numbers */
mlog(ML_IOC,
/* Block layer always uses 512-byte sector addressing,
* regardless of logical and physical block size.
*/
- r->r_bio->bi_sector = ioc->first_asm_ioc *
- (bdev_physical_block_size(bdev) >> 9);
+ r->r_bio->bi_sector = ioc->first_asm_ioc * (asm_block_size(bdev) >> 9);
if (it) {
ret = asm_integrity_map(it, r, rw == READ);
bdev = I_BDEV(filp->f_mapping->host);
qd_info->qd_max_sectors = compute_max_sectors(bdev);
- qd_info->qd_hardsect_size = bdev_physical_block_size(bdev);
+ qd_info->qd_hardsect_size = asm_block_size(bdev);
qd_info->qd_feature = asm_integrity_format(bdev) &
ASM_INTEGRITY_QDF_MASK;
mlog(ML_ABI|ML_DISK,