diff options
Diffstat (limited to 'drivers/mtd/mtdpart.c')
-rw-r--r-- | drivers/mtd/mtdpart.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c index 79e3689f1e16..0a4760174782 100644 --- a/drivers/mtd/mtdpart.c +++ b/drivers/mtd/mtdpart.c | |||
@@ -120,8 +120,25 @@ static int part_read_oob(struct mtd_info *mtd, loff_t from, | |||
120 | return -EINVAL; | 120 | return -EINVAL; |
121 | if (ops->datbuf && from + ops->len > mtd->size) | 121 | if (ops->datbuf && from + ops->len > mtd->size) |
122 | return -EINVAL; | 122 | return -EINVAL; |
123 | res = part->master->read_oob(part->master, from + part->offset, ops); | ||
124 | 123 | ||
124 | /* | ||
125 | * If OOB is also requested, make sure that we do not read past the end | ||
126 | * of this partition. | ||
127 | */ | ||
128 | if (ops->oobbuf) { | ||
129 | size_t len, pages; | ||
130 | |||
131 | if (ops->mode == MTD_OOB_AUTO) | ||
132 | len = mtd->oobavail; | ||
133 | else | ||
134 | len = mtd->oobsize; | ||
135 | pages = mtd_div_by_ws(mtd->size, mtd); | ||
136 | pages -= mtd_div_by_ws(from, mtd); | ||
137 | if (ops->ooboffs + ops->ooblen > pages * len) | ||
138 | return -EINVAL; | ||
139 | } | ||
140 | |||
141 | res = part->master->read_oob(part->master, from + part->offset, ops); | ||
125 | if (unlikely(res)) { | 142 | if (unlikely(res)) { |
126 | if (res == -EUCLEAN) | 143 | if (res == -EUCLEAN) |
127 | mtd->ecc_stats.corrected++; | 144 | mtd->ecc_stats.corrected++; |
@@ -384,6 +401,7 @@ static struct mtd_part *allocate_partition(struct mtd_info *master, | |||
384 | slave->mtd.flags = master->flags & ~part->mask_flags; | 401 | slave->mtd.flags = master->flags & ~part->mask_flags; |
385 | slave->mtd.size = part->size; | 402 | slave->mtd.size = part->size; |
386 | slave->mtd.writesize = master->writesize; | 403 | slave->mtd.writesize = master->writesize; |
404 | slave->mtd.writebufsize = master->writebufsize; | ||
387 | slave->mtd.oobsize = master->oobsize; | 405 | slave->mtd.oobsize = master->oobsize; |
388 | slave->mtd.oobavail = master->oobavail; | 406 | slave->mtd.oobavail = master->oobavail; |
389 | slave->mtd.subpage_sft = master->subpage_sft; | 407 | slave->mtd.subpage_sft = master->subpage_sft; |
@@ -720,19 +738,19 @@ int parse_mtd_partitions(struct mtd_info *master, const char **types, | |||
720 | } | 738 | } |
721 | EXPORT_SYMBOL_GPL(parse_mtd_partitions); | 739 | EXPORT_SYMBOL_GPL(parse_mtd_partitions); |
722 | 740 | ||
723 | int mtd_is_master(struct mtd_info *mtd) | 741 | int mtd_is_partition(struct mtd_info *mtd) |
724 | { | 742 | { |
725 | struct mtd_part *part; | 743 | struct mtd_part *part; |
726 | int nopart = 0; | 744 | int ispart = 0; |
727 | 745 | ||
728 | mutex_lock(&mtd_partitions_mutex); | 746 | mutex_lock(&mtd_partitions_mutex); |
729 | list_for_each_entry(part, &mtd_partitions, list) | 747 | list_for_each_entry(part, &mtd_partitions, list) |
730 | if (&part->mtd == mtd) { | 748 | if (&part->mtd == mtd) { |
731 | nopart = 1; | 749 | ispart = 1; |
732 | break; | 750 | break; |
733 | } | 751 | } |
734 | mutex_unlock(&mtd_partitions_mutex); | 752 | mutex_unlock(&mtd_partitions_mutex); |
735 | 753 | ||
736 | return nopart; | 754 | return ispart; |
737 | } | 755 | } |
738 | EXPORT_SYMBOL_GPL(mtd_is_master); | 756 | EXPORT_SYMBOL_GPL(mtd_is_partition); |