From: Richard Purdie <rpurdie@openedhand.com>
To: Linux mtd <linux-mtd@lists.infradead.org>,
David Woodhouse <dwmw2@infradead.org>
Subject: [PATCH] Allow variable block sizes in mtd_blkdevs
Date: Fri, 27 Oct 2006 09:09:33 +0100 [thread overview]
Message-ID: <1161936573.5019.55.camel@localhost.localdomain> (raw)
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>
---
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(-)
Index: linux-2.6.19-rc3/drivers/mtd/mtd_blkdevs.c
===================================================================
--- linux-2.6.19-rc3.orig/drivers/mtd/mtd_blkdevs.c 2006-10-26 13:49:41.000000000 +0100
+++ linux-2.6.19-rc3/drivers/mtd/mtd_blkdevs.c 2006-10-26 13:50:30.000000000 +0100
@@ -42,19 +42,20 @@ static int do_blktrans_request(struct mt
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 mt
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_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) {
Index: linux-2.6.19-rc3/drivers/mtd/ftl.c
===================================================================
--- linux-2.6.19-rc3.orig/drivers/mtd/ftl.c 2006-10-26 13:49:41.000000000 +0100
+++ linux-2.6.19-rc3/drivers/mtd/ftl.c 2006-10-26 13:50:30.000000000 +0100
@@ -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,
Index: linux-2.6.19-rc3/drivers/mtd/inftlcore.c
===================================================================
--- linux-2.6.19-rc3.orig/drivers/mtd/inftlcore.c 2006-10-26 13:49:41.000000000 +0100
+++ linux-2.6.19-rc3/drivers/mtd/inftlcore.c 2006-10-26 13:50:30.000000000 +0100
@@ -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,
Index: linux-2.6.19-rc3/drivers/mtd/mtdblock.c
===================================================================
--- linux-2.6.19-rc3.orig/drivers/mtd/mtdblock.c 2006-10-26 13:49:41.000000000 +0100
+++ linux-2.6.19-rc3/drivers/mtd/mtdblock.c 2006-10-26 13:50:30.000000000 +0100
@@ -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,
Index: linux-2.6.19-rc3/drivers/mtd/mtdblock_ro.c
===================================================================
--- linux-2.6.19-rc3.orig/drivers/mtd/mtdblock_ro.c 2006-10-26 13:49:41.000000000 +0100
+++ linux-2.6.19-rc3/drivers/mtd/mtdblock_ro.c 2006-10-26 13:50:30.000000000 +0100
@@ -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,
Index: linux-2.6.19-rc3/drivers/mtd/nftlcore.c
===================================================================
--- linux-2.6.19-rc3.orig/drivers/mtd/nftlcore.c 2006-10-26 13:49:41.000000000 +0100
+++ linux-2.6.19-rc3/drivers/mtd/nftlcore.c 2006-10-26 13:50:30.000000000 +0100
@@ -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
Index: linux-2.6.19-rc3/drivers/mtd/rfd_ftl.c
===================================================================
--- linux-2.6.19-rc3.orig/drivers/mtd/rfd_ftl.c 2006-10-26 13:49:41.000000000 +0100
+++ linux-2.6.19-rc3/drivers/mtd/rfd_ftl.c 2006-10-26 13:50:30.000000000 +0100
@@ -787,7 +787,6 @@ static void rfd_ftl_add_mtd(struct mtd_b
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,
Index: linux-2.6.19-rc3/include/linux/mtd/blktrans.h
===================================================================
--- linux-2.6.19-rc3.orig/include/linux/mtd/blktrans.h 2006-10-26 13:49:41.000000000 +0100
+++ linux-2.6.19-rc3/include/linux/mtd/blktrans.h 2006-10-26 13:50:30.000000000 +0100
@@ -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,
next reply other threads:[~2006-10-27 8:09 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-10-27 8:09 Richard Purdie [this message]
2006-10-27 8:52 ` [PATCH] Allow variable block sizes in mtd_blkdevs Artem Bityutskiy
2006-10-27 13:22 ` David Woodhouse
2006-10-30 16:37 ` Richard Purdie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1161936573.5019.55.camel@localhost.localdomain \
--to=rpurdie@openedhand.com \
--cc=dwmw2@infradead.org \
--cc=linux-mtd@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.