aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Ehrenberg <dehrenberg@chromium.org>2015-04-02 18:15:12 -0400
committerBrian Norris <computersforpeace@gmail.com>2015-04-05 20:44:03 -0400
commit3a434f66e6dab645d74a59c95651cdbe16497a50 (patch)
treef5e2436ddb07c5275abc029db9ff82f98914a6da
parenta62c24d75529118d10c45350c3b75715d52ff574 (diff)
mtd: part: Remove partition overlap checks
This patch makes MTD dynamic partitioning more flexible by removing overlap checks for dynamic partitions. I don't see any particular reason why overlapping dynamic partitions should be prohibited while static partitions are allowed to overlap freely. The checks previously had an off-by-one error, where 'end' should be one less than what it is currently set at, and adding partitions out of increasing order will fail. Disabling the checks resolves this issue. Signed-off-by: Dan Ehrenberg <dehrenberg@chromium.org> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
-rw-r--r--drivers/mtd/mtdpart.c21
1 files changed, 1 insertions, 20 deletions
diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
index be8034086701..cafdb8855a79 100644
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
@@ -582,8 +582,7 @@ int mtd_add_partition(struct mtd_info *master, const char *name,
582 long long offset, long long length) 582 long long offset, long long length)
583{ 583{
584 struct mtd_partition part; 584 struct mtd_partition part;
585 struct mtd_part *p, *new; 585 struct mtd_part *new;
586 uint64_t start, end;
587 int ret = 0; 586 int ret = 0;
588 587
589 /* the direct offset is expected */ 588 /* the direct offset is expected */
@@ -607,21 +606,7 @@ int mtd_add_partition(struct mtd_info *master, const char *name,
607 if (IS_ERR(new)) 606 if (IS_ERR(new))
608 return PTR_ERR(new); 607 return PTR_ERR(new);
609 608
610 start = offset;
611 end = offset + length;
612
613 mutex_lock(&mtd_partitions_mutex); 609 mutex_lock(&mtd_partitions_mutex);
614 list_for_each_entry(p, &mtd_partitions, list)
615 if (p->master == master) {
616 if ((start >= p->offset) &&
617 (start < (p->offset + p->mtd.size)))
618 goto err_inv;
619
620 if ((end >= p->offset) &&
621 (end < (p->offset + p->mtd.size)))
622 goto err_inv;
623 }
624
625 list_add(&new->list, &mtd_partitions); 610 list_add(&new->list, &mtd_partitions);
626 mutex_unlock(&mtd_partitions_mutex); 611 mutex_unlock(&mtd_partitions_mutex);
627 612
@@ -630,10 +615,6 @@ int mtd_add_partition(struct mtd_info *master, const char *name,
630 mtd_add_partition_attrs(new); 615 mtd_add_partition_attrs(new);
631 616
632 return ret; 617 return ret;
633err_inv:
634 mutex_unlock(&mtd_partitions_mutex);
635 free_partition(new);
636 return -EINVAL;
637} 618}
638EXPORT_SYMBOL_GPL(mtd_add_partition); 619EXPORT_SYMBOL_GPL(mtd_add_partition);
639 620