mtd: nand: initialize ops.mode

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Mon Nov 7 11:59:38 EST 2011


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=23b1a99b87f3fc9e4242b98b2af3c9bed210f048
Commit:     23b1a99b87f3fc9e4242b98b2af3c9bed210f048
Parent:     d5de1907d0af22e1a02de2b16a624148517a39c2
Author:     Brian Norris <computersforpeace at gmail.com>
AuthorDate: Fri Oct 14 20:09:33 2011 -0700
Committer:  Artem Bityutskiy <artem.bityutskiy at linux.intel.com>
CommitDate: Sun Oct 16 15:04:00 2011 +0300

    mtd: nand: initialize ops.mode
    
    Our `ops' information was converted to a local variable recently, and
    apparently, old code relied on the fact that the global version was
    often left in a valid mode. We can't make this assumption on local
    structs, and we shouldn't be relying on a previous state anyway.
    
    Instead, we initialize mode to 0 for don't-care situations (i.e., the
    operation does not use OOB anyway) and MTD_OPS_PLACE_OOB when we want to
    place OOB data.
    
    This fixes a bug with nand_default_block_markbad(), where we catch on
    the BUG() call in nand_fill_oob():
    
    Kernel bug detected[#1]:
    ...
    Call Trace:
    [<80307350>] nand_fill_oob.clone.5+0xa4/0x15c
    [<803075d8>] nand_do_write_oob+0x1d0/0x260
    [<803077c4>] nand_default_block_markbad+0x15c/0x1a8
    [<802e8c2c>] part_block_markbad+0x80/0x98
    [<802ebc74>] mtd_ioctl+0x6d8/0xbd0
    [<802ec1a4>] mtd_unlocked_ioctl+0x38/0x5c
    [<800d9c60>] do_vfs_ioctl+0xa4/0x6e4
    [<800da2e4>] sys_ioctl+0x44/0xa0
    [<8001381c>] stack_done+0x20/0x40
    
    Signed-off-by: Brian Norris <computersforpeace at gmail.com>
    Signed-off-by: Artem Bityutskiy <artem.bityutskiy at linux.intel.com>
---
 drivers/mtd/nand/nand_base.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index 51653d9..3ed9c5e 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -420,6 +420,7 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
 		ops.datbuf = NULL;
 		ops.oobbuf = buf;
 		ops.ooboffs = chip->badblockpos & ~0x01;
+		ops.mode = MTD_OPS_PLACE_OOB;
 		do {
 			ret = nand_do_write_oob(mtd, ofs, &ops);
 
@@ -1596,6 +1597,7 @@ static int nand_read(struct mtd_info *mtd, loff_t from, size_t len,
 	ops.len = len;
 	ops.datbuf = buf;
 	ops.oobbuf = NULL;
+	ops.mode = 0;
 
 	ret = nand_do_read_ops(mtd, from, &ops);
 
@@ -2306,6 +2308,7 @@ static int panic_nand_write(struct mtd_info *mtd, loff_t to, size_t len,
 	ops.len = len;
 	ops.datbuf = (uint8_t *)buf;
 	ops.oobbuf = NULL;
+	ops.mode = 0;
 
 	ret = nand_do_write_ops(mtd, to, &ops);
 
@@ -2341,6 +2344,7 @@ static int nand_write(struct mtd_info *mtd, loff_t to, size_t len,
 	ops.len = len;
 	ops.datbuf = (uint8_t *)buf;
 	ops.oobbuf = NULL;
+	ops.mode = 0;
 
 	ret = nand_do_write_ops(mtd, to, &ops);
 



More information about the linux-mtd-cvs mailing list