From: Eric Sandeen Date: Thu, 19 Jun 2014 02:11:20 +0000 (+1000) Subject: mkfs.xfs: don't call blkid_get_topology on existing regular files X-Git-Tag: v3.2.1~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3800a2a23d1a9af666421eac5fd4a4e3f5e042ec;p=thirdparty%2Fxfsprogs-dev.git mkfs.xfs: don't call blkid_get_topology on existing regular files If we encounter a target that's really a regular file, even without "-d file..." on the cmdline, call platform_findsizes() instead of blkid_get_topology to try to discover the "sector size" via the fsgeom() call. Otherwise mkfs.xfs will try to do direct IO with a default 512 sector size, and if the underlying file has different DIO requirements, mkfs will fail. Signed-off-by: Eric Sandeen Reviewed-by: Brian Foster Signed-off-by: Dave Chinner --- diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 188b6b3bf..c85258ab6 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -457,11 +457,30 @@ static void get_topology( int force_overwrite) { if (!xi->disfile) { - const char *dfile = xi->volname ? xi->volname : xi->dname; + char *dfile = xi->volname ? xi->volname : xi->dname; + struct stat statbuf; - blkid_get_topology(dfile, &ft->dsunit, &ft->dswidth, - &ft->lsectorsize, &ft->psectorsize, - force_overwrite); + /* + * If our target is a regular file, and xi->disfile isn't + * set (i.e. no "-d file" invocation), use platform_findsizes + * to try to obtain the underlying filesystem's requirements + * for direct IO; we'll set our sector size to that if possible. + */ + if (!stat(dfile, &statbuf) && S_ISREG(statbuf.st_mode)) { + int fd; + long long dummy; + + fd = open(dfile, O_RDONLY); + if (fd >= 0) { + platform_findsizes(dfile, fd, &dummy, + &ft->lsectorsize); + close(fd); + } + } else { + blkid_get_topology(dfile, &ft->dsunit, &ft->dswidth, + &ft->lsectorsize, &ft->psectorsize, + force_overwrite); + } } if (xi->rtname && !xi->risfile) {