提交 97519dc5 编写于 作者: R Rafał Miłecki 提交者: Brian Norris

mtd: partitions: add support for subpartitions

Some flash device partitions can be containers with extra subpartitions
(volumes). All callbacks are already capable of this additional level of
indirection.

This patch makes sure we always display subpartitions using a tree
structure and takes care of deleting subpartitions when parent gets
removed.
Signed-off-by: NRafał Miłecki <rafal@milecki.pl>
Signed-off-by: NBrian Norris <computersforpeace@gmail.com>
上级 0a9d72b6
...@@ -413,7 +413,7 @@ static struct mtd_part *allocate_partition(struct mtd_info *parent, ...@@ -413,7 +413,7 @@ static struct mtd_part *allocate_partition(struct mtd_info *parent,
* parent conditional on that option. Note, this is a way to * parent conditional on that option. Note, this is a way to
* distinguish between the master and the partition in sysfs. * distinguish between the master and the partition in sysfs.
*/ */
slave->mtd.dev.parent = IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER) ? slave->mtd.dev.parent = IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER) || mtd_is_partition(parent) ?
&parent->dev : &parent->dev :
parent->dev.parent; parent->dev.parent;
slave->mtd.dev.of_node = part->of_node; slave->mtd.dev.of_node = part->of_node;
...@@ -664,8 +664,17 @@ EXPORT_SYMBOL_GPL(mtd_add_partition); ...@@ -664,8 +664,17 @@ EXPORT_SYMBOL_GPL(mtd_add_partition);
*/ */
static int __mtd_del_partition(struct mtd_part *priv) static int __mtd_del_partition(struct mtd_part *priv)
{ {
struct mtd_part *child, *next;
int err; int err;
list_for_each_entry_safe(child, next, &mtd_partitions, list) {
if (child->parent == &priv->mtd) {
err = __mtd_del_partition(child);
if (err)
return err;
}
}
sysfs_remove_files(&priv->mtd.dev.kobj, mtd_partition_attrs); sysfs_remove_files(&priv->mtd.dev.kobj, mtd_partition_attrs);
err = del_mtd_device(&priv->mtd); err = del_mtd_device(&priv->mtd);
...@@ -680,16 +689,16 @@ static int __mtd_del_partition(struct mtd_part *priv) ...@@ -680,16 +689,16 @@ static int __mtd_del_partition(struct mtd_part *priv)
/* /*
* This function unregisters and destroy all slave MTD objects which are * This function unregisters and destroy all slave MTD objects which are
* attached to the given master MTD object. * attached to the given MTD object.
*/ */
int del_mtd_partitions(struct mtd_info *master) int del_mtd_partitions(struct mtd_info *mtd)
{ {
struct mtd_part *slave, *next; struct mtd_part *slave, *next;
int ret, err = 0; int ret, err = 0;
mutex_lock(&mtd_partitions_mutex); mutex_lock(&mtd_partitions_mutex);
list_for_each_entry_safe(slave, next, &mtd_partitions, list) list_for_each_entry_safe(slave, next, &mtd_partitions, list)
if (slave->parent == master) { if (slave->parent == mtd) {
ret = __mtd_del_partition(slave); ret = __mtd_del_partition(slave);
if (ret < 0) if (ret < 0)
err = ret; err = ret;
...@@ -699,14 +708,14 @@ int del_mtd_partitions(struct mtd_info *master) ...@@ -699,14 +708,14 @@ int del_mtd_partitions(struct mtd_info *master)
return err; return err;
} }
int mtd_del_partition(struct mtd_info *master, int partno) int mtd_del_partition(struct mtd_info *mtd, int partno)
{ {
struct mtd_part *slave, *next; struct mtd_part *slave, *next;
int ret = -EINVAL; int ret = -EINVAL;
mutex_lock(&mtd_partitions_mutex); mutex_lock(&mtd_partitions_mutex);
list_for_each_entry_safe(slave, next, &mtd_partitions, list) list_for_each_entry_safe(slave, next, &mtd_partitions, list)
if ((slave->parent == master) && if ((slave->parent == mtd) &&
(slave->mtd.index == partno)) { (slave->mtd.index == partno)) {
ret = __mtd_del_partition(slave); ret = __mtd_del_partition(slave);
break; break;
...@@ -939,6 +948,6 @@ uint64_t mtd_get_device_size(const struct mtd_info *mtd) ...@@ -939,6 +948,6 @@ uint64_t mtd_get_device_size(const struct mtd_info *mtd)
if (!mtd_is_partition(mtd)) if (!mtd_is_partition(mtd))
return mtd->size; return mtd->size;
return mtd_to_part(mtd)->parent->size; return mtd_get_device_size(mtd_to_part(mtd)->parent);
} }
EXPORT_SYMBOL_GPL(mtd_get_device_size); EXPORT_SYMBOL_GPL(mtd_get_device_size);
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册