xfs
[Top] [All Lists]

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

To: "Eric Sandeen" <sandeen@xxxxxxxxxxx>
Subject: RE: [PATCH V2] mkfs: fix mkfs.xfs -dfile,name=$NAME for new files
From: "Alex Elder" <aelder@xxxxxxx>
Date: Fri, 15 Jan 2010 13:11:29 -0600
Cc: "xfs mailing list" <xfs@xxxxxxxxxxx>
In-reply-to: <4B50B848.2010108@xxxxxxxxxxx>
Thread-index: AcqWFhnuN9xFP7W7S2eCJY5+/Uq4IwAAGWWA
Thread-topic: [PATCH V2] mkfs: fix mkfs.xfs -dfile,name=$NAME for new files
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@xxxxxxxxxxx>
> ---

Reviewed-by: Alex Elder <aelder@xxxxxxx>

> 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@xxxxxxxxxxx
> http://oss.sgi.com/mailman/listinfo/xfs

<Prev in Thread] Current Thread [Next in Thread>