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 <sandeen@xxxxxxxxxx> --- V3: only call platform_findsizes if xi->disfile isn't set, and our target is a regular file: i.e. only in the "mkfs.xfs <existing regular file>" case. diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 188b6b3..c85258a 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) { _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs