[MTD] 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. Signed-off-by: Richard Purdie <rpurdie@openedhand.com> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
This commit is contained in:
parent
90afffc8bd
commit
1918767299
8 changed files with 23 additions and 13 deletions
|
@ -1054,7 +1054,7 @@ static void ftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
|
|||
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,
|
||||
|
|
|
@ -77,7 +77,7 @@ static void inftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
|
|||
|
||||
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,
|
||||
|
|
|
@ -42,19 +42,20 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
|
|||
unsigned 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 mtd_blktrans_ops *tr,
|
|||
if (!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_blktrans_dev *new)
|
|||
|
||||
/* 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_blktrans_ops *tr)
|
|||
}
|
||||
|
||||
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) {
|
||||
|
|
|
@ -348,7 +348,7 @@ static void mtdblock_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *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_tr = {
|
|||
.name = "mtdblock",
|
||||
.major = 31,
|
||||
.part_bits = 0,
|
||||
.blksize = 512,
|
||||
.open = mtdblock_open,
|
||||
.flush = mtdblock_flush,
|
||||
.release = mtdblock_release,
|
||||
|
|
|
@ -42,7 +42,7 @@ static void mtdblock_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *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_tr = {
|
|||
.name = "mtdblock",
|
||||
.major = 31,
|
||||
.part_bits = 0,
|
||||
.blksize = 512,
|
||||
.readsect = mtdblock_readsect,
|
||||
.writesect = mtdblock_writesect,
|
||||
.add_mtd = mtdblock_add_mtd,
|
||||
|
|
|
@ -67,7 +67,7 @@ static void nftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
|
|||
|
||||
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
|
||||
|
|
|
@ -787,7 +787,6 @@ static void rfd_ftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
|
|||
|
||||
if (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,
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue