mtd: nand: Only allocate ecc->{calc, code}_buf when actually needed
The only users of the ecc->{calc,code}_buf buffers are NAND controller drivers implementing ecc->calculate() and/or ecc->correct(). Since the ->oobsize can be non-negligle, especially on modern NAND devices, we'd better allocate it only when it is actually required. Make ecc->{calc,code}_buf allocation dependent on the presence of ecc->calculate() or ecc->correct(). Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> Reviewed-by: Masahiro Yamada <yamada.masahiro@socionext.com>
This commit is contained in:
parent
8c677541bb
commit
aeb93af96d
|
@ -5318,21 +5318,9 @@ int nand_scan_tail(struct mtd_info *mtd)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
ecc->calc_buf = kmalloc(mtd->oobsize, GFP_KERNEL);
|
||||
if (!ecc->calc_buf)
|
||||
return -ENOMEM;
|
||||
|
||||
ecc->code_buf = kmalloc(mtd->oobsize, GFP_KERNEL);
|
||||
if (!ecc->code_buf) {
|
||||
ret = -ENOMEM;
|
||||
goto err_free_buf;
|
||||
}
|
||||
|
||||
chip->data_buf = kmalloc(mtd->writesize + mtd->oobsize, GFP_KERNEL);
|
||||
if (!chip->data_buf) {
|
||||
ret = -ENOMEM;
|
||||
goto err_free_buf;
|
||||
}
|
||||
if (!chip->data_buf)
|
||||
return -ENOMEM;
|
||||
|
||||
/*
|
||||
* FIXME: some NAND manufacturer drivers expect the first die to be
|
||||
|
@ -5495,6 +5483,15 @@ int nand_scan_tail(struct mtd_info *mtd)
|
|||
goto err_nand_manuf_cleanup;
|
||||
}
|
||||
|
||||
if (ecc->correct || ecc->calculate) {
|
||||
ecc->calc_buf = kmalloc(mtd->oobsize, GFP_KERNEL);
|
||||
ecc->code_buf = kmalloc(mtd->oobsize, GFP_KERNEL);
|
||||
if (!ecc->calc_buf || !ecc->code_buf) {
|
||||
ret = -ENOMEM;
|
||||
goto err_nand_manuf_cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
/* For many systems, the standard OOB write also works for raw */
|
||||
if (!ecc->read_oob_raw)
|
||||
ecc->read_oob_raw = ecc->read_oob;
|
||||
|
|
Loading…
Reference in New Issue