From: Eric Sandeen Date: Fri, 15 Jan 2010 17:45:10 +0000 (-0600) Subject: mkfs: fix mkfs sectorsize setting when blkid fails X-Git-Url: http://git.kernel.org/?p=fs%2Fxfs%2Fxfsprogs-dev.git;a=commitdiff_plain;h=7355966f018edd0d56b47dc5d7bac7950ed49683 mkfs: fix mkfs sectorsize setting when blkid fails When trying to mkfs something that blkid doesn't grok: # mkfs.xfs fsfile warning: unable to probe device toplology for device fsfile illegal sector size 0 Usage: mkfs.xfs ... mkfs fails. :( Signed-off-by: Eric Sandeen Reviewed-by: Alex Elder --- 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-Url: http://git.kernel.org/?p=fs%2Fxfs%2Fxfsprogs-dev.git;a=commitdiff_plain;h=063aab8b3b597d4714fee03a657c58906900cf8e 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 --- From: Eric Sandeen Date: Sun, 17 Jan 2010 16:31:58 +0000 (-0600) Subject: mkfs: get size of device properly X-Git-Url: http://git.kernel.org/?p=fs%2Fxfs%2Fxfsprogs-dev.git;a=commitdiff_plain;h=d943b1140e566223bfd424ca4e24b3c1f3781037 mkfs: get size of device properly Test device node size properly in check_overwrite, st_size is only valid for regular files. Signed-off-by: Eric Sandeen Reviewed-by: Christoph Hellwig --- Index: xfsprogs-3.1.0/mkfs/xfs_mkfs.c =================================================================== --- xfsprogs-3.1.0.orig/mkfs/xfs_mkfs.c +++ xfsprogs-3.1.0/mkfs/xfs_mkfs.c @@ -283,27 +283,52 @@ 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; + int fd; + long long size; + int bsz; if (!device || !*device) return 0; + ret = -1; /* will reset on success of all setup calls */ + + fd = open(device, O_RDONLY); + if (fd < 0) + goto out; + platform_findsizes(device, fd, &size, &bsz); + close(fd); + + /* nothing to overwrite on a 0-length device */ + if (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 +341,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; } @@ -1574,7 +1604,7 @@ main( * Unless specified manually on the command line use the * advertised sector size of the device. */ - sectorsize = ft.sectorsize; + sectorsize = ft.sectorsize ? ft.sectorsize : XFS_MIN_SECTORSIZE; } if (ft.sectoralign || !ssflag) {