All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Lothar Waßmann" <LW@KARO-electronics.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 4/5] rename GPT partitions to detect boot failure
Date: Tue, 6 Jun 2017 10:20:41 +0200	[thread overview]
Message-ID: <20170606102041.3d7d98af@karo-electronics.de> (raw)
In-Reply-To: <1496456554-6816-5-git-send-email-alison@peloton-tech.com>

Hi,

On Fri,  2 Jun 2017 19:22:33 -0700 alison at peloton-tech.com wrote:
> From: Alison Chaiken <alison@peloton-tech.com>
> 
> This patch provides support in u-boot for renaming GPT
> partitions.  The renaming is accomplished via a new 'gpt flip'
> command.
> 
> The concept for the bootloader state machine is the following:
> 
> -- u-boot renames ‘primary’ partitions as ‘candidate’ and tries
>    to boot them.
> -- Linux, at boot, will rename ‘candidate’ partitions as
>    ‘primary’.
> -- If u-boot sees a ‘candidate’ partition after a boot attempt,
>    it tries to boot the ‘backup’ partition.
> 
> Rewriting the partition table has the side-effect that all partitions
> end up with "msftdata" flag set.  The reason is that partition type
> PARTITION_BASIC_DATA_GUID is hard-coded in the gpt_fill_pte()
> function.  This does not appear to cause any harm.
> 
> Signed-off-by: Alison Chaiken <alison@peloton-tech.com>
> ---
>  cmd/Kconfig    |   7 ++
>  cmd/gpt.c      | 199 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  doc/README.gpt |  13 ++++
>  3 files changed, 215 insertions(+), 4 deletions(-)
> 
> diff --git a/cmd/Kconfig b/cmd/Kconfig
> index 6f75b86..8b925e5 100644
> --- a/cmd/Kconfig
> +++ b/cmd/Kconfig
> @@ -593,6 +593,13 @@ config CMD_GPT
>  	  Enable the 'gpt' command to ready and write GPT style partition
>  	  tables.
>  
> +config CMD_GPT_FLIP
> +	bool "GPT flip-partitions command"
> +	depends on CMD_GPT
> +	help
> +	  Enables the 'gpt' command to write modified GPT partition
> +	  tables via the 'gpt flip' command.
> +
>  config CMD_ARMFLASH
>  	#depends on FLASH_CFI_DRIVER
>  	bool "armflash"
> diff --git a/cmd/gpt.c b/cmd/gpt.c
> index 5c2651f..f6968de 100644
> --- a/cmd/gpt.c
> +++ b/cmd/gpt.c
> @@ -20,6 +20,7 @@
>  #include <div64.h>
>  #include <memalign.h>
>  #include <linux/compat.h>
> +#include <linux/sizes.h>
>  
>  static LIST_HEAD(disk_partitions);
>  
> @@ -190,16 +191,33 @@ static struct disk_part *allocate_disk_part(disk_partition_t *info, int partnum)
>  	return newpart;
>  }
>  
> +static void prettyprint_part_size(char *sizestr, unsigned long partsize,
> +				  unsigned long blksize)
> +{
> +	unsigned long long partbytes;
> +	unsigned long partmegabytes;
> +
> +	partbytes = partsize * blksize;
> +	partmegabytes = lldiv(partbytes, SZ_1M);
> +	snprintf(sizestr, 16, "%luMiB", partmegabytes);
> +}
> +
>  static void print_gpt_info(void)
>  {
>  	struct list_head *pos;
>  	struct disk_part *curr;
> +	char partstartstr[16];
> +	char partsizestr[16];
>  
>  	list_for_each(pos, &disk_partitions) {
>  		curr = list_entry(pos, struct disk_part, list);
> +		prettyprint_part_size(partstartstr, (unsigned long)curr->gpt_part_info.start,
> +				      (unsigned long) curr->gpt_part_info.blksz);
> +		prettyprint_part_size(partsizestr, (unsigned long)curr->gpt_part_info.size,
> +				      (unsigned long) curr->gpt_part_info.blksz);
> +
>  		printf("Partition %d:\n", curr->partnum);
> -		printf("1st block %x, size %x\n", (unsigned)curr->gpt_part_info.start,
> -		       (unsigned)curr->gpt_part_info.size);
> +		printf("Start %s, size %s\n", partstartstr, partsizestr);
>  		printf("Block size %lu, name %s\n", curr->gpt_part_info.blksz,
>  		       curr->gpt_part_info.name);
>  		printf("Type %s, bootable %d\n", curr->gpt_part_info.type,
> @@ -211,6 +229,85 @@ static void print_gpt_info(void)
>  	}
>  }
>  
> +#ifdef CONFIG_CMD_GPT_FLIP
> +static int calc_parts_list_len(int numparts)
> +{
> +	/*
> +	 * prefatory string:
> +	 * doc/README.GPT, suggests that
> +	 * int partlistlen = UUID_STR_LEN + 1 + strlen("partitions=uuid_disk=");
> +	 * is correct, but extract_val() expects "uuid_disk" first.
> +	 */
> +	int partlistlen = UUID_STR_LEN + 1 + strlen("uuid_disk=");
> +	/* for the comma */
> +	partlistlen++;
> +
> +	/* per-partition additions; numparts starts at 1, so this should be correct */
> +	partlistlen += numparts * (strlen("name=,") + PART_NAME_LEN + 1);
> +	/* 17 because partstr in create_gpt_partitions_list() is 16 chars */
>
NO! The size of partstr in create_gpt_partitions_list() is:
|	char partstr[PART_NAME_LEN + 1];
which happens to be defined as:
--- a/include/part.h
+++ b/include/part.h
@@ -49,6 +49,7 @@ struct block_drvr {
 
 #define PART_NAME_LEN 32
                       ^^
 #define PART_TYPE_LEN 32

> +	partlistlen += numparts * (strlen("start=MiB,") + 17);
> +	partlistlen += numparts * (strlen("size=MiB,") + 17);
>
Never use magic numbers in code, but use appropriate #define's!

> @@ -523,6 +625,86 @@ static int do_disk_guid(struct blk_desc *dev_desc, char * const namestr)
>  	return ret;
>  }
>  
> +#ifdef CONFIG_CMD_GPT_FLIP
> +static int do_flip_gpt_parts(struct blk_desc *dev_desc)
> +{
> +	struct list_head *pos;
> +	struct disk_part *curr;
> +	disk_partition_t *new_partitions = NULL;
> +	char disk_guid[UUID_STR_LEN + 1];
> +	char *partitions_list, *str_disk_guid;
> +	u8 part_count = 0;
> +	int partlistlen, ret, numparts = 0;
> +
> +	ret = get_disk_guid(dev_desc, disk_guid);
> +	if (ret < 0)
> +		return ret;
AGAIN: You are passing the return value of this function back to the
caller of the CMD handler do_gpt() which expects a return value of
CMD_RET_FAILURE or CMD_RET_SUCCESS, not an arbitrary negative value.

> +
> +	numparts = get_gpt_info(dev_desc);
> +	if (numparts <  0)
> +		return numparts;
> +	printf("Current partition table with %d partitions is:\n", numparts);
> +	print_gpt_info();
> +
> +	partlistlen = calc_parts_list_len(numparts);
> +	partitions_list = (char *)malloc(partlistlen);
> +	memset(partitions_list, '\0', partlistlen);
> +
> +	ret = create_gpt_partitions_list(numparts, (const char *) disk_guid,
> +					 partitions_list);
> +	if (ret < 0)
> +		return ret;
> +	debug("OLD partitions_list is %s with %d chars\n", partitions_list, strlen(partitions_list));
> +
> +	ret = set_gpt_info(dev_desc, (const char *)partitions_list, &str_disk_guid,
> +			   &new_partitions, &part_count);
> +	if (ret < 0)
> +		return ret;
> +
> +	list_for_each(pos, &disk_partitions) {
> +		curr = list_entry(pos, struct disk_part, list);
> +		if (!strcmp((char *)curr->gpt_part_info.name, "backup_kernel"))
> +			strcpy((char *)curr->gpt_part_info.name, "candidate_kernel");
> +		if (!strcmp((char *)curr->gpt_part_info.name, "primary_kernel"))
> +			strcpy((char *)curr->gpt_part_info.name, "backup_kernel");
> +		if (!strcmp((char *)curr->gpt_part_info.name, "backup_rootfs"))
> +			strcpy((char *)curr->gpt_part_info.name, "candidate_rootfs");
> +		if (!strcmp((char *)curr->gpt_part_info.name, "primary_rootfs"))
> +			strcpy((char *)curr->gpt_part_info.name, "backup_rootfs");
> +	}
> +
> +	ret = create_gpt_partitions_list(numparts, (const char *) disk_guid, partitions_list);
> +	if (ret < 0)
> +		return ret;
> +	debug("NEW partitions_list is %s with %d chars\n", partitions_list, strlen(partitions_list));
> +
> +	ret = set_gpt_info(dev_desc, (const char *)partitions_list, &str_disk_guid,
> +			   &new_partitions, &part_count);
> +	if (ret < 0)
> +		return ret;
> +
> +	debug("Writing new partition table\n");
> +	ret = gpt_restore(dev_desc, disk_guid, new_partitions, numparts);
> +	if (ret < 0) {
> +		printf("Writing new partition table failed\n");
> +		return ret;
> +	}
> +
> +	debug("Reading back new partition table\n");
> +	numparts = get_gpt_info(dev_desc);
> +	if (numparts <  0)
> +		return numparts;
> +	printf("new partition table with %d partitions is:\n", numparts);
> +	print_gpt_info();
> +
> +	del_gpt_info();
> +	free(partitions_list);
> +	free(str_disk_guid);
> +	free(new_partitions);
> +	return ret;
> +}
> +#endif
> +
>  /**
>   * do_gpt(): Perform GPT operations
>   *
> @@ -565,6 +747,10 @@ static int do_gpt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>  		return do_disk_guid(blk_dev_desc, argv[4]);
>  	} else if (strcmp(argv[1], "read") == 0) {
>  		return do_get_gpt_info(blk_dev_desc);
> +#ifdef CONFIG_CMD_GPT_FLIP
> +	} else if (strcmp(argv[1], "flip") == 0) {
> +		return do_flip_gpt_parts(blk_dev_desc);
> +#endif
>
See my comment to your patch 1/5.


Lothar Waßmann

  reply	other threads:[~2017-06-06  8:20 UTC|newest]

Thread overview: 116+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-21  2:27 [U-Boot] [PATCH 0/3] add support for GPT partition name manipulation alison at peloton-tech.com
2017-05-21  2:27 ` [U-Boot] [PATCH 1/3] GPT: add accessor function for disk GUID alison at peloton-tech.com
2017-05-26 12:38   ` Tom Rini
2017-05-21  2:27 ` [U-Boot] [PATCH 2/3] GPT: read partition table from device into a data structure alison at peloton-tech.com
2017-05-26 12:39   ` Tom Rini
2017-05-21  2:27 ` [U-Boot] [PATCH 3/3] rename GPT partitions to detect boot failure alison at peloton-tech.com
2017-05-26 12:39   ` Tom Rini
2017-05-29  9:25   ` Lothar Waßmann
2017-05-26 12:38 ` [U-Boot] [PATCH 0/3] add support for GPT partition name manipulation Tom Rini
2017-05-29 16:49   ` [U-Boot] [PATCH v2 0/6] " alison at peloton-tech.com
2017-05-29 16:49     ` [U-Boot] [PATCH v2 1/6] EFI: replace number with UUID_STR_LEN macro alison at peloton-tech.com
2017-05-31  2:07       ` Tom Rini
2017-05-31  7:37       ` Lukasz Majewski
2017-05-29 16:49     ` [U-Boot] [PATCH v2 2/6] disk_partition: introduce macros for description string lengths alison at peloton-tech.com
2017-05-31  7:37       ` Lukasz Majewski
2017-05-31 13:50       ` Tom Rini
2017-05-29 16:49     ` [U-Boot] [PATCH v2 3/6] GPT: add accessor function for disk GUID alison at peloton-tech.com
2017-05-30  6:46       ` Lothar Waßmann
2017-06-03  2:22         ` [U-Boot] [PATCH v3 0/5] add support for GPT partition name manipulation alison at peloton-tech.com
2017-06-03  2:22           ` [U-Boot] [PATCH v3 1/5] GPT: add accessor function for disk GUID alison at peloton-tech.com
2017-06-06  8:20             ` Lothar Waßmann
2017-06-10  5:27               ` [U-Boot] [PATCH v5 1/3] " alison at peloton-tech.com
2017-06-11 13:38                 ` Tom Rini
2017-06-03  2:22           ` [U-Boot] [PATCH v3 2/5] partitions: increase MAX_SEARCH_PARTITIONS and move to part.h alison at peloton-tech.com
2017-06-03 11:52             ` Lukasz Majewski
2017-06-03  2:22           ` [U-Boot] [PATCH v3 3/5] GPT: read partition table from device into a data structure alison at peloton-tech.com
2017-06-06  8:28             ` Lothar Waßmann
2017-06-10  5:30               ` [U-Boot] [PATCH v5 2/3] " alison at peloton-tech.com
2017-06-11 13:38                 ` Tom Rini
2017-06-06 10:43             ` [U-Boot] [PATCH v3 3/5] " Lothar Waßmann
2017-06-03  2:22           ` [U-Boot] [PATCH v3 4/5] rename GPT partitions to detect boot failure alison at peloton-tech.com
2017-06-06  8:20             ` Lothar Waßmann [this message]
2017-06-10  5:35               ` [U-Boot] [PATCH v5 3/3] " alison at peloton-tech.com
2017-06-10  6:51                 ` Wolfgang Denk
2017-06-10 23:27                   ` Alison Chaiken
2017-06-10 23:33                   ` [U-Boot] [PATCH v6 3/3] GPT: provide commands to selectively rename partitions alison at peloton-tech.com
2017-06-11 13:38                     ` Tom Rini
2017-06-11 16:03                       ` [U-Boot] [PATCH v7] " alison at peloton-tech.com
2017-06-12  7:45                     ` [U-Boot] [PATCH v6 3/3] " Wolfgang Denk
2017-06-12 14:24                       ` Alison Chaiken
2017-06-12 14:56                         ` Tom Rini
2017-06-18 11:08                           ` Wolfgang Denk
2017-06-25 23:43                             ` [U-Boot] [PATCH v7 0/9] add support for GPT partition name manipulation alison at peloton-tech.com
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 1/9] EFI: replace number with UUID_STR_LEN macro alison at peloton-tech.com
2017-08-07 13:54                                 ` [U-Boot] [U-Boot, v7, " Tom Rini
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 2/9] disk_partition: introduce macros for description string lengths alison at peloton-tech.com
2017-08-07 13:54                                 ` [U-Boot] [U-Boot, v7, " Tom Rini
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 3/9] GPT: fix error in partitions string doc alison at peloton-tech.com
2017-08-07 13:54                                 ` [U-Boot] [U-Boot, v7, " Tom Rini
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 4/9] sandbox: README: fix partition command invocation alison at peloton-tech.com
2017-08-07 13:54                                 ` [U-Boot] [U-Boot, v7, " Tom Rini
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 5/9] cmd gpt: test in sandbox alison at peloton-tech.com
2017-08-07 13:54                                 ` [U-Boot] [U-Boot,v7,5/9] " Tom Rini
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 6/9] partitions: increase MAX_SEARCH_PARTITIONS and move to part.h alison at peloton-tech.com
2017-08-07 13:54                                 ` [U-Boot] [U-Boot, v7, " Tom Rini
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 7/9] GPT: add accessor function for disk GUID alison at peloton-tech.com
2017-08-07 13:55                                 ` [U-Boot] [U-Boot, v7, " Tom Rini
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 8/9] GPT: read partition table from device into a data structure alison at peloton-tech.com
2017-06-26  7:34                                 ` Lothar Waßmann
2017-07-01 22:42                                   ` [U-Boot] [PATCH v8 8/10] " alison at peloton-tech.com
2017-07-03  6:52                                     ` Lothar Waßmann
2017-07-04 18:18                                       ` [U-Boot] [PATCH v8 08/10] " alison at peloton-tech.com
2017-08-07 13:55                                         ` [U-Boot] [U-Boot, v8, " Tom Rini
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 9/9] GPT: provide commands to selectively rename partitions alison at peloton-tech.com
2017-06-26  1:52                                 ` Bin Meng
2017-06-26  2:11                                   ` alison at peloton-tech.com
2017-06-26  7:55                                 ` Lothar Waßmann
2017-07-01 22:44                                   ` [U-Boot] [PATCH 09/10] " alison at peloton-tech.com
2017-06-18 11:03                         ` [U-Boot] [PATCH v6 3/3] " Wolfgang Denk
2017-06-25 21:54                           ` Alison Chaiken
2017-06-26 22:47                             ` Tom Rini
2017-06-27  7:05                             ` Lothar Waßmann
2017-06-27  9:12                               ` Lothar Waßmann
2017-07-01 22:44                                 ` [U-Boot] [PATCH 10/10] gpt: harden set_gpt_info() against non NULL-terminated strings alison at peloton-tech.com
2017-07-03  6:37                                   ` Lothar Waßmann
2017-07-04 18:19                                     ` [U-Boot] [PATCH v2 " alison at peloton-tech.com
2017-08-07 13:55                                       ` [U-Boot] [U-Boot, v2, " Tom Rini
2017-07-01 22:36                               ` [U-Boot] [PATCH v6 3/3] GPT: provide commands to selectively rename partitions Alison Chaiken
2017-07-03  6:40                                 ` Lothar Waßmann
2017-07-04 18:19                                   ` [U-Boot] [PATCH v8 09/10] " alison at peloton-tech.com
2017-08-07 13:55                                     ` [U-Boot] [U-Boot, v8, " Tom Rini
2017-06-03  2:22           ` [U-Boot] [PATCH v3 5/5] GPT: fix error in partitions string doc alison at peloton-tech.com
2017-06-03 11:48           ` [U-Boot] [PATCH v3 0/5] add support for GPT partition name manipulation Lukasz Majewski
2017-05-31  7:44       ` [U-Boot] [PATCH v2 3/6] GPT: add accessor function for disk GUID Lukasz Majewski
2017-05-31  8:47         ` Lothar Waßmann
2017-05-29 16:49     ` [U-Boot] [PATCH v2 4/6] GPT: read partition table from device into a data structure alison at peloton-tech.com
2017-05-30  7:37       ` Lothar Waßmann
2017-06-01  6:34         ` Chaiken, Alison
2017-06-01  9:48           ` Lothar Waßmann
2017-05-31  7:48       ` Lukasz Majewski
2017-05-31  8:48         ` Lothar Waßmann
2017-05-31 11:11           ` Lukasz Majewski
2017-05-31 13:42             ` Lothar Waßmann
2017-05-31 14:07         ` Lukasz Majewski
2017-05-29 16:49     ` [U-Boot] [PATCH v2 5/6] rename GPT partitions to detect boot failure alison at peloton-tech.com
2017-05-30  7:38       ` Lothar Waßmann
2017-05-31  8:12       ` Lukasz Majewski
2017-06-01  7:04         ` Chaiken, Alison
2017-06-01  8:21           ` Lukasz Majewski
2017-06-01 15:06             ` Chaiken, Alison
2017-06-01 18:20               ` Lukasz Majewski
2017-06-04 22:11         ` [U-Boot] [PATCH v4 0/5] add support for GPT partition name manipulation alison at peloton-tech.com
2017-06-04 22:11           ` [U-Boot] [PATCH v4 1/5] GPT: read partition table from device into a data structure alison at peloton-tech.com
2017-06-04 22:11           ` [U-Boot] [PATCH v4 2/5] rename GPT partitions to detect boot failure alison at peloton-tech.com
2017-06-04 22:11           ` [U-Boot] [PATCH v4 3/5] GPT: fix error in partitions string doc alison at peloton-tech.com
2017-06-04 22:11           ` [U-Boot] [PATCH 4/5] sandbox: README: fix partition command invocation alison at peloton-tech.com
2017-06-09 12:28             ` Simon Glass
2017-06-15 19:21               ` sjg at google.com
2017-06-04 22:11           ` [U-Boot] [PATCH 5/5] cmd gpt: test in sandbox alison at peloton-tech.com
2017-06-15 19:21             ` sjg at google.com
2017-08-27 23:02         ` [U-Boot] [PATCH v2 5/6] rename GPT partitions to detect boot failure Chaiken, Alison
2017-08-28  7:54           ` Łukasz Majewski
2017-08-28 11:16             ` Tom Rini
2017-05-29 16:49     ` [U-Boot] [PATCH v2 6/6] GPT: fix error in partitions string doc alison at peloton-tech.com
2017-05-31  8:14       ` Lukasz Majewski
2017-05-31 11:21         ` Lukasz Majewski

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=20170606102041.3d7d98af@karo-electronics.de \
    --to=lw@karo-electronics.de \
    --cc=u-boot@lists.denx.de \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.