On 6/6/14, 10:27 AM, Eric Sandeen wrote: > On 6/6/14, 10:21 AM, Brian Foster wrote: >> On Thu, Jun 05, 2014 at 02:15:03PM -0500, Eric Sandeen wrote: >>> 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. >>> >>> Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx> >>> --- >>> >>> V2: Lose local "isa_file" flag, just switch based on >>> (xi->disfile) or (stat works & S_ISREG) >>> >>> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c >>> index 188b6b3..3b8bf67 100644 >>> --- a/mkfs/xfs_mkfs.c >>> +++ b/mkfs/xfs_mkfs.c >>> @@ -456,9 +456,25 @@ static void get_topology( >>> struct fs_topology *ft, >>> int force_overwrite) >>> { >>> - if (!xi->disfile) { >>> - const char *dfile = xi->volname ? xi->volname : xi->dname; >>> + struct stat statbuf; >>> + char *dfile = xi->volname ? xi->volname : xi->dname; >>> >>> + /* >>> + * Don't call blkid for topology if this is a "-d file" target, or >>> + * if we've simply been pointed at a regular file. platform_findsizes >>> + * will attempt to find the underlying sector size of the host fs. >>> + */ >>> + if (xi->disfile || >>> + (!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); >>> + } >> >> The patch looks fine: >> >> Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> >> >> It does look like we'd still be susceptible to error in a situation >> where the file hasn't been created yet (which would occur in >> libxfs_init()). > > Hm, let's see - the only way to have mkfs create the file is with the > -d file,name=foo,size=bar invocation. > > Sprinkling some printf's into the if/else above, I see: > > # rm -f testfile > # mkfs/mkfs.xfs -dfile,name=testfile,size=1g > ** doing platform_findsizes ** > meta-data=testfile isize=256 agcount=4, agsize=65536 blks > ... > > so it looks like the file does get created before we get here. Oh, I see, sorry. Crud, you're right. What prompted all this was that making a fs-in-a-file on a filesystem hosted on a hard 4k sector device fails, because it tries to do 512-byte DIO. If we use the "-d file" invocation, it works, because it doesn't do direct IO. Sigh. It's complicated. Let me think about the 2nd patch just a bit more. Perhaps only doing the platform_findsizes if stat succeeds, not if xi->disfile. -Eric _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs