aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/mtdpart.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mtd/mtdpart.c')
-rw-r--r--drivers/mtd/mtdpart.c30
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}
721EXPORT_SYMBOL_GPL(parse_mtd_partitions); 739EXPORT_SYMBOL_GPL(parse_mtd_partitions);
722 740
723int mtd_is_master(struct mtd_info *mtd) 741int 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}
738EXPORT_SYMBOL_GPL(mtd_is_master); 756EXPORT_SYMBOL_GPL(mtd_is_partition);