diff options
author | Boris Brezillon <boris.brezillon@free-electrons.com> | 2018-01-09 03:50:35 -0500 |
---|---|---|
committer | Boris Brezillon <boris.brezillon@free-electrons.com> | 2018-01-16 09:23:22 -0500 |
commit | 0aede42e98e0dfc64534617332b6a120cfcfe850 (patch) | |
tree | 7d6710c5174875f0032699bcf107fe1a7d7d1fd0 | |
parent | 24ff12922278573b1e4c54b4898ab7a3c64be960 (diff) |
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>
-rw-r--r-- | drivers/mtd/devices/docg3.c | 5 | ||||
-rw-r--r-- | drivers/mtd/mtdpart.c | 23 | ||||
-rw-r--r-- | drivers/mtd/nand/nand_base.c | 45 | ||||
-rw-r--r-- | drivers/mtd/onenand/onenand_base.c | 18 |
4 files changed, 0 insertions, 91 deletions
diff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c index 5fb5e93d1547..a85af236b44d 100644 --- a/drivers/mtd/devices/docg3.c +++ b/drivers/mtd/devices/docg3.c | |||
@@ -904,9 +904,6 @@ static int doc_read_oob(struct mtd_info *mtd, loff_t from, | |||
904 | if (ooblen % DOC_LAYOUT_OOB_SIZE) | 904 | if (ooblen % DOC_LAYOUT_OOB_SIZE) |
905 | return -EINVAL; | 905 | return -EINVAL; |
906 | 906 | ||
907 | if (from + len > mtd->size) | ||
908 | return -EINVAL; | ||
909 | |||
910 | ops->oobretlen = 0; | 907 | ops->oobretlen = 0; |
911 | ops->retlen = 0; | 908 | ops->retlen = 0; |
912 | ret = 0; | 909 | ret = 0; |
@@ -1441,8 +1438,6 @@ static int doc_write_oob(struct mtd_info *mtd, loff_t ofs, | |||
1441 | if (len && ooblen && | 1438 | if (len && ooblen && |
1442 | (len / DOC_LAYOUT_PAGE_SIZE) != (ooblen / oobdelta)) | 1439 | (len / DOC_LAYOUT_PAGE_SIZE) != (ooblen / oobdelta)) |
1443 | return -EINVAL; | 1440 | return -EINVAL; |
1444 | if (ofs + len > mtd->size) | ||
1445 | return -EINVAL; | ||
1446 | 1441 | ||
1447 | ops->oobretlen = 0; | 1442 | ops->oobretlen = 0; |
1448 | ops->retlen = 0; | 1443 | ops->retlen = 0; |
diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c index dd28cb0de2c8..76cd21d1171b 100644 --- a/drivers/mtd/mtdpart.c +++ b/drivers/mtd/mtdpart.c | |||
@@ -108,25 +108,6 @@ static int part_read_oob(struct mtd_info *mtd, loff_t from, | |||
108 | struct mtd_ecc_stats stats; | 108 | struct mtd_ecc_stats stats; |
109 | int res; | 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 | stats = part->parent->ecc_stats; | 111 | stats = part->parent->ecc_stats; |
131 | res = part->parent->_read_oob(part->parent, from + part->offset, ops); | 112 | res = part->parent->_read_oob(part->parent, from + part->offset, ops); |
132 | if (unlikely(mtd_is_eccerr(res))) | 113 | if (unlikely(mtd_is_eccerr(res))) |
@@ -191,10 +172,6 @@ static int part_write_oob(struct mtd_info *mtd, loff_t to, | |||
191 | { | 172 | { |
192 | struct mtd_part *part = mtd_to_part(mtd); | 173 | struct mtd_part *part = mtd_to_part(mtd); |
193 | 174 | ||
194 | if (to >= mtd->size) | ||
195 | return -EINVAL; | ||
196 | if (ops->datbuf && to + ops->len > mtd->size) | ||
197 | return -EINVAL; | ||
198 | return part->parent->_write_oob(part->parent, to + part->offset, ops); | 175 | return part->parent->_write_oob(part->parent, to + part->offset, ops); |
199 | } | 176 | } |
200 | 177 | ||
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 889ceadbf607..e7ec55b1d368 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c | |||
@@ -2187,21 +2187,6 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from, | |||
2187 | 2187 | ||
2188 | len = mtd_oobavail(mtd, ops); | 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 | chipnr = (int)(from >> chip->chip_shift); | 2190 | chipnr = (int)(from >> chip->chip_shift); |
2206 | chip->select_chip(mtd, chipnr); | 2191 | chip->select_chip(mtd, chipnr); |
2207 | 2192 | ||
@@ -2272,13 +2257,6 @@ static int nand_read_oob(struct mtd_info *mtd, loff_t from, | |||
2272 | 2257 | ||
2273 | ops->retlen = 0; | 2258 | ops->retlen = 0; |
2274 | 2259 | ||
2275 | /* Do not allow reads past end of device */ | ||
2276 | if (ops->datbuf && (from + ops->len) > mtd->size) { | ||
2277 | pr_debug("%s: attempt to read beyond end of device\n", | ||
2278 | __func__); | ||
2279 | return -EINVAL; | ||
2280 | } | ||
2281 | |||
2282 | if (ops->mode != MTD_OPS_PLACE_OOB && | 2260 | if (ops->mode != MTD_OPS_PLACE_OOB && |
2283 | ops->mode != MTD_OPS_AUTO_OOB && | 2261 | ops->mode != MTD_OPS_AUTO_OOB && |
2284 | ops->mode != MTD_OPS_RAW) | 2262 | ops->mode != MTD_OPS_RAW) |
@@ -2820,22 +2798,6 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to, | |||
2820 | return -EINVAL; | 2798 | return -EINVAL; |
2821 | } | 2799 | } |
2822 | 2800 | ||
2823 | if (unlikely(ops->ooboffs >= len)) { | ||
2824 | pr_debug("%s: attempt to start write outside oob\n", | ||
2825 | __func__); | ||
2826 | return -EINVAL; | ||
2827 | } | ||
2828 | |||
2829 | /* Do not allow write past end of device */ | ||
2830 | if (unlikely(to >= mtd->size || | ||
2831 | ops->ooboffs + ops->ooblen > | ||
2832 | ((mtd->size >> chip->page_shift) - | ||
2833 | (to >> chip->page_shift)) * len)) { | ||
2834 | pr_debug("%s: attempt to write beyond end of device\n", | ||
2835 | __func__); | ||
2836 | return -EINVAL; | ||
2837 | } | ||
2838 | |||
2839 | chipnr = (int)(to >> chip->chip_shift); | 2801 | chipnr = (int)(to >> chip->chip_shift); |
2840 | 2802 | ||
2841 | /* | 2803 | /* |
@@ -2891,13 +2853,6 @@ static int nand_write_oob(struct mtd_info *mtd, loff_t to, | |||
2891 | 2853 | ||
2892 | ops->retlen = 0; | 2854 | ops->retlen = 0; |
2893 | 2855 | ||
2894 | /* Do not allow writes past end of device */ | ||
2895 | if (ops->datbuf && (to + ops->len) > mtd->size) { | ||
2896 | pr_debug("%s: attempt to write beyond end of device\n", | ||
2897 | __func__); | ||
2898 | return -EINVAL; | ||
2899 | } | ||
2900 | |||
2901 | nand_get_device(mtd, FL_WRITING); | 2856 | nand_get_device(mtd, FL_WRITING); |
2902 | 2857 | ||
2903 | switch (ops->mode) { | 2858 | switch (ops->mode) { |
diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c index 050ba8a87543..979f4031f23c 100644 --- a/drivers/mtd/onenand/onenand_base.c +++ b/drivers/mtd/onenand/onenand_base.c | |||
@@ -1383,15 +1383,6 @@ static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from, | |||
1383 | return -EINVAL; | 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 | stats = mtd->ecc_stats; | 1386 | stats = mtd->ecc_stats; |
1396 | 1387 | ||
1397 | readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB; | 1388 | readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB; |
@@ -2024,15 +2015,6 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to, | |||
2024 | return -EINVAL; | 2015 | return -EINVAL; |
2025 | } | 2016 | } |
2026 | 2017 | ||
2027 | /* Do not allow reads past end of device */ | ||
2028 | if (unlikely(to >= mtd->size || | ||
2029 | column + len > ((mtd->size >> this->page_shift) - | ||
2030 | (to >> this->page_shift)) * oobsize)) { | ||
2031 | printk(KERN_ERR "%s: Attempted to write past end of device\n", | ||
2032 | __func__); | ||
2033 | return -EINVAL; | ||
2034 | } | ||
2035 | |||
2036 | oobbuf = this->oob_buf; | 2018 | oobbuf = this->oob_buf; |
2037 | 2019 | ||
2038 | oobcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_PROG : ONENAND_CMD_PROGOOB; | 2020 | oobcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_PROG : ONENAND_CMD_PROGOOB; |