[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