mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-30 18:47:06 +00:00
120 lines
3.2 KiB
Diff
120 lines
3.2 KiB
Diff
|
From 08263a9ae664b24fa777d20b365601534842b236 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||
|
Date: Wed, 21 Jun 2017 08:26:42 +0200
|
||
|
Subject: [PATCH] mtd: partitions: add helper for deleting partition
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
There are two similar functions handling deletion. One handles single
|
||
|
partition and another the whole MTD flash device. They share (duplicate)
|
||
|
some code so it makes sense to add a small helper for that part.
|
||
|
|
||
|
Function del_mtd_partitions has been moved a bit to keep all deleting
|
||
|
stuff together.
|
||
|
|
||
|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||
|
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
|
||
|
---
|
||
|
drivers/mtd/mtdpart.c | 75 +++++++++++++++++++++++++++++----------------------
|
||
|
1 file changed, 43 insertions(+), 32 deletions(-)
|
||
|
|
||
|
--- a/drivers/mtd/mtdpart.c
|
||
|
+++ b/drivers/mtd/mtdpart.c
|
||
|
@@ -363,32 +363,6 @@ static inline void free_partition(struct
|
||
|
kfree(p);
|
||
|
}
|
||
|
|
||
|
-/*
|
||
|
- * This function unregisters and destroy all slave MTD objects which are
|
||
|
- * attached to the given master MTD object.
|
||
|
- */
|
||
|
-
|
||
|
-int del_mtd_partitions(struct mtd_info *master)
|
||
|
-{
|
||
|
- struct mtd_part *slave, *next;
|
||
|
- int ret, err = 0;
|
||
|
-
|
||
|
- mutex_lock(&mtd_partitions_mutex);
|
||
|
- list_for_each_entry_safe(slave, next, &mtd_partitions, list)
|
||
|
- if (slave->master == master) {
|
||
|
- ret = del_mtd_device(&slave->mtd);
|
||
|
- if (ret < 0) {
|
||
|
- err = ret;
|
||
|
- continue;
|
||
|
- }
|
||
|
- list_del(&slave->list);
|
||
|
- free_partition(slave);
|
||
|
- }
|
||
|
- mutex_unlock(&mtd_partitions_mutex);
|
||
|
-
|
||
|
- return err;
|
||
|
-}
|
||
|
-
|
||
|
static struct mtd_part *allocate_partition(struct mtd_info *master,
|
||
|
const struct mtd_partition *part, int partno,
|
||
|
uint64_t cur_offset)
|
||
|
@@ -675,6 +649,48 @@ int mtd_add_partition(struct mtd_info *m
|
||
|
}
|
||
|
EXPORT_SYMBOL_GPL(mtd_add_partition);
|
||
|
|
||
|
+/**
|
||
|
+ * __mtd_del_partition - delete MTD partition
|
||
|
+ *
|
||
|
+ * @priv: internal MTD struct for partition to be deleted
|
||
|
+ *
|
||
|
+ * This function must be called with the partitions mutex locked.
|
||
|
+ */
|
||
|
+static int __mtd_del_partition(struct mtd_part *priv)
|
||
|
+{
|
||
|
+ int err;
|
||
|
+
|
||
|
+ err = del_mtd_device(&priv->mtd);
|
||
|
+ if (err)
|
||
|
+ return err;
|
||
|
+
|
||
|
+ list_del(&priv->list);
|
||
|
+ free_partition(priv);
|
||
|
+
|
||
|
+ return 0;
|
||
|
+}
|
||
|
+
|
||
|
+/*
|
||
|
+ * This function unregisters and destroy all slave MTD objects which are
|
||
|
+ * attached to the given master MTD object.
|
||
|
+ */
|
||
|
+int del_mtd_partitions(struct mtd_info *master)
|
||
|
+{
|
||
|
+ struct mtd_part *slave, *next;
|
||
|
+ int ret, err = 0;
|
||
|
+
|
||
|
+ mutex_lock(&mtd_partitions_mutex);
|
||
|
+ list_for_each_entry_safe(slave, next, &mtd_partitions, list)
|
||
|
+ if (slave->master == master) {
|
||
|
+ ret = __mtd_del_partition(slave);
|
||
|
+ if (ret < 0)
|
||
|
+ err = ret;
|
||
|
+ }
|
||
|
+ mutex_unlock(&mtd_partitions_mutex);
|
||
|
+
|
||
|
+ return err;
|
||
|
+}
|
||
|
+
|
||
|
int mtd_del_partition(struct mtd_info *master, int partno)
|
||
|
{
|
||
|
struct mtd_part *slave, *next;
|
||
|
@@ -686,12 +702,7 @@ int mtd_del_partition(struct mtd_info *m
|
||
|
(slave->mtd.index == partno)) {
|
||
|
sysfs_remove_files(&slave->mtd.dev.kobj,
|
||
|
mtd_partition_attrs);
|
||
|
- ret = del_mtd_device(&slave->mtd);
|
||
|
- if (ret < 0)
|
||
|
- break;
|
||
|
-
|
||
|
- list_del(&slave->list);
|
||
|
- free_partition(slave);
|
||
|
+ ret = __mtd_del_partition(slave);
|
||
|
break;
|
||
|
}
|
||
|
mutex_unlock(&mtd_partitions_mutex);
|