summaryrefslogtreecommitdiffstats
path: root/drivers/mtd/mtdraw.c
diff options
context:
space:
mode:
authorRobert Jarzmik <robert.jarzmik@free.fr>2012-01-26 20:55:24 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2012-01-27 12:24:04 +0100
commit93125fda04ec0ba6f342ba7c4d2246b1ac5d930e (patch)
treec8b4c0fd71b1b4d434be470803ed047df2d8f969 /drivers/mtd/mtdraw.c
parent8d6bfdaec7c3ce44969ca0930b84442ff93cd80b (diff)
downloadbarebox-93125fda04ec0ba6f342ba7c4d2246b1ac5d930e.tar.gz
barebox-93125fda04ec0ba6f342ba7c4d2246b1ac5d930e.tar.xz
drivers/mtd: fix mtdraw write support
When unaligned writes are used, typically doing a cp file /dev/mtdraw0.foo, the alignement correction code was incorrectly handling such cases, and didn't return the expected number of written bytes. This was tested on a 528 block size. Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/mtd/mtdraw.c')
-rw-r--r--drivers/mtd/mtdraw.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/mtd/mtdraw.c b/drivers/mtd/mtdraw.c
index b1cce3d836..7abe2351a5 100644
--- a/drivers/mtd/mtdraw.c
+++ b/drivers/mtd/mtdraw.c
@@ -191,8 +191,9 @@ static ssize_t mtdraw_write(struct cdev *cdev, const void *buf, size_t count,
}
if (mtdraw->write_fill == bsz) {
- ret = mtdraw_blkwrite(mtd, mtdraw->writebuf, mtdraw->write_ofs);
- retlen += ret;
+ numpage = mtdraw->write_ofs / (mtd->writesize + mtd->oobsize);
+ ret = mtdraw_blkwrite(mtd, mtdraw->writebuf,
+ mtd->writesize * numpage);
mtdraw->write_fill = 0;
}
@@ -208,6 +209,7 @@ static ssize_t mtdraw_write(struct cdev *cdev, const void *buf, size_t count,
if (ret >= 0 && count) {
mtdraw->write_ofs = offset - mtdraw->write_fill;
mtdraw_fillbuf(mtdraw, buf + retlen, count);
+ retlen += count;
}
if (ret < 0) {