[Skiboot] [PATCH] external/gard: Fix displaying 'cleared' gard records
Sam Mendoza-Jonas
sam at mendozajonas.com
Thu Jan 7 14:52:00 AEDT 2016
Reviewed-by: Sam Mendoza-Jonas <sam at mendozajonas.com>
On Thu, Jan 07, 2016 at 02:33:59PM +1100, Cyril Bur wrote:
> When a garded component is replaced hostboot detects this and updates the
> gard partition.
>
> What hostboot does is set the record_id field to 0xFFFFFFFF but leaves the
> rest of the flash untouched, this has caused issues with the gard tool the
> thinking was that an entire record of all 0xFF bytes would signal not a
> valid record.
>
> This patch add rectifies this issue and `gard list` will no longer show any
> record with an id of 0xFFFFFFFF.
>
> Signed-off-by: Cyril Bur <cyril.bur at au1.ibm.com>
> ---
> Stewart: Fixes BZ 131707
>
> external/gard/gard.c | 36 +++++++++++++++++++++++++++++++++---
> 1 file changed, 33 insertions(+), 3 deletions(-)
>
> diff --git a/external/gard/gard.c b/external/gard/gard.c
> index 0b7a68b..53f31d9 100644
> --- a/external/gard/gard.c
> +++ b/external/gard/gard.c
> @@ -41,6 +41,8 @@
>
> #include "gard.h"
>
> +#define CLEARED_RECORD_ID 0xFFFFFFFF
> +
> #define FDT_ACTIVE_FLASH_PATH "/proc/device-tree/chosen/ibm,system-flash"
> #define SYSFS_MTD_PATH "/sys/class/mtd/"
> #define FLASH_GARD_PART "GUARD"
> @@ -226,6 +228,11 @@ static const char *path_type_to_str(enum path_type t)
> return "Unknown";
> }
>
> +static bool is_valid_id(uint32_t record_id)
> +{
> + return record_id != CLEARED_RECORD_ID;
> +}
> +
> static int do_iterate(struct gard_ctx *ctx,
> int (*func)(struct gard_ctx *ctx, int pos,
> struct gard_record *gard, void *priv),
> @@ -272,13 +279,36 @@ static int get_largest_pos(struct gard_ctx *ctx)
> return largest;
> }
>
> +static int count_valid_records_i(struct gard_ctx *ctx, int pos, struct gard_record *gard, void *priv)
> +{
> + if (!gard || !priv)
> + return -1;
> +
> + if (is_valid_id(be32toh(gard->record_id)))
> + (*(int *)priv)++;
> +
> + return 0;
> +}
> +
> +static int count_valid_records(struct gard_ctx *ctx)
> +{
> + int rc, count = 0;
> +
> + rc = do_iterate(ctx, &count_valid_records_i, &count);
> + if (rc)
> + return 0;
> +
> + return count;
> +}
> +
> static int do_list_i(struct gard_ctx *ctx, int pos, struct gard_record *gard, void *priv)
> {
> if (!gard)
> return -1;
>
> - printf("| %08x | %08x | %-15s |\n", be32toh(gard->record_id),
> - be32toh(gard->errlog_eid), path_type_to_str(gard->target_id.type_size >> PATH_TYPE_SHIFT));
> + if (is_valid_id(be32toh(gard->record_id)))
> + printf("| %08x | %08x | %-15s |\n", be32toh(gard->record_id), be32toh(gard->errlog_eid),
> + path_type_to_str(gard->target_id.type_size >> PATH_TYPE_SHIFT));
>
> return 0;
> }
> @@ -288,7 +318,7 @@ static int do_list(struct gard_ctx *ctx, int argc, char **argv)
> int rc;
>
> /* No entries */
> - if (get_largest_pos(ctx) == -1) {
> + if (count_valid_records(ctx) == 0) {
> printf("No GARD entries to display\n");
> rc = 0;
> } else {
> --
> 2.6.4
>
> _______________________________________________
> Skiboot mailing list
> Skiboot at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/skiboot
More information about the Skiboot
mailing list