On 4/29/16 9:47 AM, Jan Tulak wrote: > From: Dave Chinner <dchinner@xxxxxxxxxx> > > If the device is actually a file, and "-d file" is not specified, > mkfs will try to treat it as a block device and get stuff wrong. > Image files don't necessarily have the same sector sizes as the > block device or filesystem underlying the image file, nor should we > be issuing discard ioctls on image files. > > To fix this sanely, only require "-d file" if the device name is > invalid to trigger creation of the file. Otherwise, use stat() to > determine if the device is a file or block device and deal with that > appropriately by setting the "isfile" variables and turning off > direct IO. Then ensure that we check the "isfile" options before > doing things that are specific to block devices. > > Other file/blockdev issues fixed: > - use getstr to detect specifying the data device name > twice. > - check file/size/name parameters before anything else. > - overwrite checks need to be done before the image file is > opened and potentially truncated. > - blkid_get_topology() should not be called for image files, > so warn when it is called that way. > - zero_old_xfs_structures() emits a spurious error: > "existing superblock read failed: Success" > when it is run on a truncated image file. Don't warn if we > see this problem on an image file. > - Don't issue discards on image files. > - Use fsync() for image files, not BLKFLSBUF in > platform_flush_device() for Linux. > > Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> > Signed-off-by: Jan Tulak <jtulak@xxxxxxxxxx> > > --- > CHANGES: > * read image file size in advance of O_TRUNC in case of dfile&&dcreat > Signed-off-by: Jan Tulak <jtulak@xxxxxxxxxx> > --- > libxfs/init.c | 21 ++++++- > libxfs/linux.c | 11 +++- > mkfs/xfs_mkfs.c | 182 ++++++++++++++++++++++++++++++++++++++------------------ > 3 files changed, 154 insertions(+), 60 deletions(-) > > diff --git a/libxfs/init.c b/libxfs/init.c > index 8d747e8..c7ae00d 100644 > --- a/libxfs/init.c > +++ b/libxfs/init.c > @@ -253,8 +253,15 @@ libxfs_init(libxfs_init_t *a) > rtname = a->rtname; > a->dfd = a->logfd = a->rtfd = -1; > a->ddev = a->logdev = a->rtdev = 0; > - a->dbsize = a->lbsize = a->rtbsize = 0; > - a->dsize = a->logBBsize = a->logBBstart = a->rtsize = 0; > + a->lbsize = a->rtbsize = 0; > + a->logBBsize = a->logBBstart = a->rtsize = 0; > + > + // We can reset dbsize only when it is not a file, or we won't > + // truncate it. Otherwise, we loose the size of the file forever. please don't use c++ comments in xfsprogs, we use /* comments */ ... > static void > +check_device_type( > + const char *name, > + int *isfile, > + bool no_size, > + bool no_name, > + int *create, > + bool force_overwrite, > + const char *optname) > +{ > + struct stat64 statbuf; > + /* > + if (*isfile && (no_size || no_name)) { > + fprintf(stderr, > + _("if -%s file then -%s name and -%s size are required\n"), > + optname, optname, optname); > + usage(); > + }*/ What is this? Jan, I'm just going to go back to the original patches posted in your V2 series, and either give them Reviewed-by's, or send followup fix-up patches with a Eric Sandeen <sandeen@xxxxxxxxxx>: fixed up foo, bar, baz tag and a Reviewed-by to go with it, I think that might be the fastest path to finally getting this stuff merged. Thanks, -Eric _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs