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

mtd: Remove duplicate checks on mtd_oob_ops parameter

Some of the check done in custom ->_read/write_oob() implementation are
already done by the core (in mtd_check_oob_ops()).

Suggested-by: Peter Pan <peterpansjtu@gmail.com>
[Remove redundant checks done in mtdpart.c]
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Tested-by: Ladislav Michl <ladis@linux-mips.org>

-91
-5
drivers/mtd/devices/docg3.c
··· 904 904 if (ooblen % DOC_LAYOUT_OOB_SIZE) 905 905 return -EINVAL; 906 906 907 - if (from + len > mtd->size) 908 - return -EINVAL; 909 - 910 907 ops->oobretlen = 0; 911 908 ops->retlen = 0; 912 909 ret = 0; ··· 1437 1440 return -EINVAL; 1438 1441 if (len && ooblen && 1439 1442 (len / DOC_LAYOUT_PAGE_SIZE) != (ooblen / oobdelta)) 1440 - return -EINVAL; 1441 - if (ofs + len > mtd->size) 1442 1443 return -EINVAL; 1443 1444 1444 1445 ops->oobretlen = 0;
-23
drivers/mtd/mtdpart.c
··· 108 108 struct mtd_ecc_stats stats; 109 109 int res; 110 110 111 - if (from >= mtd->size) 112 - return -EINVAL; 113 - if (ops->datbuf && from + ops->len > mtd->size) 114 - return -EINVAL; 115 - 116 - /* 117 - * If OOB is also requested, make sure that we do not read past the end 118 - * of this partition. 119 - */ 120 - if (ops->oobbuf) { 121 - size_t len, pages; 122 - 123 - len = mtd_oobavail(mtd, ops); 124 - pages = mtd_div_by_ws(mtd->size, mtd); 125 - pages -= mtd_div_by_ws(from, mtd); 126 - if (ops->ooboffs + ops->ooblen > pages * len) 127 - return -EINVAL; 128 - } 129 - 130 111 stats = part->parent->ecc_stats; 131 112 res = part->parent->_read_oob(part->parent, from + part->offset, ops); 132 113 if (unlikely(mtd_is_eccerr(res))) ··· 172 191 { 173 192 struct mtd_part *part = mtd_to_part(mtd); 174 193 175 - if (to >= mtd->size) 176 - return -EINVAL; 177 - if (ops->datbuf && to + ops->len > mtd->size) 178 - return -EINVAL; 179 194 return part->parent->_write_oob(part->parent, to + part->offset, ops); 180 195 } 181 196
-45
drivers/mtd/nand/nand_base.c
··· 2187 2187 2188 2188 len = mtd_oobavail(mtd, ops); 2189 2189 2190 - if (unlikely(ops->ooboffs >= len)) { 2191 - pr_debug("%s: attempt to start read outside oob\n", 2192 - __func__); 2193 - return -EINVAL; 2194 - } 2195 - 2196 - /* Do not allow reads past end of device */ 2197 - if (unlikely(from >= mtd->size || 2198 - ops->ooboffs + readlen > ((mtd->size >> chip->page_shift) - 2199 - (from >> chip->page_shift)) * len)) { 2200 - pr_debug("%s: attempt to read beyond end of device\n", 2201 - __func__); 2202 - return -EINVAL; 2203 - } 2204 - 2205 2190 chipnr = (int)(from >> chip->chip_shift); 2206 2191 chip->select_chip(mtd, chipnr); 2207 2192 ··· 2256 2271 int ret; 2257 2272 2258 2273 ops->retlen = 0; 2259 - 2260 - /* Do not allow reads past end of device */ 2261 - if (ops->datbuf && (from + ops->len) > mtd->size) { 2262 - pr_debug("%s: attempt to read beyond end of device\n", 2263 - __func__); 2264 - return -EINVAL; 2265 - } 2266 2274 2267 2275 if (ops->mode != MTD_OPS_PLACE_OOB && 2268 2276 ops->mode != MTD_OPS_AUTO_OOB && ··· 2798 2820 return -EINVAL; 2799 2821 } 2800 2822 2801 - if (unlikely(ops->ooboffs >= len)) { 2802 - pr_debug("%s: attempt to start write outside oob\n", 2803 - __func__); 2804 - return -EINVAL; 2805 - } 2806 - 2807 - /* Do not allow write past end of device */ 2808 - if (unlikely(to >= mtd->size || 2809 - ops->ooboffs + ops->ooblen > 2810 - ((mtd->size >> chip->page_shift) - 2811 - (to >> chip->page_shift)) * len)) { 2812 - pr_debug("%s: attempt to write beyond end of device\n", 2813 - __func__); 2814 - return -EINVAL; 2815 - } 2816 - 2817 2823 chipnr = (int)(to >> chip->chip_shift); 2818 2824 2819 2825 /* ··· 2852 2890 int ret = -ENOTSUPP; 2853 2891 2854 2892 ops->retlen = 0; 2855 - 2856 - /* Do not allow writes past end of device */ 2857 - if (ops->datbuf && (to + ops->len) > mtd->size) { 2858 - pr_debug("%s: attempt to write beyond end of device\n", 2859 - __func__); 2860 - return -EINVAL; 2861 - } 2862 2893 2863 2894 nand_get_device(mtd, FL_WRITING); 2864 2895
-18
drivers/mtd/onenand/onenand_base.c
··· 1383 1383 return -EINVAL; 1384 1384 } 1385 1385 1386 - /* Do not allow reads past end of device */ 1387 - if (unlikely(from >= mtd->size || 1388 - column + len > ((mtd->size >> this->page_shift) - 1389 - (from >> this->page_shift)) * oobsize)) { 1390 - printk(KERN_ERR "%s: Attempted to read beyond end of device\n", 1391 - __func__); 1392 - return -EINVAL; 1393 - } 1394 - 1395 1386 stats = mtd->ecc_stats; 1396 1387 1397 1388 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB; ··· 2012 2021 if (unlikely(column + len > oobsize)) { 2013 2022 printk(KERN_ERR "%s: Attempt to write past end of page\n", 2014 2023 __func__); 2015 - return -EINVAL; 2016 - } 2017 - 2018 - /* Do not allow reads past end of device */ 2019 - if (unlikely(to >= mtd->size || 2020 - column + len > ((mtd->size >> this->page_shift) - 2021 - (to >> this->page_shift)) * oobsize)) { 2022 - printk(KERN_ERR "%s: Attempted to write past end of device\n", 2023 - __func__); 2024 2024 return -EINVAL; 2025 2025 } 2026 2026