linux/drivers/mtd/nand
Hector Palacios 7928de5185 mtd: nand: fix bug writing 1 byte less than page size
commit 144f4c9839 upstream.

nand_do_write_ops() determines if it is writing a partial page with the
formula:
	part_pagewr = (column || writelen < (mtd->writesize - 1))

When 'writelen' is exactly 1 byte less than the NAND page size the formula
equates to zero, so the code doesn't process it as a partial write,
although it should.
As a consequence the function remains in the while(1) loop with 'writelen'
becoming 0xffffffff and iterating endlessly.

The bug may not be easy to reproduce in Linux since user space tools
usually force the padding or round-up the write size to a page-size
multiple.
This was discovered in U-Boot where the issue can be reproduced by
writing any size that is 1 byte less than a page-size multiple.
For example, on a NAND with 2K page (0x800):
	=> nand erase.part <partition>
	=> nand write $loadaddr <partition> 7ff

[Editor's note: the bug was added in commit 29072b9607, but moved
around in commit 66507c7bc8 ("mtd: nand: Add support to use nand_base
poi databuf as bounce buffer")]

Fixes: 29072b9607 ("[MTD] NAND: add subpage write support")
Signed-off-by: Hector Palacios <hector.palacios@digi.com>
Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2016-08-20 18:09:24 +02:00
..
bcm47xxnflash mtd: nand: bcm47xxnflash: show parent device in sysfs 2015-10-13 12:56:26 -07:00
brcmnand mtd: brcmnand: Fix v7.1 register offsets 2016-05-04 14:48:52 -07:00
gpmi-nand mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
ams-delta.c mtd: nand: ams-delta: fix overwritten mtd_info->owner in initialization 2015-01-15 19:33:03 -08:00
atmel_nand.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
atmel_nand_ecc.h mtd: atmel_nand: add a definition for the oob reserved bytes 2015-04-05 17:47:56 -07:00
atmel_nand_nfc.h mtd: atmel_nand: check NFC busy flag by HSMC_SR instead of NFC cmd regs 2015-03-11 09:49:28 -07:00
au1550nd.c mtd: nand: au1550nd: show parent device in sysfs 2015-10-13 12:56:25 -07:00
bf5xx_nand.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
cafe_nand.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
cmx270_nand.c mtd: cmx270_nand: Remove unnecessary OOM messages 2014-01-03 11:22:29 -08:00
cs553x_nand.c mtd: cs553x_nand: Fix kasprintf() usage 2015-06-16 18:58:47 -07:00
davinci_nand.c mtd: nand: davinci_nand: drop owner and name assignment 2015-10-13 12:56:28 -07:00
denali.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
denali.h mtd: nand: denali: max_banks calculation changed in revision 5.1 2015-09-29 11:44:59 -07:00
denali_dt.c mtd: nand: drop owner assignment from platform_drivers 2014-10-20 16:20:58 +02:00
denali_pci.c mtd: denali_pci: switch to dev_err() 2015-08-18 17:21:37 -07:00
diskonchip.c arch, drivers: don't include <asm/io.h> directly, use <linux/io.h> instead 2015-08-10 23:07:05 -04:00
docg4.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
fsl_elbc_nand.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
fsl_ifc_nand.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
fsl_upm.c mtd: nand: fsl_upm: show parent device in sysfs 2015-10-13 12:56:47 -07:00
fsmc_nand.c mtd: fsmc_nand: Add BCH4 SW ECC support for SPEAr600 2015-10-26 13:19:40 -07:00
gpio.c mtd: nand: gpio: show parent device in sysfs 2015-10-13 12:56:44 -07:00
hisi504_nand.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
jz4740_nand.c mtd: jz4740_nand: fix build on jz4740 after removing gpio.h 2015-11-16 10:48:15 -08:00
Kconfig mtd: nand: Allow MTD_NAND_BRCMNAND to be selected for ARM64 2015-10-12 14:17:40 -07:00
lpc32xx_mlc.c mtd: lpc32xx_mlc: fix warnings caused by enabling unprepared clock 2015-10-19 18:23:15 -07:00
lpc32xx_slc.c mtd: lpc32xx_slc: fix warnings caused by enabling unprepared clock 2015-10-19 18:23:14 -07:00
Makefile mtd: nand: vf610_nfc: Freescale NFC for VF610, MPC5125 and others 2015-09-29 13:47:58 -07:00
mpc5121_nfc.c mtd: nand: mpc5121_nfc: show parent device in sysfs 2015-10-13 12:56:32 -07:00
mxc_nand.c mtd: nand: mxc_nand: drop owner assignment 2015-10-13 12:56:38 -07:00
nand_base.c mtd: nand: fix bug writing 1 byte less than page size 2016-08-20 18:09:24 +02:00
nand_bbt.c mtd: nand_bbt: set the smallest size of bbt table 2015-10-11 12:58:28 -07:00
nand_bch.c mtd: cleanup style on pr_debug messages 2011-09-11 15:02:16 +03:00
nand_ecc.c mtd: nand: add line feed to pr_err 2014-04-16 00:18:26 -07:00
nand_ids.c mtd: nand: add Toshiba TC58NVG0S3E to nand_ids table 2015-08-25 12:24:02 -07:00
nand_timings.c mtd: nand: Use ULL-suffix for big u64 constant 2014-08-19 11:53:09 -07:00
nandsim.c mtd: nandsim: drop null test before destroy functions 2015-09-21 17:04:50 -07:00
ndfc.c mtd: nand: ndfc: show parent device in sysfs 2015-10-13 12:56:39 -07:00
nuc900_nand.c mtd: nand: nuc900_nand: show parent device in sysfs 2015-10-13 12:56:33 -07:00
omap2.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
omap_elm.c mtd: omap_elm: Fix module alias 2015-08-18 17:57:46 -07:00
orion_nand.c mtd: nand: orion_nand: show parent device in sysfs 2015-10-13 12:56:33 -07:00
pasemi_nand.c mtd: nand: pasemi_nand: show parent device in sysfs 2015-10-13 12:56:39 -07:00
plat_nand.c mtd: nand: plat_nand: show parent device in sysfs 2015-10-13 12:56:34 -07:00
pxa3xx_nand.c mtd: pxa3xx_nand: clean up the pxa3xx timings 2015-10-26 11:38:12 -07:00
r852.c mtd: nand: r852: drop owner assignment 2015-10-13 12:56:35 -07:00
r852.h mtd: r852: remove useless pci powerup/down from suspend/resume routines 2010-10-25 01:32:21 +01:00
s3c2410.c mtd: nand: s3c2410: show parent device in sysfs 2015-10-13 12:56:42 -07:00
sh_flctl.c mtd: nand: pass page number to ecc->write_xxx() methods 2015-10-13 12:56:49 -07:00
sharpsl.c mtd: nand: sharpsl: show parent device in sysfs 2015-10-13 12:56:42 -07:00
sm_common.c mtd: nand: refactor chip->block_markbad interface 2013-08-30 16:47:52 +01:00
sm_common.h mtd: use __packed shorthand 2014-08-19 11:53:08 -07:00
socrates_nand.c mtd: nand: socrates_nand: drop owner assignment 2015-10-13 12:56:46 -07:00
sunxi_nand.c mtd: nand: sunxi: avoid retrieving data before ECC pass 2015-11-02 12:54:37 -08:00
tmio_nand.c mtd: nand: tmio_nand: show parent device in sysfs 2015-10-13 12:56:37 -07:00
txx9ndfmc.c mtd: nand: txx9ndfmc: show parent device in sysfs 2015-10-13 12:56:48 -07:00
vf610_nfc.c mtd: nand: vf610_nfc: use nand_check_erased_ecc_chunk() helper 2015-10-26 13:05:42 -07:00
xway_nand.c mtd: plat_nand: use default partition probe 2015-05-27 12:34:35 -07:00