public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Mattijs Korpershoek <mkorpershoek@baylibre.com>
To: Colin McAllister <colinmca242@gmail.com>, u-boot@lists.denx.de
Cc: Colin McAllister <colin.mcallister@garmin.com>,
	JPEWhacker@gmail.com, sjg@chromium.org,
	Sam Protsenko <semen.protsenko@linaro.org>,
	Igor Opaniuk <igor.opaniuk@gmail.com>,
	Colin McAllister <colinmca242@gmail.com>
Subject: Re: [PATCH v4 2/2] android_ab: Fix ANDROID_AB_BACKUP_OFFSET
Date: Tue, 12 Mar 2024 16:19:23 +0100	[thread overview]
Message-ID: <87jzm74gw4.fsf@baylibre.com> (raw)
In-Reply-To: <20240312125729.82695-3-colinmca242@gmail.com>

Hi Colin,

Thank you for the patch.

On mar., mars 12, 2024 at 07:57, Colin McAllister <colinmca242@gmail.com> wrote:

Sam also gave his review here:
https://lore.kernel.org/all/CAPLW+4kHmPtfACyND4Vc2p0ZrsyGY=+bRU=fdub4K1uX5p33Jw@mail.gmail.com/

Please include his review tag in the next submission.

I will add it at the appropriate place below:


> From: Colin McAllister <colin.mcallister@garmin.com>
>
> Currently, setting CONFIG_AB_BACKUP_OFFSET in a target's defconfig will
> not actually enable the #if protected code in android_ab.c. This is
> because "CONFIG_" should have been prepended to the config macro, or the
> macros defined in kconfig.h could have been used.
>
> The code included by ANDROID_AB_BACKUP_OFFSET has been refactored to no
> longer be conditionally compiled by preprocessor conditionals and
> instead use C conditionals. This better aligns with the Linux kernel
> style guide.
>
> Fixes: 3430f24bc6 ("android_ab: Try backup booloader_message")
> Signed-off-by: Colin McAllister <colin.mcallister@garmin.com>
> Cc: Joshua Watt <JPEWhacker@gmail.com>
> Cc: Simon Glass <sjg@chromium.org>
> Signed-off-by: Colin McAllister <colinmca242@gmail.com>
Reviewed-by: Sam Protsenko <semen.protsenko@linaro.org>

> ---
> v2:
>   - Replaced #if conditionals with C if conditionals
>   - Opted to use CONFIG_ANDROID_AB_BACKUP_OFFSET directly instead of
>     macros in kconfig.h as CONFIG_ANDROID_AB_BACKUP_OFFSET is not a
> 	boolean or tristate value and doesn't have different values when
> 	building SPL or TPL.
> v3:
>   - Added "Fixes:" tag
> v4:
>   - No changes
>
>  boot/android_ab.c | 97 ++++++++++++++++++++++-------------------------
>  1 file changed, 45 insertions(+), 52 deletions(-)
>
> diff --git a/boot/android_ab.c b/boot/android_ab.c
> index 9a3d15ec60..f547aa64e4 100644
> --- a/boot/android_ab.c
> +++ b/boot/android_ab.c
> @@ -187,13 +187,12 @@ int ab_select_slot(struct blk_desc *dev_desc, struct disk_partition *part_info,
>  		   bool dec_tries)
>  {
>  	struct bootloader_control *abc = NULL;
> +	struct bootloader_control *backup_abc = NULL;
>  	u32 crc32_le;
>  	int slot, i, ret;
>  	bool store_needed = false;
> +	bool valid_backup = false;
>  	char slot_suffix[4];
> -#if ANDROID_AB_BACKUP_OFFSET
> -	struct bootloader_control *backup_abc = NULL;
> -#endif
>  
>  	ret = ab_control_create_from_disk(dev_desc, part_info, &abc, 0);
>  	if (ret < 0) {
> @@ -205,53 +204,49 @@ int ab_select_slot(struct blk_desc *dev_desc, struct disk_partition *part_info,
>  		return ret;
>  	}
>  
> -#if ANDROID_AB_BACKUP_OFFSET
> -	ret = ab_control_create_from_disk(dev_desc, part_info, &backup_abc,
> -					  ANDROID_AB_BACKUP_OFFSET);
> -	if (ret < 0) {
> -		free(abc);
> -		return ret;
> +	if (CONFIG_ANDROID_AB_BACKUP_OFFSET) {
> +		ret = ab_control_create_from_disk(dev_desc, part_info, &backup_abc,
> +						  CONFIG_ANDROID_AB_BACKUP_OFFSET);
> +		if (ret < 0) {
> +			free(abc);
> +			return ret;
> +		}
>  	}
> -#endif
>  
>  	crc32_le = ab_control_compute_crc(abc);
>  	if (abc->crc32_le != crc32_le) {
>  		log_err("ANDROID: Invalid CRC-32 (expected %.8x, found %.8x),",
>  			crc32_le, abc->crc32_le);
> -#if ANDROID_AB_BACKUP_OFFSET
> -		crc32_le = ab_control_compute_crc(backup_abc);
> -		if (backup_abc->crc32_le != crc32_le) {
> -			log_err("ANDROID: Invalid backup CRC-32 ");
> -			log_err("expected %.8x, found %.8x),",
> -				crc32_le, backup_abc->crc32_le);
> -#endif
> -
> -			log_err("re-initializing A/B metadata.\n");
> +		if (CONFIG_ANDROID_AB_BACKUP_OFFSET) {
> +			crc32_le = ab_control_compute_crc(backup_abc);
> +			if (backup_abc->crc32_le != crc32_le) {
> +				log_err(" ANDROID: Invalid backup CRC-32 ");
> +				log_err("(expected %.8x, found %.8x),",
> +					crc32_le, backup_abc->crc32_le);
> +			} else {
> +				valid_backup = true;
> +				log_info(" copying A/B metadata from backup.\n");
> +				memcpy(abc, backup_abc, sizeof(*abc));
> +			}
> +		}
>  
> +		if (!valid_backup) {
> +			log_err(" re-initializing A/B metadata.\n");
>  			ret = ab_control_default(abc);
>  			if (ret < 0) {
> -#if ANDROID_AB_BACKUP_OFFSET
> -				free(backup_abc);
> -#endif
> +				if (CONFIG_ANDROID_AB_BACKUP_OFFSET)
> +					free(backup_abc);
>  				free(abc);
>  				return -ENODATA;
>  			}
> -#if ANDROID_AB_BACKUP_OFFSET
> -		} else {
> -			/*
> -			 * Backup is valid. Copy it to the primary
> -			 */
> -			memcpy(abc, backup_abc, sizeof(*abc));
>  		}
> -#endif
>  		store_needed = true;
>  	}
>  
>  	if (abc->magic != BOOT_CTRL_MAGIC) {
>  		log_err("ANDROID: Unknown A/B metadata: %.8x\n", abc->magic);
> -#if ANDROID_AB_BACKUP_OFFSET
> -		free(backup_abc);
> -#endif
> +		if (CONFIG_ANDROID_AB_BACKUP_OFFSET)
> +			free(backup_abc);
>  		free(abc);
>  		return -ENODATA;
>  	}
> @@ -259,9 +254,8 @@ int ab_select_slot(struct blk_desc *dev_desc, struct disk_partition *part_info,
>  	if (abc->version > BOOT_CTRL_VERSION) {
>  		log_err("ANDROID: Unsupported A/B metadata version: %.8x\n",
>  			abc->version);
> -#if ANDROID_AB_BACKUP_OFFSET
> -		free(backup_abc);
> -#endif
> +		if (CONFIG_ANDROID_AB_BACKUP_OFFSET)
> +			free(backup_abc);
>  		free(abc);
>  		return -ENODATA;
>  	}
> @@ -338,30 +332,29 @@ int ab_select_slot(struct blk_desc *dev_desc, struct disk_partition *part_info,
>  		abc->crc32_le = ab_control_compute_crc(abc);
>  		ret = ab_control_store(dev_desc, part_info, abc, 0);
>  		if (ret < 0) {
> -#if ANDROID_AB_BACKUP_OFFSET
> -			free(backup_abc);
> -#endif
> +			if (CONFIG_ANDROID_AB_BACKUP_OFFSET)
> +				free(backup_abc);
>  			free(abc);
>  			return ret;
>  		}
>  	}
>  
> -#if ANDROID_AB_BACKUP_OFFSET
> -	/*
> -	 * If the backup doesn't match the primary, write the primary
> -	 * to the backup offset
> -	 */
> -	if (memcmp(backup_abc, abc, sizeof(*abc)) != 0) {
> -		ret = ab_control_store(dev_desc, part_info, abc,
> -				       ANDROID_AB_BACKUP_OFFSET);
> -		if (ret < 0) {
> -			free(backup_abc);
> -			free(abc);
> -			return ret;
> +	if (CONFIG_ANDROID_AB_BACKUP_OFFSET) {
> +		/*
> +		* If the backup doesn't match the primary, write the primary
> +		* to the backup offset
> +		*/

checkpatch.pl seems to complain about this comment block:

WARNING: Block comments should align the * on each line
#166: FILE: boot/android_ab.c:344:
+               /*
+               * If the backup doesn't match the primary, write the primary

To reproduce, run:

$ ./scripts/checkpatch.pl --strict --u-boot --git HEAD^..HEAD

With the above addressed, please send a v5 including:

Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>

> +		if (memcmp(backup_abc, abc, sizeof(*abc)) != 0) {
> +			ret = ab_control_store(dev_desc, part_info, abc,
> +					       CONFIG_ANDROID_AB_BACKUP_OFFSET);
> +			if (ret < 0) {
> +				free(backup_abc);
> +				free(abc);
> +				return ret;
> +			}
>  		}
> +		free(backup_abc);
>  	}
> -	free(backup_abc);
> -#endif
>  
>  	free(abc);
>  
> -- 
> 2.34.1

  reply	other threads:[~2024-03-12 15:19 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-12 12:57 [PATCH v4 0/2] Fix Android A/B backup Colin McAllister
2024-03-12 12:57 ` [PATCH v4 1/2] android_ab: Add missing semicolon Colin McAllister
2024-03-12 15:12   ` Mattijs Korpershoek
2024-03-13 17:18   ` Igor Opaniuk
2024-03-12 12:57 ` [PATCH v4 2/2] android_ab: Fix ANDROID_AB_BACKUP_OFFSET Colin McAllister
2024-03-12 15:19   ` Mattijs Korpershoek [this message]
2024-03-13 17:22     ` Igor Opaniuk
2024-03-21  9:29       ` Mattijs Korpershoek
2024-03-21 12:19         ` Colin
2024-03-22  7:41 ` [PATCH v4 0/2] Fix Android A/B backup Mattijs Korpershoek

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=87jzm74gw4.fsf@baylibre.com \
    --to=mkorpershoek@baylibre.com \
    --cc=JPEWhacker@gmail.com \
    --cc=colin.mcallister@garmin.com \
    --cc=colinmca242@gmail.com \
    --cc=igor.opaniuk@gmail.com \
    --cc=semen.protsenko@linaro.org \
    --cc=sjg@chromium.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox