[Cluster-devel] [gfs2_edit PATCH] gfs2_edit: Add destroy_all_meta for fsck testing

Andrew Price anprice at redhat.com
Wed Jun 8 10:55:11 UTC 2016


Hi Bob,

On 06/06/16 16:32, Bob Peterson wrote:
> Hi,
>
> This patch adds a new option to gfs2_edit that destroys all the
> metadata in a file system. Its sole purpose is for fsck testing
> where multiple sets of metadata are restored to the same device,
> to prevent accidental bleed-through from one to the next.
> I deliberately left it off the tool "usage" so people aren't
> tempted to try to misuse it (but that's open to negotiation).

So my first reaction to this was uneasiness as it's adding a fairly 
destructive subcommand, and it's implemented amongst code which needs to 
avoid being destructive. I can see how it would be useful for testing 
though, and it's no more destructive than some existing gfs2_edit 
features, so I'm not going to nix it.

That said, to reduce the possibility of future confusion/bugs I'd like 
to see the possible values of saveoption #defined as 
SAVEOPT_{DESTROY,SAVE,RGRPS,SLOW} or similar.

Longer term, I'd also like gfs2_edit to only open the device O_RDWR if 
it absolutely needs to and O_RDONLY otherwise.

(Tentative ACK)

Thanks,
Andy

>
> Regards,
>
> Bob Peterson
> Red Hat File Systems
> ---
> Signed-off-by: Bob Peterson <rpeterso at redhat.com>
>
> diff --git a/gfs2/edit/hexedit.c b/gfs2/edit/hexedit.c
> index 40a719e..adc6071 100644
> --- a/gfs2/edit/hexedit.c
> +++ b/gfs2/edit/hexedit.c
> @@ -2291,6 +2291,8 @@ static void parameterpass1(int argc, char *argv[], int i)
>  		details = 1;
>  	else if (!strcasecmp(argv[i], "savemeta"))
>  		termlines = 0;
> +	else if (!strcasecmp(argv[i], "destroy_all_meta"))
> +		termlines = 0;
>  	else if (!strcasecmp(argv[i], "savemetaslow"))
>  		termlines = 0;
>  	else if (!strcasecmp(argv[i], "savergs"))
> @@ -2486,6 +2488,8 @@ static void process_parameters(int argc, char *argv[], int pass)
>  		else if (!strcasecmp(argv[i], "savemeta")) {
>  			getgziplevel(argv, &i);
>  			savemeta(argv[i+2], 0, gziplevel);
> +		} else if (!strcasecmp(argv[i], "destroy_all_meta")) {
> +			savemeta(argv[i+1], -1, gziplevel);
>  		} else if (!strcasecmp(argv[i], "savemetaslow")) {
>  			getgziplevel(argv, &i);
>  			savemeta(argv[i+2], 1, gziplevel);
> diff --git a/gfs2/edit/savemeta.c b/gfs2/edit/savemeta.c
> index db9a947..0b60ba6 100644
> --- a/gfs2/edit/savemeta.c
> +++ b/gfs2/edit/savemeta.c
> @@ -61,6 +61,7 @@ static uint64_t blks_saved;
>  static uint64_t journal_blocks[MAX_JOURNALS_SAVED];
>  static uint64_t gfs1_journal_size = 0; /* in blocks */
>  static int journals_found = 0;
> +static int destroy_all_meta = 0;
>  int print_level = MSG_NOTICE;
>  extern char *device;
>
> @@ -432,6 +433,11 @@ static int save_block(int fd, struct metafd *mfd, uint64_t blk, uint64_t owner)
>  		return 0; /* Not metadata, and not system file, so skip it */
>  	}
>
> +	if (destroy_all_meta) {
> +		memset(savebh->b_data, 0, blklen);
> +		bmodified(savebh);
> +		goto out;
> +	}
>  	/* No need to save trailing zeroes */
>  	for (; blklen > 0 && savebh->b_data[blklen - 1] == '\0'; blklen--);
>
> @@ -459,6 +465,7 @@ static int save_block(int fd, struct metafd *mfd, uint64_t blk, uint64_t owner)
>
>  	blks_saved++;
>  	free(savedata);
> +out:
>  	brelse(savebh);
>  	return blktype;
>  }
> @@ -795,7 +802,10 @@ void savemeta(char *out_fn, int saveoption, int gziplevel)
>
>  	sbd.md.journals = 1;
>
> -	mfd = savemetaopen(out_fn, gziplevel);
> +	if (saveoption == -1)
> +		destroy_all_meta = 1;
> +	else
> +		mfd = savemetaopen(out_fn, gziplevel);
>
>  	blks_saved = 0;
>  	if (sbd.gfs1)
> @@ -820,10 +830,12 @@ void savemeta(char *out_fn, int saveoption, int gziplevel)
>  		exit(1);
>
>  	/* Write the savemeta file header */
> -	err = save_header(&mfd, sbd.fssize * sbd.bsize);
> -	if (err) {
> -		perror("Failed to write metadata file header");
> -		exit(1);
> +	if (saveoption != -1) {
> +		err = save_header(&mfd, sbd.fssize * sbd.bsize);
> +		if (err) {
> +			perror("Failed to write metadata file header");
> +			exit(1);
> +		}
>  	}
>  	/* Save off the superblock */
>  	save_block(sbd.device_fd, &mfd, GFS2_SB_ADDR * GFS2_BASIC_BLOCK / sbd.bsize, 0);
> @@ -879,7 +891,8 @@ void savemeta(char *out_fn, int saveoption, int gziplevel)
>  	} else {
>  		printf("(uncompressed).\n");
>  	}
> -	savemetaclose(&mfd);
> +	if (saveoption != -1)
> +		savemetaclose(&mfd);
>  	close(sbd.device_fd);
>  	destroy_per_node_lookup();
>  	free(indirect);
>




More information about the Cluster-devel mailing list