mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Marco Felsch <m.felsch@pengutronix.de>
To: Ahmad Fatoum <a.fatoum@pengutronix.de>
Cc: barebox@lists.infradead.org
Subject: Re: [PATCH 10/18] cdev: have devfs_add_partition return existing identical partition, not NULL
Date: Thu, 1 Jun 2023 10:26:27 +0200	[thread overview]
Message-ID: <20230601082627.2q7bush7r4fce5bt@pengutronix.de> (raw)
In-Reply-To: <21481bc5-e36f-2bd3-e932-1eb0af71b176@pengutronix.de>

On 23-06-01, Ahmad Fatoum wrote:
> Hello Marco,
> 
> On 31.05.23 19:23, Marco Felsch wrote:
> > Hi Ahmad,
> > 
> > On 23-05-31, Ahmad Fatoum wrote:
> >> Starting with commit 7f9f45b9bfef ("devfs: Do not create overlapping
> >> partitions"), any overlapping is disallowed. Overlapping can be useful
> >> though to bridge the gap between partition described in DT and via
> >> on-disk partition tables. Let's handle the case of identical partitions
> >> specially and have it neither be an error or a duplicate partition, but
> >> instead just return the existing partition. This existing partition will
> >> be given a device tree node and thus enabling schemes like:
> >>
> >>   &{/state} {
> >>   	backend = <&state_part>;
> >>   };
> >>
> >>   &mmc1 {
> >>          partitions {
> >>                  compatible = "fixed-partitions";
> >>                  #address-cells = <2>;
> >>                  #size-cells = <2>;
> >>
> >>                  state_part: partition@5300000 {
> >>                          label = "barebox-state";
> >> 			 /* will be folded with overlapping GPT partition if found */
> >>                          reg = <0x0 0x5300000 0x0 0x100000>;
> >>                  };
> >>          };
> >>   };
> >>
> >> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
> >> ---
> >>  fs/devfs-core.c | 50 ++++++++++++++++++++++++++++++++++++++-----------
> >>  1 file changed, 39 insertions(+), 11 deletions(-)
> >>
> >> diff --git a/fs/devfs-core.c b/fs/devfs-core.c
> >> index a0732dafca42..b3a274d01ee0 100644
> >> --- a/fs/devfs-core.c
> >> +++ b/fs/devfs-core.c
> >> @@ -402,6 +402,12 @@ int devfs_remove(struct cdev *cdev)
> >>  	return 0;
> >>  }
> >>  
> >> +static bool region_identical(loff_t starta, loff_t lena,
> >> +			     loff_t startb, loff_t lenb)
> >> +{
> >> +	return starta == startb && lena == lenb;
> >> +}
> >> +
> >>  static bool region_overlap(loff_t starta, loff_t lena,
> >>  			   loff_t startb, loff_t lenb)
> >>  {
> >> @@ -412,10 +418,22 @@ static bool region_overlap(loff_t starta, loff_t lena,
> >>  	return 1;
> >>  }
> >>  
> >> -static int check_overlap(struct cdev *cdev, const char *name, loff_t offset, loff_t size)
> >> +/**
> >> + * check_overlap() - check overlap with existing partitions
> >> + * @cdev: parent cdev
> >> + * @name: partition name for informational purposes on conflict
> >> + * @offset: offset of new partition to be added
> >> + * @size: size of new partition to be added
> >> + *
> >> + * Return: NULL if no overlapping partition found or overlapping
> >> + *         partition if and only if it's identical in offset and size
> >> + *         to an existing partition. Otherwise, PTR_ERR(-EINVAL).
> >> + */
> >> +static struct cdev *check_overlap(struct cdev *cdev, const char *name, loff_t offset, loff_t size)
> >>  {
> >>  	struct cdev *cpart;
> >>  	loff_t cpart_offset;
> >> +	int ret;
> >>  
> >>  	list_for_each_entry(cpart, &cdev->partitions, partition_entry) {
> >>  		cpart_offset = cpart->offset;
> >> @@ -428,20 +446,28 @@ static int check_overlap(struct cdev *cdev, const char *name, loff_t offset, lof
> >>  		if (cpart->mtd)
> >>  			cpart_offset = cpart->mtd->master_offset;
> >>  
> >> -		if (region_overlap(cpart_offset, cpart->size,
> >> -				   offset, size))
> >> +		if (region_identical(cpart_offset, cpart->size, offset, size)) {
> >> +			ret = 0;
> >>  			goto conflict;
> >> +		}
> > 
> > The 'goto conflict' is a bit misleading here since this is no conflict
> > as you described within the commit message.
> 
> It's still a conflict, but one that can be resolved by returning the existing
> partition.
> 
> > I would rather do:
> > 
> > 		if (region_identical(cpart_offset, cpart->size, offset, size))
> > 			goto out_identical;
> > 
> > and replace the __pr_printk() by pr_debug(). This way you split
> > __pr_printk() and drop the ternary operator. The rest lgtm.
> 
> The print line is going to be long anyway, so why not share it between
> the two cases?

It's long but at least to me it is easier to read and later on to grep
for albeit it already has many parameters. Anyway this is just a nit and
at least to me easier to read since you don't need the additional ret
parameter which you need to re-evaluate later on.

Regards,
  Marco

> 
> > 
> > Regards,
> >   Marco
> > 
> >> +
> >> +		if (region_overlap(cpart_offset, cpart->size, offset, size)) {
> >> +			ret = -EINVAL;
> >> +			goto conflict;
> >> +		}
> >>  	}
> >>  
> >> -	return 0;
> >> +	return NULL;
> >>  
> >>  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, cdev->name,
> >> -		cpart->name, cpart_offset, cpart_offset + cpart->size - 1);
> >> +	__pr_printk(ret ? MSG_WARNING : MSG_DEBUG,
> >> +		    "New partition %s (0x%08llx-0x%08llx) on %s "
> >> +		    "%s with partition %s (0x%08llx-0x%08llx), not creating it\n",
> >> +		    name, offset, offset + size - 1, cdev->name,
> >> +		    ret ? "conflicts" : "identical",
> >> +		    cpart->name, cpart_offset, cpart_offset + cpart->size - 1);
> >>  
> >> -	return -EINVAL;
> >> +	return ret ? ERR_PTR(ret) : cpart;
> >>  }
> >>  
> >>  static struct cdev *__devfs_add_partition(struct cdev *cdev,
> >> @@ -449,6 +475,7 @@ static struct cdev *__devfs_add_partition(struct cdev *cdev,
> >>  {
> >>  	loff_t offset, size;
> >>  	static struct cdev *new;
> >> +	struct cdev *overlap;
> >>  
> >>  	if (cdev_by_name(partinfo->name))
> >>  		return ERR_PTR(-EEXIST);
> >> @@ -479,8 +506,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);
> >> +	overlap = check_overlap(cdev, partinfo->name, offset, size);
> >> +	if (overlap)
> >> +		return overlap;
> >>  
> >>  	if (IS_ENABLED(CONFIG_MTD) && cdev->mtd) {
> >>  		struct mtd_info *mtd;
> >> -- 
> >> 2.39.2
> >>
> >>
> >>
> > 
> 
> -- 
> Pengutronix e.K.                           |                             |
> Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
> 31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |
> 
> 



  parent reply	other threads:[~2023-06-01  8:27 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-31 14:59 [PATCH 00/18] state: allow lookup of barebox state partition by Type GUID Ahmad Fatoum
2023-05-31 14:59 ` [PATCH 01/18] common: partitions: decouple from EFI GUID definition Ahmad Fatoum
2023-05-31 14:59 ` [PATCH 02/18] efi: define efi_guid_t as 32-bit aligned guid_t Ahmad Fatoum
2023-05-31 14:59 ` [PATCH 03/18] cdev: fix for_each_cdev macro Ahmad Fatoum
2023-05-31 15:37   ` Marco Felsch
2023-05-31 14:59 ` [PATCH 04/18] of: partition: support of_partition_ensure_probed on parent device Ahmad Fatoum
2023-05-31 16:30   ` Marco Felsch
2023-06-01  4:48     ` Ahmad Fatoum
2023-05-31 14:59 ` [PATCH 05/18] of: of_path: always call of_partition_ensure_probed before resolving Ahmad Fatoum
2023-05-31 16:34   ` Marco Felsch
2023-06-01  7:00   ` Ulrich Ölmann
2023-05-31 14:59 ` [PATCH 06/18] driver: add new cdev_is_partition helper Ahmad Fatoum
2023-05-31 16:36   ` Marco Felsch
2023-05-31 14:59 ` [PATCH 07/18] commands: stat: remove code duplication for type info Ahmad Fatoum
2023-05-31 16:44   ` Marco Felsch
2023-05-31 14:59 ` [PATCH 08/18] cdev: use more descriptive struct cdev::diskuuid/partuuid Ahmad Fatoum
2023-05-31 16:56   ` Marco Felsch
2023-05-31 14:59 ` [PATCH 09/18] cdev: record whether partition is parsed from OF Ahmad Fatoum
2023-05-31 17:04   ` Marco Felsch
2023-06-06 19:31     ` Ahmad Fatoum
2023-06-01  8:03   ` Ulrich Ölmann
2023-05-31 14:59 ` [PATCH 10/18] cdev: have devfs_add_partition return existing identical partition, not NULL Ahmad Fatoum
2023-05-31 17:23   ` Marco Felsch
2023-06-01  4:56     ` Ahmad Fatoum
2023-06-01  7:32       ` Sascha Hauer
2023-06-01  8:26       ` Marco Felsch [this message]
2023-06-01  7:36   ` Sascha Hauer
2023-06-07  8:06     ` Ahmad Fatoum
2023-05-31 14:59 ` [PATCH 11/18] block: parse partition table on block device registration Ahmad Fatoum
2023-05-31 17:25   ` Marco Felsch
2023-06-01  7:42   ` Sascha Hauer
2023-06-01  8:33     ` Marco Felsch
2023-06-06 19:30     ` Ahmad Fatoum
2023-06-01  8:24   ` Ulrich Ölmann
2023-06-01  8:31     ` Ahmad Fatoum
2023-06-01 10:33       ` Ahmad Fatoum
2023-05-31 14:59 ` [PATCH 12/18] common: partitions: record whether disk is GPT or MBR partitioned Ahmad Fatoum
2023-05-31 17:33   ` Marco Felsch
2023-06-01  5:08     ` Ahmad Fatoum
2023-06-01  5:58       ` Ahmad Fatoum
2023-06-01  8:19       ` Marco Felsch
2023-06-01 10:40         ` Ahmad Fatoum
2023-05-31 14:59 ` [PATCH 13/18] block: add cdev_is_block_(device,partition,disk) helpers Ahmad Fatoum
2023-05-31 17:35   ` Marco Felsch
2023-05-31 14:59 ` [PATCH 14/18] of: export new of_cdev_find helper Ahmad Fatoum
2023-05-31 17:41   ` Marco Felsch
2023-06-01  8:41   ` Ulrich Ölmann
2023-05-31 14:59 ` [PATCH 15/18] state: factor device path lookup into helper function Ahmad Fatoum
2023-05-31 17:54   ` Marco Felsch
2023-06-01  5:14     ` Ahmad Fatoum
2023-05-31 14:59 ` [PATCH 16/18] cdev: use cdev::dos_partition_type only if cdev_is_mbr_partitioned Ahmad Fatoum
2023-05-31 18:54   ` Marco Felsch
2023-06-01  5:30     ` Ahmad Fatoum
2023-05-31 14:59 ` [PATCH 17/18] common: partitions: efi: record type UUID in cdev Ahmad Fatoum
     [not found]   ` <20230531193130.fgmvxm27dh3gbvhh@pengutronix.de>
2023-06-06 19:28     ` Ahmad Fatoum
2023-06-07  8:55       ` Marco Felsch
2023-05-31 14:59 ` [PATCH 18/18] state: allow lookup of barebox state partition by Type GUID Ahmad Fatoum
2023-05-31 20:01   ` Marco Felsch
2023-06-01  5:49     ` Ahmad Fatoum
2023-06-01  8:11       ` Marco Felsch
2023-06-01 10:44         ` Ahmad Fatoum
2023-06-01  8:05   ` 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=20230601082627.2q7bush7r4fce5bt@pengutronix.de \
    --to=m.felsch@pengutronix.de \
    --cc=a.fatoum@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