summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2018-09-21 11:23:21 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2018-09-24 08:52:15 +0200
commit1c70ffedfa65dbfcdc5d9ff7b151a78d7f35c108 (patch)
treef9ecc8759fd9afb1e42d2b18af93ce64dc9d6924 /drivers
parentcc2ea8c90b828c7b7bf96e8bfe9d3711ac631e98 (diff)
downloadbarebox-1c70ffedfa65dbfcdc5d9ff7b151a78d7f35c108.tar.gz
barebox-1c70ffedfa65dbfcdc5d9ff7b151a78d7f35c108.tar.xz
mtd: mtdraw: fail when writing fails
When writing a block fails then fail the whole write process. There's no point in returning the written bytes so far as this would only indicate the caller to write the remaining bytes again which would then fail. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mtd/mtdraw.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/drivers/mtd/mtdraw.c b/drivers/mtd/mtdraw.c
index 75166a84b7..8b252d653f 100644
--- a/drivers/mtd/mtdraw.c
+++ b/drivers/mtd/mtdraw.c
@@ -158,12 +158,11 @@ static loff_t mtdraw_raw_to_mtd_offset(struct mtdraw *mtdraw, loff_t offset)
return (loff_t)mtdraw_offset_to_block(mtdraw, offset) * mtd->writesize;
}
-static ssize_t mtdraw_blkwrite(struct mtdraw *mtdraw, const void *buf,
+static int mtdraw_blkwrite(struct mtdraw *mtdraw, const void *buf,
ulong offset)
{
struct mtd_info *mtd = mtdraw->mtd;
struct mtd_oob_ops ops;
- int ret;
if (mtd_buf_all_ff(buf, mtdraw->rps))
return 0;
@@ -174,10 +173,7 @@ static ssize_t mtdraw_blkwrite(struct mtdraw *mtdraw, const void *buf,
ops.len = mtd->writesize;
ops.oobbuf = (void *)buf + mtd->writesize;
ops.ooblen = mtd->oobsize;
- ret = mtd_write_oob(mtd, offset, &ops);
- if (!ret)
- ret = ops.retlen + ops.oobretlen;
- return ret;
+ return mtd_write_oob(mtd, offset, &ops);
}
static void mtdraw_fillbuf(struct mtdraw *mtdraw, const void *src, int nbbytes)
@@ -215,6 +211,8 @@ static ssize_t mtdraw_write(struct cdev *cdev, const void *buf, size_t count,
numblock = mtdraw_offset_to_block(mtdraw, mtdraw->write_ofs);
ret = mtdraw_blkwrite(mtdraw, mtdraw->writebuf,
mtd->writesize * numblock);
+ if (ret)
+ return ret;
mtdraw->write_fill = 0;
}
@@ -222,20 +220,19 @@ static ssize_t mtdraw_write(struct cdev *cdev, const void *buf, size_t count,
while (ret >= 0 && count >= mtdraw->rps) {
ret = mtdraw_blkwrite(mtdraw, buf + retlen,
mtd->writesize * numblock++);
+ if (ret)
+ return ret;
count -= ret;
retlen += ret;
offset += ret;
}
- if (ret >= 0 && count) {
+ if (count) {
mtdraw->write_ofs = offset - mtdraw->write_fill;
mtdraw_fillbuf(mtdraw, buf + retlen, count);
retlen += count;
}
- if (ret < 0)
- return ret;
-
return retlen;
}