[PATCH V2] mkfs: fix mkfs.xfs -dfile,name=$NAME for new files

Alex Elder aelder at sgi.com
Fri Jan 15 13:11:29 CST 2010


Eric Sandeen wrote:
> # /sbin/mkfs.xfs -dfile,name=grrr,size=100g
> mkfs.xfs: Use the -f option to force overwrite.
> 
> check_overwrite is failing, because  blkid_new_probe_from_filename()
> is failing, because the (new) image file is 0 length.
> 
> It's easy to test for 0 length, and if found, there is
> nothing to overwrite so return 0.
> 
> Also, if testing itself failed for some reason, print
> a message to that effect:
> 
> # mkfs/mkfs.xfs -dfile,name=newfile,size=1g
> mkfs.xfs: probe of newfile failed, cannot detect existing filesystem.
> mkfs.xfs: Use the -f option to force overwrite.

This looks good.

> Signed-off-by: Eric Sandeen <sandeen at sandeen.net>
> ---

Reviewed-by: Alex Elder <aelder at sgi.com>

> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
> index faaafed..b6801dd 100644
> --- a/mkfs/xfs_mkfs.c
> +++ b/mkfs/xfs_mkfs.c
> @@ -283,27 +283,47 @@ calc_stripe_factors(
>  }
> 
>  #ifdef ENABLE_BLKID
> +/*
> + * Check for existing filesystem or partition table on device.
> + * Returns:
> + *	 1 for existing fs or partition
> + *	 0 for nothing found
> + *	-1 for internal error
> + */
>  static int
>  check_overwrite(
>  	char		*device)
>  {
>  	const char	*type;
> -	blkid_probe	pr;
> -	int		ret = 0;
> +	blkid_probe	pr = NULL;
> +	int		ret;
> +	struct stat	statbuf;
> 
>  	if (!device || !*device)
>  		return 0;
> 
> +	ret = -1; /* will reset on success of all setup calls */
> +
> +	if (stat(device, &statbuf) < 0)
> +		goto out;
> +
> +	/* nothing to overwrite on a 0-length device */
> +	if (statbuf.st_size == 0) {
> +		ret = 0;
> +		goto out;
> +	}
> +
>  	pr = blkid_new_probe_from_filename(device);
>  	if (!pr)
> -		return -1;
> +		goto out;
> 
>  	if (blkid_probe_enable_partitions(pr, 1))
> -		goto out_free_probe;
> +		goto out;
> 
>  	if (blkid_do_fullprobe(pr))
> -		goto out_free_probe;
> +		goto out;
> 
> +	ret = 0;
>  	if (!blkid_probe_lookup_value(pr, "TYPE", &type, NULL)) {
>  		fprintf(stderr,
>  			_("%s: %s appears to contain an existing "
> @@ -316,8 +336,13 @@ check_overwrite(
>  		ret = 1;
>  	}
> 
> -out_free_probe:
> -	blkid_free_probe(pr);
> +out:
> +	if (pr)
> +		blkid_free_probe(pr);
> +	if (ret == -1)
> +		fprintf(stderr,
> +			_("%s: probe of %s failed, cannot detect "
> +			  "existing filesystem.\n"), progname, device);
>  	return ret;
>  }
> 
> 
> _______________________________________________
> xfs mailing list
> xfs at oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs




More information about the xfs mailing list