[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1462494716-95312-10-git-send-email-computersforpeace@gmail.com>
Date: Thu, 5 May 2016 17:31:55 -0700
From: Brian Norris <computersforpeace@...il.com>
To: <linux-mtd@...ts.infradead.org>
Cc: Heiner Kallweit <hkallweit1@...il.com>,
Brian Norris <computersforpeace@...il.com>,
Han Xu <han.xu@....com>, Michal Suchanek <hramrach@...il.com>,
Boris Brezillon <boris.brezillon@...e-electrons.com>,
Javier Martinez Canillas <javier@....samsung.com>,
Rafal Milecki <zajec5@...il.com>,
Jagan Teki <jteki@...nedev.com>,
"Andrew F. Davis" <afd@...com>,
Mika Westerberg <mika.westerberg@...ux.intel.com>,
Gabor Juhos <juhosg@...nwrt.org>,
Bean Huo <beanhuo@...ron.com>, linux-kernel@...r.kernel.org,
Bayi Cheng <bayi.cheng@...iatek.com>,
Joachim Eastwood <manabian@...il.com>,
Cyrille Pitchen <cyrille.pitchen@...el.com>
Subject: [PATCH v7 09/10] mtd: spi-nor: add read loop
From: Michal Suchanek <hramrach@...il.com>
mtdblock and ubi do not handle the situation when read returns less data
than requested. Loop in spi-nor until buffer is filled or an error is
returned.
Signed-off-by: Michal Suchanek <hramrach@...il.com>
Signed-off-by: Brian Norris <computersforpeace@...il.com>
---
v6 -> v7:
* no change
drivers/mtd/spi-nor/spi-nor.c | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
index ff96e1b54384..a78adcda1b85 100644
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
@@ -1030,14 +1030,27 @@ static int spi_nor_read(struct mtd_info *mtd, loff_t from, size_t len,
if (ret)
return ret;
- ret = nor->read(nor, from, len, buf);
+ while (len) {
+ ret = nor->read(nor, from, len, buf);
+ if (ret == 0) {
+ /* We shouldn't see 0-length reads */
+ ret = -EIO;
+ goto read_err;
+ }
+ if (ret < 0)
+ goto read_err;
- spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ);
- if (ret < 0)
- return ret;
+ WARN_ON(ret > len);
+ *retlen += ret;
+ buf += ret;
+ from += ret;
+ len -= ret;
+ }
+ ret = 0;
- *retlen += ret;
- return 0;
+read_err:
+ spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ);
+ return ret;
}
static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
--
2.8.0.rc3.226.g39d4020
Powered by blists - more mailing lists