diff options
author | Robert Jarzmik <robert.jarzmik@free.fr> | 2012-01-26 20:55:24 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-01-27 12:24:04 +0100 |
commit | 93125fda04ec0ba6f342ba7c4d2246b1ac5d930e (patch) | |
tree | c8b4c0fd71b1b4d434be470803ed047df2d8f969 /drivers/mtd/mtdraw.c | |
parent | 8d6bfdaec7c3ce44969ca0930b84442ff93cd80b (diff) | |
download | barebox-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.c | 6 |
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) { |