From: Sascha Hauer <s.hauer@pengutronix.de>
To: Barebox List <barebox@lists.infradead.org>
Subject: [PATCH] devfs: Do not create overlapping partitions
Date: Mon, 11 Oct 2021 09:30:25 +0200 [thread overview]
Message-ID: <20211011073025.4187545-1-s.hauer@pengutronix.de> (raw)
Until now it has been possible to create overlapping partitions. Go away
from that and allow to create partitions only in unallocated areas of a
device. This lowers the risk of having inconsistent partitioning and
increases the chance that inconsistent partitioning is recognized by
the user.
We had explicit overlap checking for the environment partition which
becomes unnecessary with this change and is removed.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
common/startup.c | 70 +-----------------------------------------------
fs/devfs-core.c | 34 +++++++++++++++++++++++
2 files changed, 35 insertions(+), 69 deletions(-)
diff --git a/common/startup.c b/common/startup.c
index f72902fc53..f53b73f81a 100644
--- a/common/startup.c
+++ b/common/startup.c
@@ -68,70 +68,6 @@ static int mount_root(void)
fs_initcall(mount_root);
#endif
-#ifdef CONFIG_ENV_HANDLING
-static bool region_overlap(loff_t starta, loff_t lena,
- loff_t startb, loff_t lenb)
-{
- if (starta + lena <= startb)
- return 0;
- if (startb + lenb <= starta)
- return 0;
- return 1;
-}
-
-static int check_overlap(const char *path)
-{
- struct cdev *cenv, *cdisk, *cpart;
- const char *name;
-
- name = devpath_to_name(path);
-
- if (name == path)
- /*
- * no /dev/ in front, so *path is some file. No need to
- * check further.
- */
- return 0;
-
- cenv = cdev_by_name(name);
- if (!cenv)
- return -EINVAL;
-
- if (cenv->mtd)
- return 0;
-
- cdisk = cenv->master;
-
- if (!cdisk)
- return 0;
-
- list_for_each_entry(cpart, &cdisk->partitions, partition_entry) {
- if (cpart == cenv)
- continue;
-
- if (region_overlap(cpart->offset, cpart->size,
- cenv->offset, cenv->size))
- goto conflict;
- }
-
- return 0;
-
-conflict:
- pr_err("Environment partition (0x%08llx-0x%08llx) "
- "overlaps with partition %s (0x%08llx-0x%08llx), not using it\n",
- cenv->offset, cenv->offset + cenv->size - 1,
- cpart->name,
- cpart->offset, cpart->offset + cpart->size - 1);
-
- return -EINVAL;
-}
-#else
-static int check_overlap(const char *path)
-{
- return 0;
-}
-#endif
-
static int load_environment(void)
{
const char *default_environment_path;
@@ -143,11 +79,7 @@ static int load_environment(void)
defaultenv_load("/env", 0);
if (IS_ENABLED(CONFIG_ENV_HANDLING)) {
- ret = check_overlap(default_environment_path);
- if (ret)
- default_environment_path_set(NULL);
- else
- envfs_load(default_environment_path, "/env", 0);
+ envfs_load(default_environment_path, "/env", 0);
} else {
if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT))
pr_notice("No support for persistent environment. Using default environment\n");
diff --git a/fs/devfs-core.c b/fs/devfs-core.c
index 30ad0e0508..3715e543e6 100644
--- a/fs/devfs-core.c
+++ b/fs/devfs-core.c
@@ -301,6 +301,37 @@ int devfs_remove(struct cdev *cdev)
return 0;
}
+static bool region_overlap(loff_t starta, loff_t lena,
+ loff_t startb, loff_t lenb)
+{
+ if (starta + lena <= startb)
+ return 0;
+ if (startb + lenb <= starta)
+ return 0;
+ return 1;
+}
+
+static int check_overlap(struct cdev *cdev, const char *name, loff_t offset, loff_t size)
+{
+ struct cdev *cpart;
+
+ list_for_each_entry(cpart, &cdev->partitions, partition_entry) {
+ if (region_overlap(cpart->offset, cpart->size,
+ offset, size))
+ goto conflict;
+ }
+
+ return 0;
+
+conflict:
+ pr_err("New partition %s (0x%08llx-0x%08llx) on %s "
+ "overlaps with partition %s (0x%08llx-0x%08llx), not creating it\n",
+ name, offset, offset + size - 1, cpart->name,
+ cpart->name, cpart->offset, cpart->offset + cpart->size - 1);
+
+ return -EINVAL;
+}
+
static struct cdev *__devfs_add_partition(struct cdev *cdev,
const struct devfs_partition *partinfo, loff_t *end)
{
@@ -336,6 +367,9 @@ static struct cdev *__devfs_add_partition(struct cdev *cdev,
return ERR_PTR(-EINVAL);
}
+ if (check_overlap(cdev, partinfo->name, offset, size))
+ return ERR_PTR(-EINVAL);
+
if (IS_ENABLED(CONFIG_MTD) && cdev->mtd) {
struct mtd_info *mtd;
--
2.30.2
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
next reply other threads:[~2021-10-11 7:32 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-11 7:30 Sascha Hauer [this message]
2022-07-11 8:31 ` Uwe Kleine-König
2022-07-11 9:09 ` [PATCH 1/2] devfs: take into account for the partitions check that mtd is different Uwe Kleine-König
2022-07-11 9:09 ` [PATCH 2/2] devfs: Fix device name in overlap error message Uwe Kleine-König
2022-07-11 10:31 ` [PATCH 1/2] devfs: take into account for the partitions check that mtd is different Sascha Hauer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211011073025.4187545-1-s.hauer@pengutronix.de \
--to=s.hauer@pengutronix.de \
--cc=barebox@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox