Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mtd: create an mtd_oobavail() helper and make use of it

Currently, all MTD drivers/sublayers exposing an OOB area are
doing the same kind of test to extract the available OOB size
based on the mtd_info and mtd_oob_ops structures.
Move this common logic into an inline function and make use of it.

Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Suggested-by: Priit Laes <plaes@plaes.org>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>

authored by

Boris BREZILLON and committed by
Brian Norris
29f1058a f5b8aa78

+13 -32
+1 -4
drivers/mtd/mtdpart.c
··· 126 126 if (ops->oobbuf) { 127 127 size_t len, pages; 128 128 129 - if (ops->mode == MTD_OPS_AUTO_OOB) 130 - len = mtd->oobavail; 131 - else 132 - len = mtd->oobsize; 129 + len = mtd_oobavail(mtd, ops); 133 130 pages = mtd_div_by_ws(mtd->size, mtd); 134 131 pages -= mtd_div_by_ws(from, mtd); 135 132 if (ops->ooboffs + ops->ooblen > pages * len)
+4 -12
drivers/mtd/nand/nand_base.c
··· 1723 1723 int ret = 0; 1724 1724 uint32_t readlen = ops->len; 1725 1725 uint32_t oobreadlen = ops->ooblen; 1726 - uint32_t max_oobsize = ops->mode == MTD_OPS_AUTO_OOB ? 1727 - mtd->oobavail : mtd->oobsize; 1726 + uint32_t max_oobsize = mtd_oobavail(mtd, ops); 1728 1727 1729 1728 uint8_t *bufpoi, *oob, *buf; 1730 1729 int use_bufpoi; ··· 2074 2075 2075 2076 stats = mtd->ecc_stats; 2076 2077 2077 - if (ops->mode == MTD_OPS_AUTO_OOB) 2078 - len = mtd->oobavail; 2079 - else 2080 - len = mtd->oobsize; 2078 + len = mtd_oobavail(mtd, ops); 2081 2079 2082 2080 if (unlikely(ops->ooboffs >= len)) { 2083 2081 pr_debug("%s: attempt to start read outside oob\n", ··· 2571 2575 uint32_t writelen = ops->len; 2572 2576 2573 2577 uint32_t oobwritelen = ops->ooblen; 2574 - uint32_t oobmaxlen = ops->mode == MTD_OPS_AUTO_OOB ? 2575 - mtd->oobavail : mtd->oobsize; 2578 + uint32_t oobmaxlen = mtd_oobavail(mtd, ops); 2576 2579 2577 2580 uint8_t *oob = ops->oobbuf; 2578 2581 uint8_t *buf = ops->datbuf; ··· 2761 2766 pr_debug("%s: to = 0x%08x, len = %i\n", 2762 2767 __func__, (unsigned int)to, (int)ops->ooblen); 2763 2768 2764 - if (ops->mode == MTD_OPS_AUTO_OOB) 2765 - len = mtd->oobavail; 2766 - else 2767 - len = mtd->oobsize; 2769 + len = mtd_oobavail(mtd, ops); 2768 2770 2769 2771 /* Do not allow write past end of page */ 2770 2772 if ((ops->ooboffs + ops->ooblen) > len) {
+3 -16
drivers/mtd/onenand/onenand_base.c
··· 1124 1124 pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from, 1125 1125 (int)len); 1126 1126 1127 - if (ops->mode == MTD_OPS_AUTO_OOB) 1128 - oobsize = mtd->oobavail; 1129 - else 1130 - oobsize = mtd->oobsize; 1131 - 1127 + oobsize = mtd_oobavail(mtd, ops); 1132 1128 oobcolumn = from & (mtd->oobsize - 1); 1133 1129 1134 1130 /* Do not allow reads past end of device */ ··· 1225 1229 pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from, 1226 1230 (int)len); 1227 1231 1228 - if (ops->mode == MTD_OPS_AUTO_OOB) 1229 - oobsize = mtd->oobavail; 1230 - else 1231 - oobsize = mtd->oobsize; 1232 - 1232 + oobsize = mtd_oobavail(mtd, ops); 1233 1233 oobcolumn = from & (mtd->oobsize - 1); 1234 1234 1235 1235 /* Do not allow reads past end of device */ ··· 1877 1885 /* Check zero length */ 1878 1886 if (!len) 1879 1887 return 0; 1880 - 1881 - if (ops->mode == MTD_OPS_AUTO_OOB) 1882 - oobsize = mtd->oobavail; 1883 - else 1884 - oobsize = mtd->oobsize; 1885 - 1888 + oobsize = mtd_oobavail(mtd, ops); 1886 1889 oobcolumn = to & (mtd->oobsize - 1); 1887 1890 1888 1891 column = to & (mtd->writesize - 1);
+5
include/linux/mtd/mtd.h
··· 264 264 return mtd->dev.of_node; 265 265 } 266 266 267 + static inline int mtd_oobavail(struct mtd_info *mtd, struct mtd_oob_ops *ops) 268 + { 269 + return ops->mode == MTD_OPS_AUTO_OOB ? mtd->oobavail : mtd->oobsize; 270 + } 271 + 267 272 int mtd_erase(struct mtd_info *mtd, struct erase_info *instr); 268 273 int mtd_point(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, 269 274 void **virt, resource_size_t *phys);