Re: [PATCH 1/2] src/godown: support f2fs triggering specific ioctl

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]



On Thu, Jan 08, 2015 at 12:44:56PM -0600, Eric Sandeen wrote:
> On 1/8/15 12:31 PM, Jaegeuk Kim wrote:
> > This patch triggers the F2FS-related ioctl for godown.
> 
> hohum, wouldn't it be a whole lot easier to just re-use the XFS ioctl
> number in f2fs?  Then you wouldn't have to duplicate all this code.

Actually I tried to do like that. But, xfs's goingdown has some specific options
wrt flushing logs which provide some rules on data recovery.

So, I decided to add a new ioctl and a test script, (i.e., f2fs/087) which is
different from xfs/087.

> 
> If you really want your own unique ioctl number, what about
> just doing statfs on the target, and if f_type returns F2FS_SUPER_MAGIC,
> swictch the ioctl nr to F2FS_IOC_GOINGDOWN.

Oh, I'll change detecting the file system type.
For the common ioctl, it needs to consider ioctl's format where xfs calls xfsctl
with flushing options while f2fs triggers ioctl without paramter.

> 
> Then if not F2FS_SUPER_MAGIC, leave the ioctl nr at XFS_IOC_GOINGDOWN, and
> if it fails, it fails (other filesystems might support the original nr.)
> 
> And then you can probably just add "f2fs" to the existing testcase,
> and move it to tests/shared?

I can't use the same scripts due to the different options used by xfs's
goingdown.

Thank you for the comments. :)

Thanks,

> 
> -Eric
> 
> > Signed-off-by: Jaegeuk Kim <jaegeuk@xxxxxxxxxx>
> > ---
> >  src/godown.c | 88 ++++++++++++++++++++++++++++++++++++++++++++----------------
> >  1 file changed, 65 insertions(+), 23 deletions(-)
> > 
> > diff --git a/src/godown.c b/src/godown.c
> > index b140a41..b44790b 100644
> > --- a/src/godown.c
> > +++ b/src/godown.c
> > @@ -19,33 +19,82 @@
> >  #include <syslog.h>
> >  #include "global.h"
> >  
> > +#define F2FS_IOCTL_MAGIC	0xf5
> > +#define F2FS_IOC_GOINGDOWN	_IO(F2FS_IOCTL_MAGIC, 6)
> > +
> > +enum ftypes {
> > +	XFS_FS,
> > +	F2FS_FS,
> > +};
> > +
> >  static char *xprogname;
> > +static char *mnt_dir;
> > +static int verbose_opt = 0;
> > +static int flushlog_opt = 0;
> >  
> > +static enum ftypes fs = XFS_FS;
> >  
> >  static void
> >  usage(void)
> >  {
> > -	fprintf(stderr, "usage: %s [-f] [-v] mnt-dir\n", xprogname);
> > +	fprintf(stderr, "usage: %s [-f] [-v] [-s 0/1] mnt-dir\n", xprogname);
> > +}
> > +
> > +static int
> > +xfs_goingdown(int fd)
> > +{
> > +	int flag;
> > +
> > +	flag = (flushlog_opt ? XFS_FSOP_GOING_FLAGS_LOGFLUSH
> > +			    : XFS_FSOP_GOING_FLAGS_NOLOGFLUSH);
> > +	if (verbose_opt) {
> > +		printf("Calling XFS_IOC_GOINGDOWN\n");
> > +	}
> > +
> > +	syslog(LOG_WARNING, "xfstests-induced forced shutdown of %s:\n",
> > +			mnt_dir);
> > +	if ((xfsctl(mnt_dir, fd, XFS_IOC_GOINGDOWN, &flag)) == -1) {
> > +		fprintf(stderr, "%s: error on xfsctl(GOINGDOWN) of \"%s\": %s\n",
> > +				xprogname, mnt_dir, strerror(errno));
> > +		return 1;
> > +	}
> > +	return 0;
> > +}
> > +
> > +static int
> > +f2fs_goingdown(int fd)
> > +{
> > +	if (verbose_opt) {
> > +		printf("Calling F2FS_IOC_GOINGDOWN\n");
> > +	}
> > +	syslog(LOG_WARNING, "xfstests-induced forced shutdown of %s:\n",
> > +			mnt_dir);
> > +	if ((ioctl(fd, F2FS_IOC_GOINGDOWN)) == -1) {
> > +		fprintf(stderr, "%s: error on ioctl(GOINGDOWN) of \"%s\": %s\n",
> > +				xprogname, mnt_dir, strerror(errno));
> > +		return 1;
> > +	}
> > +	return 0;
> > +
> >  }
> >  
> >  int
> >  main(int argc, char *argv[])
> >  {
> > -	int c;
> > -	int flag;
> > -	int flushlog_opt = 0;
> > -	int verbose_opt = 0;
> > +	int c, fd;
> >  	struct stat st;
> > -	char *mnt_dir;
> > -	int fd;
> > +	int ret = 0;
> >  
> >        	xprogname = argv[0];
> >  
> > -	while ((c = getopt(argc, argv, "fv")) != -1) {
> > +	while ((c = getopt(argc, argv, "fs:v")) != -1) {
> >  		switch (c) {
> >  		case 'f':
> >  			flushlog_opt = 1;
> >  			break;
> > +		case 's':
> > +			fs = atoi(optarg);
> > +			break;
> >  		case 'v':
> >  			verbose_opt = 1;
> >  			break;
> > @@ -94,10 +143,6 @@ main(int argc, char *argv[])
> >  	}
> >  #endif
> >  
> > -
> > -	flag = (flushlog_opt ? XFS_FSOP_GOING_FLAGS_LOGFLUSH 
> > -			    : XFS_FSOP_GOING_FLAGS_NOLOGFLUSH);
> > -
> >  	if (verbose_opt) {
> >  		printf("Opening \"%s\"\n", mnt_dir);
> >  	}
> > @@ -107,18 +152,15 @@ main(int argc, char *argv[])
> >  		return 1;
> >  	}
> >  
> > -	if (verbose_opt) {
> > -		printf("Calling XFS_IOC_GOINGDOWN\n");
> > +	switch (fs) {
> > +	case XFS_FS:
> > +		ret = xfs_goingdown(fd);
> > +		break;
> > +	case F2FS_FS:
> > +		ret = f2fs_goingdown(fd);
> > +		break;
> >  	}
> > -	syslog(LOG_WARNING, "xfstests-induced forced shutdown of %s:\n",
> > -		mnt_dir);
> > -	if ((xfsctl(mnt_dir, fd, XFS_IOC_GOINGDOWN, &flag)) == -1) {
> > -		fprintf(stderr, "%s: error on xfsctl(GOINGDOWN) of \"%s\": %s\n",
> > -			xprogname, mnt_dir, strerror(errno));
> > -		return 1;
> > -	}
> > -
> >  	close(fd);
> >  
> > -	return 0;
> > +	return ret;
> >  }
> > 
--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Filesystems Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux