diff options
author | David Woodhouse <dwmw2@infradead.org> | 2007-10-06 15:01:59 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2007-10-06 15:01:59 -0400 |
commit | 49defc015ff58fda46a3afa3462dfdfa69bc8401 (patch) | |
tree | 992d7b968c1055a262b02c56dadb0ca1c65ab917 /drivers/mtd/nand | |
parent | 1fcf8ce51e7acc4b66904c4e159690c9467606b5 (diff) |
[MTD] [NAND] Avoid deadlock in erase callback; release chip lock first.
When the erase callback performs some other action on the flash, it's
highly likely to deadlock unless we actually release the chip lock
before calling it.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'drivers/mtd/nand')
-rw-r--r-- | drivers/mtd/nand/nand_base.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index d5691212058d..b4e0e7723894 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c | |||
@@ -2069,13 +2069,14 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, | |||
2069 | erase_exit: | 2069 | erase_exit: |
2070 | 2070 | ||
2071 | ret = instr->state == MTD_ERASE_DONE ? 0 : -EIO; | 2071 | ret = instr->state == MTD_ERASE_DONE ? 0 : -EIO; |
2072 | /* Do call back function */ | ||
2073 | if (!ret) | ||
2074 | mtd_erase_callback(instr); | ||
2075 | 2072 | ||
2076 | /* Deselect and wake up anyone waiting on the device */ | 2073 | /* Deselect and wake up anyone waiting on the device */ |
2077 | nand_release_device(mtd); | 2074 | nand_release_device(mtd); |
2078 | 2075 | ||
2076 | /* Do call back function */ | ||
2077 | if (!ret) | ||
2078 | mtd_erase_callback(instr); | ||
2079 | |||
2079 | /* | 2080 | /* |
2080 | * If BBT requires refresh and erase was successful, rewrite any | 2081 | * If BBT requires refresh and erase was successful, rewrite any |
2081 | * selected bad block tables | 2082 | * selected bad block tables |