spl: ab: support decreasing 1 in spl

Signed-off-by: Jason Zhu <jason.zhu@rock-chips.com>
Change-Id: Ie3bad33476e25bbcbf9d845abc87c6e075671e0c
This commit is contained in:
Jason Zhu 2021-01-04 15:35:51 +08:00
parent 153f99a6bf
commit 093f4d990f
2 changed files with 55 additions and 0 deletions

View File

@ -273,3 +273,49 @@ int spl_ab_append_part_slot(struct blk_desc *dev_desc,
return 0; return 0;
} }
static int spl_save_metadata_if_changed(struct blk_desc *dev_desc,
AvbABData *ab_data,
AvbABData *ab_data_orig)
{
if (safe_memcmp(ab_data, ab_data_orig, sizeof(AvbABData)))
return spl_ab_data_write(dev_desc, ab_data, "misc");
return 0;
}
/* If verify fail in a/b system, then decrease 1. */
int spl_ab_decrease_tries(struct blk_desc *dev_desc)
{
AvbABData ab_data, ab_data_orig;
size_t slot_index = 0;
char slot_suffix[3] = {0};
int ret = -1;
ret = spl_get_current_slot(dev_desc, "misc", slot_suffix);
if (ret)
goto out;
if (!strncmp(slot_suffix, "_a", 2))
slot_index = 0;
else if (!strncmp(slot_suffix, "_b", 2))
slot_index = 1;
else
slot_index = 0;
ret = spl_ab_data_read(dev_desc, &ab_data, "misc");
if (ret)
goto out;
memcpy(&ab_data_orig, &ab_data, sizeof(AvbABData));
/* ... and decrement tries remaining, if applicable. */
if (!ab_data.slots[slot_index].successful_boot &&
ab_data.slots[slot_index].tries_remaining > 0)
ab_data.slots[slot_index].tries_remaining -= 1;
ret = spl_save_metadata_if_changed(dev_desc, &ab_data, &ab_data_orig);
out:
return ret;
}

View File

@ -36,4 +36,13 @@ int spl_ab_append_part_slot(struct blk_desc *dev_desc,
const char *part_name, const char *part_name,
char *new_name); char *new_name);
/*
* spl_ab_decrease_tries
*
* @dev_desc: block description
*
* return: 0 success, others fail.
*/
int spl_ab_decrease_tries(struct blk_desc *dev_desc);
#endif #endif