Allow variable block sizes in mtd_blkdevs
PATCH 1/1 Allow variable block sizes in mtd_blkdevs
Currently, mtd_blkdevs enforces a block size of 512, even if the drivers can seemingly request a different size. This patch fixes mtd_blkdevs so block sizes other than 512 work correctly.
--- drivers/mtd/ftl.c | 3 ++- drivers/mtd/inftlcore.c | 3 ++- drivers/mtd/mtd_blkdevs.c | 15 +++++++++------ drivers/mtd/mtdblock.c | 3 ++- drivers/mtd/mtdblock_ro.c | 3 ++- drivers/mtd/nftlcore.c | 3 ++- drivers/mtd/rfd_ftl.c | 3 ++- include/linux/mtd/blktrans.h | 3 ++- 8 files changed, 23 insertions(+), 13 deletions(-)
drivers/mtd/mtd_blkdevs.c +9 -6
@@ -42,19 +42,20 @@ static int do_blktrans_request(struct mtunsigned long block, nsect;char *buf; - block = req->sector; - nsect = req->current_nr_sectors; + block = req->sector <<9 >> tr->blkshift; + nsect = req->current_nr_sectors <<9 >> tr->blkshift; + buf = req->buffer;if (!blk_fs_request (req))return 0 ; -if (block + nsect >get_capacity (req->rq_disk)) +if (req->sector + req->current_nr_sectors >get_capacity (req->rq_disk))return 0 ;switch (rq_data_dir (req)) {case READ : -for (; nsect >0 ; nsect--, block++, buf +=512 ) +for (; nsect >0 ; nsect--, block++, buf += tr->blksize)if (tr->readsect (dev, block, buf))return 0 ;return 1 ;
@@ -63,7 +64,7 @@ static int do_blktrans_request(struct mtif (!tr->writesect)return 0 ; -for (; nsect >0 ; nsect--, block++, buf +=512 ) +for (; nsect >0 ; nsect--, block++, buf += tr->blksize)if (tr->writesect (dev, block, buf))return 0 ;return 1 ;
@@ -297,7 +298,7 @@ int add_mtd_blktrans_dev(struct mtd_blkt/* 2.5 has capacity in units of 512 bytes while still having BLOCK_SIZE_BITS set to 10. Just to keep us amused. */ -set_capacity (gd, (new->size * new->blksize) >>9 ); +set_capacity (gd, (new->size * tr->blksize) >>9 ); gd->private_data = new; new->blkcore_priv = gd;
@@ -401,6 +402,8 @@ int register_mtd_blktrans(struct mtd_blk } tr->blkcore_priv->rq->queuedata = tr; +blk_queue_hardsect_size (tr->blkcore_priv->rq, tr->blksize); + tr->blkshift =ffs (tr->blksize) -1 ; ret =kernel_thread (mtd_blktrans_thread, tr,CLONE_KERNEL );if (ret <0 ) {
drivers/mtd/ftl.c +2 -1
@@ -1054,7 +1054,7 @@ static void ftl_add_mtd(struct mtd_blktr le32_to_cpu(partition->header.FormattedSize) >> 10);#endif partition->mbd.size =le32_to_cpu (partition->header.FormattedSize) >>9 ; - partition->mbd.blksize =SECTOR_SIZE ; + partition->mbd.tr = tr; partition->mbd.devnum =-1 ;if (!add_mtd_blktrans_dev ((void *)partition))
@@ -1076,6 +1076,7 @@ struct mtd_blktrans_ops ftl_tr = { .name = "ftl", .major = FTL_MAJOR, .part_bits = PART_BITS, + .blksize = SECTOR_SIZE, .readsect = ftl_readsect, .writesect = ftl_writesect, .getgeo = ftl_getgeo,
drivers/mtd/inftlcore.c +2 -1
@@ -77,7 +77,7 @@ static void inftl_add_mtd(struct mtd_blk inftl->mbd.mtd = mtd; inftl->mbd.devnum =-1 ; - inftl->mbd.blksize =512 ; + inftl->mbd.tr = tr;if (INFTL_mount (inftl) <0 ) {
@@ -945,6 +945,7 @@ static struct mtd_blktrans_ops inftl_tr .name = "inftl", .major = INFTL_MAJOR, .part_bits = INFTL_PARTN_BITS, + .blksize = 512, .getgeo = inftl_getgeo, .readsect = inftl_readblock, .writesect = inftl_writeblock,
drivers/mtd/mtdblock.c +2 -1
@@ -348,7 +348,7 @@ static void mtdblock_add_mtd(struct mtd_ dev->mtd = mtd; dev->devnum = mtd->index; - dev->blksize =512 ; + dev->size = mtd->size >>9 ; dev->tr = tr;
@@ -368,6 +368,7 @@ static struct mtd_blktrans_ops mtdblock_ .name = "mtdblock", .major = 31, .part_bits = 0, + .blksize = 512, .open = mtdblock_open, .flush = mtdblock_flush, .release = mtdblock_release,
drivers/mtd/mtdblock_ro.c +2 -1
@@ -42,7 +42,7 @@ static void mtdblock_add_mtd(struct mtd_ dev->mtd = mtd; dev->devnum = mtd->index; - dev->blksize =512 ; + dev->size = mtd->size >>9 ; dev->tr = tr; dev->readonly =1 ;
@@ -60,6 +60,7 @@ static struct mtd_blktrans_ops mtdblock_ .name = "mtdblock", .major = 31, .part_bits = 0, + .blksize = 512, .readsect = mtdblock_readsect, .writesect = mtdblock_writesect, .add_mtd = mtdblock_add_mtd,
drivers/mtd/nftlcore.c +2 -1
@@ -67,7 +67,7 @@ static void nftl_add_mtd(struct mtd_blkt nftl->mbd.mtd = mtd; nftl->mbd.devnum =-1 ; - nftl->mbd.blksize =512 ; + nftl->mbd.tr = tr;if (NFTL_mount (nftl) <0 ) {
@@ -797,6 +797,7 @@ static struct mtd_blktrans_ops nftl_tr = .name = "nftl", .major = NFTL_MAJOR, .part_bits = NFTL_PARTN_BITS, + .blksize = 512, .getgeo = nftl_getgeo, .readsect = nftl_readblock,#ifdef CONFIG_NFTL_RW
drivers/mtd/rfd_ftl.c +2 -1
@@ -787,7 +787,6 @@ static void rfd_ftl_add_mtd(struct mtd_bif (scan_header (part) ==0 ) { part->mbd.size = part->sector_count; - part->mbd.blksize =SECTOR_SIZE ; part->mbd.tr = tr; part->mbd.devnum =-1 ;if (!(mtd->flags &MTD_WRITEABLE ))
@@ -829,6 +828,8 @@ struct mtd_blktrans_ops rfd_ftl_tr = { .name = "rfd", .major = RFD_FTL_MAJOR, .part_bits = PART_BITS, + .blksize = SECTOR_SIZE, + .readsect = rfd_ftl_readsect, .writesect = rfd_ftl_writesect, .getgeo = rfd_ftl_getgeo,
include/linux/mtd/blktrans.h +2 -1
@@ -24,7 +24,6 @@ struct mtd_blktrans_dev {struct mtd_info *mtd;struct mutex lock;int devnum; -int blksize;unsigned long size;int readonly;void *blkcore_priv;/* gendisk in 2.5, devfs_handle in 2.4 */
@@ -36,6 +35,8 @@ struct mtd_blktrans_ops {char *name;int major;int part_bits; +int blksize; +int blkshift;/* Access functions */ int (*readsect)(struct mtd_blktrans_dev *dev,
Hi Richard,
Quoted 5 lines · Richard Purdie
Currently,
mtd_blkdevsenforces a block size of 512, even if the drivers can seemingly request a different size. This patch fixesmtd_blkdevsso block sizes other than 512 work correctly.Signed-off-by Richard Purdie <[email protected]>
Looks OK for me.
Signature · 2 lines
Best regards, Artem Bityutskiy (Битюцкий Артём)
Quoted 3 lines · Richard Purdie
Currently,
mtd_blkdevsenforces a block size of 512, even if the drivers can seemingly request a different size. This patch fixesmtd_blkdevsso block sizes other than 512 work correctly.
Could/did you test this with FTL on mtdram?
Signature · 1 line
dwmw2
Quoted 6 lines · David Woodhouse
Quoted 3 lines · Richard Purdie
Currently,
mtd_blkdevsenforces a block size of 512, even if the drivers can seemingly request a different size. This patch fixesmtd_blkdevsso block sizes other than 512 work correctly.Could/did you test this with FTL on mtdram?
I'd tested with mtdblock and I just tested with FTL on mtdram and that seems to work fine too (I could write, umount, mount and read back with the correct checksums).
Regards,
Richard