Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754715AbbHNKCM (ORCPT ); Fri, 14 Aug 2015 06:02:12 -0400 Received: from mail-oi0-f49.google.com ([209.85.218.49]:36511 "EHLO mail-oi0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754091AbbHNKCI (ORCPT ); Fri, 14 Aug 2015 06:02:08 -0400 MIME-Version: 1.0 X-Originating-IP: [86.137.51.72] In-Reply-To: <1592668a061137b33c9a6392dfccc67c69fc1fe6.1439543572.git.hramrach@gmail.com> References: <1592668a061137b33c9a6392dfccc67c69fc1fe6.1439543572.git.hramrach@gmail.com> Date: Fri, 14 Aug 2015 11:02:07 +0100 Message-ID: Subject: Re: [PATCH v4 7/7] mtd: spi-nor: add read loop From: Andrew Murray To: Michal Suchanek Cc: Hou Zhiqiang , shijie.huang@intel.com, David Woodhouse , Brian Norris , Han Xu , =?UTF-8?B?UmFmYcWCIE1pxYJlY2tp?= , Huang Shijie , Ben Hutchings , Marek Vasut , Gabor Juhos , =?UTF-8?B?QmVhbiBIdW8g6ZyN5paM5paMLA==?= , MTD Maling List , LKML Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1878 Lines: 60 On 14 August 2015 at 10:23, Michal Suchanek wrote: > 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 > --- > drivers/mtd/spi-nor/spi-nor.c | 20 ++++++++++++++------ > 1 file changed, 14 insertions(+), 6 deletions(-) > > diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c > index e0ae9cf..246fac7 100644 > --- a/drivers/mtd/spi-nor/spi-nor.c > +++ b/drivers/mtd/spi-nor/spi-nor.c > @@ -738,14 +738,22 @@ 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) > + goto read_err; > + > + BUG_ON(ret > len); > + *retlen += ret; Is *retlen initialized to 0 anywhere? Andrew Murray > + buf += ret; > + from += ret; > + len -= ret; > + } > + ret = 0; > > +read_err: > spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ); > - if (ret < 0) > - return ret; > - > - *retlen += ret; > - return 0; > + return ret; > } > > static int sst_write(struct mtd_info *mtd, loff_t to, size_t len, > -- > 2.1.4 > > > ______________________________________________________ > Linux MTD discussion mailing list > http://lists.infradead.org/mailman/listinfo/linux-mtd/ -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/