From: Eric Sandeen Date: Fri, 15 Jan 2010 19:25:20 +0000 (-0600) Subject: mkfs: fix mkfs.xfs -dfile,name=$NAME for new files X-Git-Tag: v3.1.1~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=063aab8b3b597d4714fee03a657c58906900cf8e;p=thirdparty%2Fxfsprogs-dev.git mkfs: fix mkfs.xfs -dfile,name=$NAME for new files # /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. Signed-off-by: Eric Sandeen Reviewed-by: Alex Elder --- diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index faaafed82..0743976a9 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; }