Re: [PATCH 23/23] libxfs: split out a libxfs_dev structure from struct libxfs_init

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

 



On Mon, Dec 11, 2023 at 05:37:42PM +0100, Christoph Hellwig wrote:
> Most of the content of libxfs_init is members duplicated for each of the
> data, log and RT devices.  Split those members into a separate
> libxfs_dev structure.
> 
> Signed-off-by: Christoph Hellwig <hch@xxxxxx>

Reviewed-by: Carlos Maiolino <cmaiolino@xxxxxxxxxx>

> ---
>  copy/xfs_copy.c     |   4 +-
>  db/info.c           |   2 +-
>  db/init.c           |  12 +--
>  db/output.c         |   2 +-
>  db/sb.c             |   8 +-
>  growfs/xfs_growfs.c |  20 ++---
>  include/libxfs.h    |  45 ++++------
>  libxfs/init.c       | 210 +++++++++++++++++++++-----------------------
>  libxfs/topology.c   |  16 ++--
>  logprint/logprint.c |  40 ++++-----
>  mkfs/xfs_mkfs.c     | 158 ++++++++++++++++-----------------
>  repair/init.c       |  12 +--
>  repair/phase2.c     |   4 +-
>  repair/sb.c         |  16 ++--
>  repair/xfs_repair.c |   8 +-
>  15 files changed, 265 insertions(+), 292 deletions(-)
> 
> diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c
> index bd7c6d334..6e692e4f7 100644
> --- a/copy/xfs_copy.c
> +++ b/copy/xfs_copy.c
> @@ -716,8 +716,8 @@ main(int argc, char **argv)
> 
>  	memset(&xargs, 0, sizeof(xargs));
>  	xargs.flags = LIBXFS_ISREADONLY | LIBXFS_DIRECT;
> -	xargs.dname = source_name;
> -	xargs.disfile = source_is_file;
> +	xargs.data.name = source_name;
> +	xargs.data.isfile = source_is_file;
> 
>  	if (!libxfs_init(&xargs))  {
>  		do_log(_("%s: couldn't initialize XFS library\n"
> diff --git a/db/info.c b/db/info.c
> index b30ada3aa..9c6203f02 100644
> --- a/db/info.c
> +++ b/db/info.c
> @@ -30,7 +30,7 @@ info_f(
>  	struct xfs_fsop_geom	geo;
> 
>  	libxfs_fs_geometry(mp, &geo, XFS_FS_GEOM_MAX_STRUCT_VER);
> -	xfs_report_geom(&geo, x.dname, x.logname, x.rtname);
> +	xfs_report_geom(&geo, x.data.name, x.log.name, x.rt.name);
>  	return 0;
>  }
> 
> diff --git a/db/init.c b/db/init.c
> index f240d0f66..cea25ae52 100644
> --- a/db/init.c
> +++ b/db/init.c
> @@ -61,7 +61,7 @@ init(
>  			cmdline[ncmdline++] = optarg;
>  			break;
>  		case 'f':
> -			x.disfile = 1;
> +			x.data.isfile = 1;
>  			break;
>  		case 'F':
>  			force = 1;
> @@ -76,7 +76,7 @@ init(
>  			x.flags = LIBXFS_ISREADONLY;
>  			break;
>  		case 'l':
> -			x.logname = optarg;
> +			x.log.name = optarg;
>  			break;
>  		case 'x':
>  			expert_mode = 1;
> @@ -91,7 +91,7 @@ init(
>  	if (optind + 1 != argc)
>  		usage();
> 
> -	x.dname = argv[optind];
> +	x.data.name = argv[optind];
>  	x.flags |= LIBXFS_DIRECT;
> 
>  	x.bcache_flags = CACHE_MISCOMPARE_PURGE;
> @@ -111,7 +111,7 @@ init(
>  			1 << (XFS_MAX_SECTORSIZE_LOG - BBSHIFT), 0, &bp, NULL);
>  	if (error) {
>  		fprintf(stderr, _("%s: %s is invalid (cannot read first 512 "
> -			"bytes)\n"), progname, x.dname);
> +			"bytes)\n"), progname, x.data.name);
>  		exit(1);
>  	}
> 
> @@ -122,7 +122,7 @@ init(
>  	sbp = &xmount.m_sb;
>  	if (sbp->sb_magicnum != XFS_SB_MAGIC) {
>  		fprintf(stderr, _("%s: %s is not a valid XFS filesystem (unexpected SB magic number 0x%08x)\n"),
> -			progname, x.dname, sbp->sb_magicnum);
> +			progname, x.data.name, sbp->sb_magicnum);
>  		if (!force) {
>  			fprintf(stderr, _("Use -F to force a read attempt.\n"));
>  			exit(EXIT_FAILURE);
> @@ -134,7 +134,7 @@ init(
>  	if (!mp) {
>  		fprintf(stderr,
>  			_("%s: device %s unusable (not an XFS filesystem?)\n"),
> -			progname, x.dname);
> +			progname, x.data.name);
>  		exit(1);
>  	}
>  	mp->m_log = &xlog;
> diff --git a/db/output.c b/db/output.c
> index 30ae82ced..d12266c42 100644
> --- a/db/output.c
> +++ b/db/output.c
> @@ -34,7 +34,7 @@ dbprintf(const char *fmt, ...)
>  	blockint();
>  	i = 0;
>  	if (dbprefix)
> -		i += printf("%s: ", x.dname);
> +		i += printf("%s: ", x.data.name);
>  	i += vprintf(fmt, ap);
>  	unblockint();
>  	va_end(ap);
> diff --git a/db/sb.c b/db/sb.c
> index b2aa4a626..b48767f47 100644
> --- a/db/sb.c
> +++ b/db/sb.c
> @@ -220,13 +220,13 @@ sb_logcheck(void)
>  	int		dirty;
> 
>  	if (mp->m_sb.sb_logstart) {
> -		if (x.logdev && x.logdev != x.ddev) {
> +		if (x.log.dev && x.log.dev != x.data.dev) {
>  			dbprintf(_("aborting - external log specified for FS "
>  				 "with an internal log\n"));
>  			return 0;
>  		}
>  	} else {
> -		if (!x.logdev || (x.logdev == x.ddev)) {
> +		if (!x.log.dev || (x.log.dev == x.data.dev)) {
>  			dbprintf(_("aborting - no external log specified for FS "
>  				 "with an external log\n"));
>  			return 0;
> @@ -452,10 +452,10 @@ uuid_f(
>  			}
>  		}
>  		if (mp->m_sb.sb_logstart) {
> -			if (x.logdev && x.logdev != x.ddev)
> +			if (x.log.dev && x.log.dev != x.data.dev)
>  				dbprintf(_("warning - external log specified "
>  					 "for FS with an internal log\n"));
> -		} else if (!x.logdev || (x.logdev == x.ddev)) {
> +		} else if (!x.log.dev || (x.log.dev == x.data.dev)) {
>  			dbprintf(_("warning - no external log specified "
>  				 "for FS with an external log\n"));
>  		}
> diff --git a/growfs/xfs_growfs.c b/growfs/xfs_growfs.c
> index 05aea3496..4b941403e 100644
> --- a/growfs/xfs_growfs.c
> +++ b/growfs/xfs_growfs.c
> @@ -183,26 +183,26 @@ main(int argc, char **argv)
>  	 */
> 
>  	memset(&xi, 0, sizeof(xi));
> -	xi.dname = datadev;
> -	xi.logname = logdev;
> -	xi.rtname = rtdev;
> +	xi.data.name = datadev;
> +	xi.log.name = logdev;
> +	xi.rt.name = rtdev;
>  	xi.flags = LIBXFS_ISREADONLY;
> 
>  	if (!libxfs_init(&xi))
>  		usage();
> 
>  	/* check we got the info for all the sections we are trying to modify */
> -	if (!xi.ddev) {
> +	if (!xi.data.dev) {
>  		fprintf(stderr, _("%s: failed to access data device for %s\n"),
>  			progname, fname);
>  		exit(1);
>  	}
> -	if (lflag && !isint && !xi.logdev) {
> +	if (lflag && !isint && !xi.log.dev) {
>  		fprintf(stderr, _("%s: failed to access external log for %s\n"),
>  			progname, fname);
>  		exit(1);
>  	}
> -	if (rflag && !xi.rtdev) {
> +	if (rflag && !xi.rt.dev) {
>  		fprintf(stderr,
>  			_("%s: failed to access realtime device for %s\n"),
>  			progname, fname);
> @@ -211,10 +211,10 @@ main(int argc, char **argv)
> 
>  	xfs_report_geom(&geo, datadev, logdev, rtdev);
> 
> -	ddsize = xi.dsize;
> -	dlsize = ( xi.logBBsize? xi.logBBsize :
> +	ddsize = xi.data.size;
> +	dlsize = (xi.log.size ? xi.log.size :
>  			geo.logblocks * (geo.blocksize / BBSIZE) );
> -	drsize = xi.rtsize;
> +	drsize = xi.rt.size;
> 
>  	/*
>  	 * Ok, Linux only has a 1024-byte resolution on device _size_,
> @@ -328,7 +328,7 @@ _("[EXPERIMENTAL] try to shrink unused space %lld, old size is %lld\n"),
>  		else if (xflag)
>  			in.isint = 0;
>  		else
> -			in.isint = xi.logBBsize == 0;
> +			in.isint = xi.log.size == 0;
>  		if (lsize == geo.logblocks && (in.isint == isint)) {
>  			if (lflag)
>  				fprintf(stderr,
> diff --git a/include/libxfs.h b/include/libxfs.h
> index 058217c2a..eb3f9ac22 100644
> --- a/include/libxfs.h
> +++ b/include/libxfs.h
> @@ -89,38 +89,31 @@ struct iomap;
> 
>  #define xfs_isset(a,i)	((a)[(i)/(sizeof(*(a))*NBBY)] & (1ULL<<((i)%(sizeof(*(a))*NBBY))))
> 
> +struct libxfs_dev {
> +	/* input parameters */
> +	char		*name;	/* pathname of the device */
> +	bool		isfile;	/* is the device a file? */
> +	bool		create;	/* create file if it doesn't exist */
> +
> +	/* output parameters */
> +	dev_t		dev;	/* device name for the device */
> +	long long       size;	/* size of subvolume (BBs) */
> +	int		bsize;	/* device blksize */
> +	int		fd;	/* file descriptor */
> +};
> +
>  /*
>   * Argument structure for libxfs_init().
>   */
>  struct libxfs_init {
> -				/* input parameters */
> -	char            *dname;         /* pathname of data "subvolume" */
> -	char            *logname;       /* pathname of log "subvolume" */
> -	char            *rtname;        /* pathname of realtime "subvolume" */
> +	struct libxfs_dev	data;
> +	struct libxfs_dev	log;
> +	struct libxfs_dev	rt;
> +
> +	/* input parameters */
>  	unsigned	flags;		/* LIBXFS_* flags below */
> -	int             disfile;        /* data "subvolume" is a regular file */
> -	int             dcreat;         /* try to create data subvolume */
> -	int             lisfile;        /* log "subvolume" is a regular file */
> -	int             lcreat;         /* try to create log subvolume */
> -	int             risfile;        /* realtime "subvolume" is a reg file */
> -	int             rcreat;         /* try to create realtime subvolume */
> -	int		setblksize;	/* attempt to set device blksize */
> -				/* output results */
> -	dev_t           ddev;           /* device for data subvolume */
> -	dev_t           logdev;         /* device for log subvolume */
> -	dev_t           rtdev;          /* device for realtime subvolume */
> -	long long       dsize;          /* size of data subvolume (BBs) */
> -	long long       logBBsize;      /* size of log subvolume (BBs) */
> -					/* (blocks allocated for use as
> -					 * log is stored in mount structure) */
> -	long long       rtsize;         /* size of realtime subvolume (BBs) */
> -	int		dbsize;		/* data subvolume device blksize */
> -	int		lbsize;		/* log subvolume device blksize */
> -	int		rtbsize;	/* realtime subvolume device blksize */
> -	int             dfd;            /* data subvolume file descriptor */
> -	int             logfd;          /* log subvolume file descriptor */
> -	int             rtfd;           /* realtime subvolume file descriptor */
>  	int		bcache_flags;	/* cache init flags */
> +	int		setblksize;	/* value to set device blksizes to */
>  };
> 
>  /* disallow all mounted filesystems: */
> diff --git a/libxfs/init.c b/libxfs/init.c
> index 320e4d63f..63c506a69 100644
> --- a/libxfs/init.c
> +++ b/libxfs/init.c
> @@ -62,93 +62,117 @@ check_isactive(char *name, char *block, int fatal)
>  	return 0;
>  }
> 
> -/* libxfs_device_open:
> - *     open a device and return its device number
> - */
> -static dev_t
> -libxfs_device_open(char *path, int creat, int xflags, int setblksize, int *fdp)
> +static int
> +check_open(
> +	struct libxfs_init	*xi,
> +	struct libxfs_dev	*dev)
>  {
> -	int		fd, flags;
> -	int		readonly, dio, excl;
> -	struct stat	statb;
> +	struct stat	stbuf;
> 
> -	readonly = (xflags & LIBXFS_ISREADONLY);
> -	excl = (xflags & LIBXFS_EXCLUSIVELY) && !creat;
> -	dio = (xflags & LIBXFS_DIRECT) && !creat && platform_direct_blockdev();
> +	if (stat(dev->name, &stbuf) < 0) {
> +		perror(dev->name);
> +		return 0;
> +	}
> +	if (!(xi->flags & LIBXFS_ISREADONLY) &&
> +	    !(xi->flags & LIBXFS_ISINACTIVE) &&
> +	    platform_check_ismounted(dev->name, dev->name, NULL, 1))
> +		return 0;
> 
> -retry:
> -	flags = (readonly ? O_RDONLY : O_RDWR) | \
> -		(creat ? (O_CREAT|O_TRUNC) : 0) | \
> -		(dio ? O_DIRECT : 0) | \
> -		(excl ? O_EXCL : 0);
> +	if ((xi->flags & LIBXFS_ISINACTIVE) &&
> +	    check_isactive(dev->name, dev->name, !!(xi->flags &
> +			(LIBXFS_ISREADONLY | LIBXFS_DANGEROUSLY))))
> +		return 0;
> +
> +	return 1;
> +}
> +
> +static bool
> +libxfs_device_open(
> +	struct libxfs_init	*xi,
> +	struct libxfs_dev	*dev)
> +{
> +	struct stat		statb;
> +	int			flags;
> +
> +	dev->fd = -1;
> +
> +	if (!dev->name)
> +		return true;
> +	if (!dev->isfile && !check_open(xi, dev))
> +		return false;
> +
> +	if (xi->flags & LIBXFS_ISREADONLY)
> +		flags = O_RDONLY;
> +	else
> +		flags = O_RDWR;
> 
> -	if ((fd = open(path, flags, 0666)) < 0) {
> -		if (errno == EINVAL && --dio == 0)
> +	if (dev->create) {
> +		flags |= O_CREAT | O_TRUNC;
> +	} else {
> +		if (xi->flags & LIBXFS_EXCLUSIVELY)
> +			flags |= O_EXCL;
> +		if ((xi->flags & LIBXFS_DIRECT) && platform_direct_blockdev())
> +			flags |= O_DIRECT;
> +	}
> +
> +retry:
> +	dev->fd = open(dev->name, flags, 0666);
> +	if (dev->fd < 0) {
> +		if (errno == EINVAL && (flags & O_DIRECT)) {
> +			flags &= ~O_DIRECT;
>  			goto retry;
> +		}
>  		fprintf(stderr, _("%s: cannot open %s: %s\n"),
> -			progname, path, strerror(errno));
> +			progname, dev->name, strerror(errno));
>  		exit(1);
>  	}
> 
> -	if (fstat(fd, &statb) < 0) {
> +	if (fstat(dev->fd, &statb) < 0) {
>  		fprintf(stderr, _("%s: cannot stat %s: %s\n"),
> -			progname, path, strerror(errno));
> +			progname, dev->name, strerror(errno));
>  		exit(1);
>  	}
> 
> -	if (!readonly && setblksize && (statb.st_mode & S_IFMT) == S_IFBLK) {
> +	if (!(xi->flags & LIBXFS_ISREADONLY) &&
> +	    xi->setblksize &&
> +	    (statb.st_mode & S_IFMT) == S_IFBLK) {
>  		/*
>  		 * Try to use the given explicit blocksize.  Failure to set the
>  		 * block size is only fatal for direct I/O.
>  		 */
> -		platform_set_blocksize(fd, path, statb.st_rdev, setblksize,
> -				dio);
> +		platform_set_blocksize(dev->fd, dev->name, statb.st_rdev,
> +				xi->setblksize, flags & O_DIRECT);
>  	}
> 
>  	/*
>  	 * Get the device number from the stat buf - unless we're not opening a
>  	 * real device, in which case choose a new fake device number.
>  	 */
> -	*fdp = fd;
>  	if (statb.st_rdev)
> -		return statb.st_rdev;
> -	return nextfakedev--;
> +		dev->dev = statb.st_rdev;
> +	else
> +		dev->dev = nextfakedev--;
> +	platform_findsizes(dev->name, dev->fd, &dev->size, &dev->bsize);
> +	return true;
>  }
> 
>  static void
> -libxfs_device_close(int fd, dev_t dev)
> +libxfs_device_close(
> +	struct libxfs_dev	*dev)
>  {
> -	int	ret;
> +	int			ret;
> 
> -	ret = platform_flush_device(fd, dev);
> +	ret = platform_flush_device(dev->fd, dev->dev);
>  	if (ret) {
>  		ret = -errno;
>  		fprintf(stderr,
>  	_("%s: flush of device %lld failed, err=%d"),
>  			progname, (long long)dev, ret);
>  	}
> -	close(fd);
> -}
> +	close(dev->fd);
> 
> -static int
> -check_open(char *path, int flags)
> -{
> -	int readonly = (flags & LIBXFS_ISREADONLY);
> -	int inactive = (flags & LIBXFS_ISINACTIVE);
> -	int dangerously = (flags & LIBXFS_DANGEROUSLY);
> -	struct stat	stbuf;
> -
> -	if (stat(path, &stbuf) < 0) {
> -		perror(path);
> -		return 0;
> -	}
> -	if (!readonly && !inactive && platform_check_ismounted(path, path, NULL, 1))
> -		return 0;
> -
> -	if (inactive && check_isactive(path, path, ((readonly|dangerously)?1:0)))
> -		return 0;
> -
> -	return 1;
> +	dev->fd = -1;
> +	dev->dev = 0;
>  }
> 
>  /*
> @@ -209,15 +233,12 @@ static void
>  libxfs_close_devices(
>  	struct libxfs_init	*li)
>  {
> -	if (li->ddev)
> -		libxfs_device_close(li->dfd, li->ddev);
> -	if (li->logdev && li->logdev != li->ddev)
> -		libxfs_device_close(li->logfd, li->logdev);
> -	if (li->rtdev)
> -		libxfs_device_close(li->rtfd, li->rtdev);
> -
> -	li->ddev = li->logdev = li->rtdev = 0;
> -	li->dfd = li->logfd = li->rtfd = -1;
> +	if (li->data.dev)
> +		libxfs_device_close(&li->data);
> +	if (li->log.dev && li->log.dev != li->data.dev)
> +		libxfs_device_close(&li->log);
> +	if (li->rt.dev)
> +		libxfs_device_close(&li->rt);
>  }
> 
>  /*
> @@ -227,44 +248,16 @@ libxfs_close_devices(
>  int
>  libxfs_init(struct libxfs_init *a)
>  {
> -	char		*dname;
> -	char		*logname;
> -	char		*rtname;
> -
> -	dname = a->dname;
> -	logname = a->logname;
> -	rtname = a->rtname;
> -	a->dfd = a->logfd = a->rtfd = -1;
> -	a->ddev = a->logdev = a->rtdev = 0;
> -	a->dsize = a->lbsize = a->rtbsize = 0;
> -	a->dbsize = a->logBBsize = a->rtsize = 0;
> -
>  	rcu_init();
>  	rcu_register_thread();
>  	radix_tree_init();
> 
> -	if (dname) {
> -		if (!a->disfile && !check_open(dname, a->flags))
> -			goto done;
> -		a->ddev = libxfs_device_open(dname, a->dcreat, a->flags,
> -				a->setblksize, &a->dfd);
> -		platform_findsizes(dname, a->dfd, &a->dsize, &a->dbsize);
> -	}
> -	if (logname) {
> -		if (!a->lisfile && !check_open(logname, a->flags))
> -			goto done;
> -		a->logdev = libxfs_device_open(logname, a->lcreat, a->flags,
> -				a->setblksize, &a->logfd);
> -		platform_findsizes(logname, a->logfd, &a->logBBsize,
> -				&a->lbsize);
> -	}
> -	if (rtname) {
> -		if (a->risfile && !check_open(rtname, a->flags))
> -			goto done;
> -		a->rtdev = libxfs_device_open(rtname, a->rcreat, a->flags,
> -				a->setblksize, &a->rtfd);
> -		platform_findsizes(dname, a->rtfd, &a->rtsize, &a->rtbsize);
> -	}
> +	if (!libxfs_device_open(a, &a->data))
> +		goto done;
> +	if (!libxfs_device_open(a, &a->log))
> +		goto done;
> +	if (!libxfs_device_open(a, &a->rt))
> +		goto done;
> 
>  	if (!libxfs_bhash_size)
>  		libxfs_bhash_size = LIBXFS_BHASHSIZE(sbp);
> @@ -452,8 +445,7 @@ xfs_set_inode_alloc(
>  static struct xfs_buftarg *
>  libxfs_buftarg_alloc(
>  	struct xfs_mount	*mp,
> -	dev_t			dev,
> -	int			fd,
> +	struct libxfs_dev	*dev,
>  	unsigned long		write_fails)
>  {
>  	struct xfs_buftarg	*btp;
> @@ -465,8 +457,8 @@ libxfs_buftarg_alloc(
>  		exit(1);
>  	}
>  	btp->bt_mount = mp;
> -	btp->bt_bdev = dev;
> -	btp->bt_bdev_fd = fd;
> +	btp->bt_bdev = dev->dev;
> +	btp->bt_bdev_fd = dev->fd;
>  	btp->flags = 0;
>  	if (write_fails) {
>  		btp->writes_left = write_fails;
> @@ -538,29 +530,29 @@ libxfs_buftarg_init(
> 
>  	if (mp->m_ddev_targp) {
>  		/* should already have all buftargs initialised */
> -		if (mp->m_ddev_targp->bt_bdev != xi->ddev ||
> +		if (mp->m_ddev_targp->bt_bdev != xi->data.dev ||
>  		    mp->m_ddev_targp->bt_mount != mp) {
>  			fprintf(stderr,
>  				_("%s: bad buftarg reinit, ddev\n"),
>  				progname);
>  			exit(1);
>  		}
> -		if (!xi->logdev || xi->logdev == xi->ddev) {
> +		if (!xi->log.dev || xi->log.dev == xi->data.dev) {
>  			if (mp->m_logdev_targp != mp->m_ddev_targp) {
>  				fprintf(stderr,
>  				_("%s: bad buftarg reinit, ldev mismatch\n"),
>  					progname);
>  				exit(1);
>  			}
> -		} else if (mp->m_logdev_targp->bt_bdev != xi->logdev ||
> +		} else if (mp->m_logdev_targp->bt_bdev != xi->log.dev ||
>  			   mp->m_logdev_targp->bt_mount != mp) {
>  			fprintf(stderr,
>  				_("%s: bad buftarg reinit, logdev\n"),
>  				progname);
>  			exit(1);
>  		}
> -		if (xi->rtdev &&
> -		    (mp->m_rtdev_targp->bt_bdev != xi->rtdev ||
> +		if (xi->rt.dev &&
> +		    (mp->m_rtdev_targp->bt_bdev != xi->rt.dev ||
>  		     mp->m_rtdev_targp->bt_mount != mp)) {
>  			fprintf(stderr,
>  				_("%s: bad buftarg reinit, rtdev\n"),
> @@ -570,14 +562,12 @@ libxfs_buftarg_init(
>  		return;
>  	}
> 
> -	mp->m_ddev_targp = libxfs_buftarg_alloc(mp, xi->ddev, xi->dfd, dfail);
> -	if (!xi->logdev || xi->logdev == xi->ddev)
> +	mp->m_ddev_targp = libxfs_buftarg_alloc(mp, &xi->data, dfail);
> +	if (!xi->log.dev || xi->log.dev == xi->data.dev)
>  		mp->m_logdev_targp = mp->m_ddev_targp;
>  	else
> -		mp->m_logdev_targp = libxfs_buftarg_alloc(mp, xi->logdev,
> -				xi->logfd, lfail);
> -	mp->m_rtdev_targp = libxfs_buftarg_alloc(mp, xi->rtdev, xi->rtfd,
> -			rfail);
> +		mp->m_logdev_targp = libxfs_buftarg_alloc(mp, &xi->log, lfail);
> +	mp->m_rtdev_targp = libxfs_buftarg_alloc(mp, &xi->rt, rfail);
>  }
> 
>  /* Compute maximum possible height for per-AG btree types for this fs. */
> @@ -711,7 +701,7 @@ libxfs_mount(
>  	/* Initialize the precomputed transaction reservations values */
>  	xfs_trans_init(mp);
> 
> -	if (xi->ddev == 0)	/* maxtrres, we have no device so leave now */
> +	if (xi->data.dev == 0)	/* maxtrres, we have no device so leave now */
>  		return mp;
> 
>  	/* device size checks must pass unless we're a debugger. */
> diff --git a/libxfs/topology.c b/libxfs/topology.c
> index d6791c0f6..06013d429 100644
> --- a/libxfs/topology.c
> +++ b/libxfs/topology.c
> @@ -299,34 +299,34 @@ get_topology(
>  	 * to try to obtain the underlying filesystem's requirements
>  	 * for direct IO; we'll set our sector size to that if possible.
>  	 */
> -	if (xi->disfile ||
> -	    (!stat(xi->dname, &statbuf) && S_ISREG(statbuf.st_mode))) {
> +	if (xi->data.isfile ||
> +	    (!stat(xi->data.name, &statbuf) && S_ISREG(statbuf.st_mode))) {
>  		int fd;
>  		int flags = O_RDONLY;
>  		long long dummy;
> 
>  		/* with xi->disfile we may not have the file yet! */
> -		if (xi->disfile)
> +		if (xi->data.isfile)
>  			flags |= O_CREAT;
> 
> -		fd = open(xi->dname, flags, 0666);
> +		fd = open(xi->data.name, flags, 0666);
>  		if (fd >= 0) {
> -			platform_findsizes(xi->dname, fd, &dummy,
> +			platform_findsizes(xi->data.name, fd, &dummy,
>  					&ft->lsectorsize);
>  			close(fd);
>  			ft->psectorsize = ft->lsectorsize;
>  		} else
>  			ft->psectorsize = ft->lsectorsize = BBSIZE;
>  	} else {
> -		blkid_get_topology(xi->dname, &ft->dsunit, &ft->dswidth,
> +		blkid_get_topology(xi->data.name, &ft->dsunit, &ft->dswidth,
>  				   &ft->lsectorsize, &ft->psectorsize,
>  				   force_overwrite);
>  	}
> 
> -	if (xi->rtname && !xi->risfile) {
> +	if (xi->rt.name && !xi->rt.isfile) {
>  		int sunit, lsectorsize, psectorsize;
> 
> -		blkid_get_topology(xi->rtname, &sunit, &ft->rtswidth,
> +		blkid_get_topology(xi->rt.name, &sunit, &ft->rtswidth,
>  				   &lsectorsize, &psectorsize, force_overwrite);
>  	}
>  }
> diff --git a/logprint/logprint.c b/logprint/logprint.c
> index 5349e7838..7c69cdcc7 100644
> --- a/logprint/logprint.c
> +++ b/logprint/logprint.c
> @@ -64,9 +64,9 @@ logstat(
>  	 * filesystem. We need this to get the length of the
>  	 * log. Otherwise we end up seeking forever. -- mkp
>  	 */
> -	if ((fd = open(x.dname, O_RDONLY)) == -1) {
> +	if ((fd = open(x.data.name, O_RDONLY)) == -1) {
>  		fprintf(stderr, _("    Can't open device %s: %s\n"),
> -			x.dname, strerror(errno));
> +			x.data.name, strerror(errno));
>  		exit(1);
>  	}
>  	lseek(fd, 0, SEEK_SET);
> @@ -76,7 +76,7 @@ logstat(
>  	}
>  	close (fd);
> 
> -	if (!x.disfile) {
> +	if (!x.data.isfile) {
>  		struct xfs_sb	*sb = &mp->m_sb;
> 
>  		/*
> @@ -88,7 +88,7 @@ logstat(
> 
>  		xlog_init(mp, log);
> 
> -		if (!x.logname && sb->sb_logstart == 0) {
> +		if (!x.log.name && sb->sb_logstart == 0) {
>  			fprintf(stderr, _("    external log device not specified\n\n"));
>  			usage();
>  			/*NOTREACHED*/
> @@ -96,7 +96,7 @@ logstat(
>  	} else {
>  		struct stat	s;
> 
> -		stat(x.dname, &s);
> +		stat(x.data.name, &s);
> 
>  		log->l_logBBsize = s.st_size >> 9;
>  		log->l_logBBstart = 0;
> @@ -105,15 +105,15 @@ logstat(
>  		log->l_mp = mp;
>  	}
> 
> -	if (x.logname && *x.logname) {    /* External log */
> -		if ((fd = open(x.logname, O_RDONLY)) == -1) {
> +	if (x.log.name && *x.log.name) {    /* External log */
> +		if ((fd = open(x.log.name, O_RDONLY)) == -1) {
>  			fprintf(stderr, _("Can't open file %s: %s\n"),
> -				x.logname, strerror(errno));
> +				x.log.name, strerror(errno));
>  			exit(1);
>  		}
>  		close(fd);
>  	} else {                            /* Internal log */
> -		x.logdev = x.ddev;
> +		x.log.dev = x.data.dev;
>  	}
> 
>  	return 0;
> @@ -165,11 +165,11 @@ main(int argc, char **argv)
>  				break;
>  			case 'f':
>  				print_skip_uuid++;
> -				x.disfile = 1;
> +				x.data.isfile = 1;
>  				break;
>  			case 'l':
> -				x.logname = optarg;
> -				x.lisfile = 1;
> +				x.log.name = optarg;
> +				x.log.isfile = 1;
>  				break;
>  			case 'i':
>  				print_inode++;
> @@ -203,9 +203,9 @@ main(int argc, char **argv)
>  	if (argc - optind != 1)
>  		usage();
> 
> -	x.dname = argv[optind];
> +	x.data.name = argv[optind];
> 
> -	if (x.dname == NULL)
> +	if (x.data.name == NULL)
>  		usage();
> 
>  	x.flags = LIBXFS_ISINACTIVE;
> @@ -216,20 +216,20 @@ main(int argc, char **argv)
>  	libxfs_buftarg_init(&mount, &x);
>  	logstat(&mount, &log);
> 
> -	logfd = (x.logfd < 0) ? x.dfd : x.logfd;
> +	logfd = (x.log.fd < 0) ? x.data.fd : x.log.fd;
> 
> -	printf(_("    data device: 0x%llx\n"), (unsigned long long)x.ddev);
> +	printf(_("    data device: 0x%llx\n"), (unsigned long long)x.data.dev);
> 
> -	if (x.logname) {
> -		printf(_("    log file: \"%s\" "), x.logname);
> +	if (x.log.name) {
> +		printf(_("    log file: \"%s\" "), x.log.name);
>  	} else {
> -		printf(_("    log device: 0x%llx "), (unsigned long long)x.logdev);
> +		printf(_("    log device: 0x%llx "), (unsigned long long)x.log.dev);
>  	}
> 
>  	printf(_("daddr: %lld length: %lld\n\n"),
>  		(long long)log.l_logBBstart, (long long)log.l_logBBsize);
> 
> -	ASSERT(log.l_logBBsize <= INT_MAX);
> +	ASSERT(x.log.size <= INT_MAX);
> 
>  	switch (print_operation) {
>  	case OP_PRINT:
> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
> index 01c6ce33b..fcbf54132 100644
> --- a/mkfs/xfs_mkfs.c
> +++ b/mkfs/xfs_mkfs.c
> @@ -1092,37 +1092,35 @@ invalid_cfgfile_opt(
> 
>  static void
>  check_device_type(
> -	const char	*name,
> -	int		*isfile,
> -	bool		no_size,
> -	bool		no_name,
> -	int		*create,
> -	const char	*optname)
> +	struct libxfs_dev	*dev,
> +	bool			no_size,
> +	bool			dry_run,
> +	const char		*optname)
>  {
>  	struct stat statbuf;
> 
> -	if (*isfile && (no_size || no_name)) {
> +	if (dev->isfile && (no_size || !dev->name)) {
>  		fprintf(stderr,
>  	_("if -%s file then -%s name and -%s size are required\n"),
>  			optname, optname, optname);
>  		usage();
>  	}
> 
> -	if (!name) {
> +	if (!dev->name) {
>  		fprintf(stderr, _("No device name specified\n"));
>  		usage();
>  	}
> 
> -	if (stat(name, &statbuf)) {
> -		if (errno == ENOENT && *isfile) {
> -			if (create)
> -				*create = 1;
> +	if (stat(dev->name, &statbuf)) {
> +		if (errno == ENOENT && dev->isfile) {
> +			if (!dry_run)
> +				dev->create = 1;
>  			return;
>  		}
> 
>  		fprintf(stderr,
>  	_("Error accessing specified device %s: %s\n"),
> -				name, strerror(errno));
> +				dev->name, strerror(errno));
>  		usage();
>  		return;
>  	}
> @@ -1133,18 +1131,18 @@ check_device_type(
>  	 * this case to trigger that behaviour.
>  	 */
>  	if (S_ISREG(statbuf.st_mode)) {
> -		if (!*isfile)
> -			*isfile = 1;
> -		else if (create)
> -			*create = 1;
> +		if (!dev->isfile)
> +			dev->isfile = 1;
> +		else if (!dry_run)
> +			dev->create = 1;
>  		return;
>  	}
> 
>  	if (S_ISBLK(statbuf.st_mode)) {
> -		if (*isfile) {
> +		if (dev->isfile) {
>  			fprintf(stderr,
>  	_("specified \"-%s file\" on a block device %s\n"),
> -				optname, name);
> +				optname, dev->name);
>  			usage();
>  		}
>  		return;
> @@ -1152,7 +1150,7 @@ check_device_type(
> 
>  	fprintf(stderr,
>  	_("specified device %s not a file or block device\n"),
> -		name);
> +		dev->name);
>  	usage();
>  }
> 
> @@ -1258,7 +1256,7 @@ zero_old_xfs_structures(
>  	/*
>  	 * We open regular files with O_TRUNC|O_CREAT. Nothing to do here...
>  	 */
> -	if (xi->disfile && xi->dcreat)
> +	if (xi->data.isfile && xi->data.create)
>  		return;
> 
>  	/*
> @@ -1279,9 +1277,9 @@ zero_old_xfs_structures(
>  	 * return zero bytes. It's not a failure we need to warn about in this
>  	 * case.
>  	 */
> -	off = pread(xi->dfd, buf, new_sb->sb_sectsize, 0);
> +	off = pread(xi->data.fd, buf, new_sb->sb_sectsize, 0);
>  	if (off != new_sb->sb_sectsize) {
> -		if (!xi->disfile)
> +		if (!xi->data.isfile)
>  			fprintf(stderr,
>  	_("error reading existing superblock: %s\n"),
>  				strerror(errno));
> @@ -1316,7 +1314,7 @@ zero_old_xfs_structures(
>  	off = 0;
>  	for (i = 1; i < sb.sb_agcount; i++)  {
>  		off += sb.sb_agblocks;
> -		if (pwrite(xi->dfd, buf, new_sb->sb_sectsize,
> +		if (pwrite(xi->data.fd, buf, new_sb->sb_sectsize,
>  					off << sb.sb_blocklog) == -1)
>  			break;
>  	}
> @@ -1561,10 +1559,10 @@ data_opts_parser(
>  		cli->agsize = getstr(value, opts, subopt);
>  		break;
>  	case D_FILE:
> -		cli->xi->disfile = getnum(value, opts, subopt);
> +		cli->xi->data.isfile = getnum(value, opts, subopt);
>  		break;
>  	case D_NAME:
> -		cli->xi->dname = getstr(value, opts, subopt);
> +		cli->xi->data.name = getstr(value, opts, subopt);
>  		break;
>  	case D_SIZE:
>  		cli->dsize = getstr(value, opts, subopt);
> @@ -1673,7 +1671,7 @@ log_opts_parser(
>  		cli->logagno = getnum(value, opts, subopt);
>  		break;
>  	case L_FILE:
> -		cli->xi->lisfile = getnum(value, opts, subopt);
> +		cli->xi->log.isfile = getnum(value, opts, subopt);
>  		break;
>  	case L_INTERNAL:
>  		cli->loginternal = getnum(value, opts, subopt);
> @@ -1686,7 +1684,7 @@ log_opts_parser(
>  		break;
>  	case L_NAME:
>  	case L_DEV:
> -		cli->xi->logname = getstr(value, opts, subopt);
> +		cli->xi->log.name = getstr(value, opts, subopt);
>  		cli->loginternal = 0;
>  		break;
>  	case L_VERSION:
> @@ -1819,11 +1817,11 @@ rtdev_opts_parser(
>  		cli->rtextsize = getstr(value, opts, subopt);
>  		break;
>  	case R_FILE:
> -		cli->xi->risfile = getnum(value, opts, subopt);
> +		cli->xi->rt.isfile = getnum(value, opts, subopt);
>  		break;
>  	case R_NAME:
>  	case R_DEV:
> -		cli->xi->rtname = getstr(value, opts, subopt);
> +		cli->xi->rt.name = getstr(value, opts, subopt);
>  		break;
>  	case R_SIZE:
>  		cli->rtsize = getstr(value, opts, subopt);
> @@ -1962,24 +1960,18 @@ validate_sectorsize(
>  	 * Before anything else, verify that we are correctly operating on
>  	 * files or block devices and set the control parameters correctly.
>  	 */
> -	check_device_type(cli->xi->dname, &cli->xi->disfile,
> -			  !cli->dsize, !cli->xi->dname,
> -			  dry_run ? NULL : &cli->xi->dcreat, "d");
> +	check_device_type(&cli->xi->data, !cli->dsize, dry_run, "d");
>  	if (!cli->loginternal)
> -		check_device_type(cli->xi->logname, &cli->xi->lisfile,
> -				  !cli->logsize, !cli->xi->logname,
> -				  dry_run ? NULL : &cli->xi->lcreat, "l");
> -	if (cli->xi->rtname)
> -		check_device_type(cli->xi->rtname, &cli->xi->risfile,
> -				  !cli->rtsize, !cli->xi->rtname,
> -				  dry_run ? NULL : &cli->xi->rcreat, "r");
> +		check_device_type(&cli->xi->log, !cli->logsize, dry_run, "l");
> +	if (cli->xi->rt.name)
> +		check_device_type(&cli->xi->rt, !cli->rtsize, dry_run, "r");
> 
>  	/*
>  	 * Explicitly disable direct IO for image files so we don't error out on
>  	 * sector size mismatches between the new filesystem and the underlying
>  	 * host filesystem.
>  	 */
> -	if (cli->xi->disfile || cli->xi->lisfile || cli->xi->risfile)
> +	if (cli->xi->data.isfile || cli->xi->log.isfile || cli->xi->rt.isfile)
>  		cli->xi->flags &= ~LIBXFS_DIRECT;
> 
>  	memset(ft, 0, sizeof(*ft));
> @@ -2294,7 +2286,7 @@ _("inode btree counters not supported without finobt support\n"));
>  		cli->sb_feat.inobtcnt = false;
>  	}
> 
> -	if (cli->xi->rtname) {
> +	if (cli->xi->rt.name) {
>  		if (cli->sb_feat.reflink && cli_opt_set(&mopts, M_REFLINK)) {
>  			fprintf(stderr,
>  _("reflink not supported with realtime devices\n"));
> @@ -2461,8 +2453,8 @@ validate_rtextsize(
>  		 */
>  		uint64_t	rswidth;
> 
> -		if (!cfg->sb_feat.nortalign && !cli->xi->risfile &&
> -		    !(!cli->rtsize && cli->xi->disfile))
> +		if (!cfg->sb_feat.nortalign && !cli->xi->rt.isfile &&
> +		    !(!cli->rtsize && cli->xi->data.isfile))
>  			rswidth = ft->rtswidth;
>  		else
>  			rswidth = 0;
> @@ -2840,7 +2832,7 @@ open_devices(
>  	xi->setblksize = cfg->sectorsize;
>  	if (!libxfs_init(xi))
>  		usage();
> -	if (!xi->ddev) {
> +	if (!xi->data.dev) {
>  		fprintf(stderr, _("no device name given in argument list\n"));
>  		usage();
>  	}
> @@ -2856,9 +2848,9 @@ open_devices(
>  	 * multiple of the sector size, or 1024, whichever is larger.
>  	 */
>  	sector_mask = (uint64_t)-1 << (max(cfg->sectorlog, 10) - BBSHIFT);
> -	xi->dsize &= sector_mask;
> -	xi->rtsize &= sector_mask;
> -	xi->logBBsize &= (uint64_t)-1 << (max(cfg->lsectorlog, 10) - BBSHIFT);
> +	xi->data.size &= sector_mask;
> +	xi->rt.size &= sector_mask;
> +	xi->log.size &= (uint64_t)-1 << (max(cfg->lsectorlog, 10) - BBSHIFT);
>  }
> 
>  static void
> @@ -2870,12 +2862,12 @@ discard_devices(
>  	 * This function has to be called after libxfs has been initialized.
>  	 */
> 
> -	if (!xi->disfile)
> -		discard_blocks(xi->dfd, xi->dsize, quiet);
> -	if (xi->rtdev && !xi->risfile)
> -		discard_blocks(xi->rtfd, xi->rtsize, quiet);
> -	if (xi->logdev && xi->logdev != xi->ddev && !xi->lisfile)
> -		discard_blocks(xi->logfd, xi->logBBsize, quiet);
> +	if (!xi->data.isfile)
> +		discard_blocks(xi->data.fd, xi->data.size, quiet);
> +	if (xi->rt.dev && !xi->rt.isfile)
> +		discard_blocks(xi->rt.fd, xi->rt.size, quiet);
> +	if (xi->log.dev && xi->log.dev != xi->data.dev && !xi->log.isfile)
> +		discard_blocks(xi->log.fd, xi->log.size, quiet);
>  }
> 
>  static void
> @@ -2885,29 +2877,29 @@ validate_datadev(
>  {
>  	struct libxfs_init	*xi = cli->xi;
> 
> -	if (!xi->dsize) {
> +	if (!xi->data.size) {
>  		/*
>  		 * if the device is a file, we can't validate the size here.
>  		 * Instead, the file will be truncated to the correct length
>  		 * later on. if it's not a file, we've got a dud device.
>  		 */
> -		if (!xi->disfile) {
> +		if (!xi->data.isfile) {
>  			fprintf(stderr, _("can't get size of data subvolume\n"));
>  			usage();
>  		}
>  		ASSERT(cfg->dblocks);
>  	} else if (cfg->dblocks) {
>  		/* check the size fits into the underlying device */
> -		if (cfg->dblocks > DTOBT(xi->dsize, cfg->blocklog)) {
> +		if (cfg->dblocks > DTOBT(xi->data.size, cfg->blocklog)) {
>  			fprintf(stderr,
>  _("size %s specified for data subvolume is too large, maximum is %lld blocks\n"),
>  				cli->dsize,
> -				(long long)DTOBT(xi->dsize, cfg->blocklog));
> +				(long long)DTOBT(xi->data.size, cfg->blocklog));
>  			usage();
>  		}
>  	} else {
>  		/* no user size, so use the full block device */
> -		cfg->dblocks = DTOBT(xi->dsize, cfg->blocklog);
> +		cfg->dblocks = DTOBT(xi->data.size, cfg->blocklog);
>  	}
> 
>  	if (cfg->dblocks < XFS_MIN_DATA_BLOCKS(cfg)) {
> @@ -2917,11 +2909,11 @@ _("size %lld of data subvolume is too small, minimum %lld blocks\n"),
>  		usage();
>  	}
> 
> -	if (xi->dbsize > cfg->sectorsize) {
> +	if (xi->data.bsize > cfg->sectorsize) {
>  		fprintf(stderr, _(
>  "Warning: the data subvolume sector size %u is less than the sector size \n\
>  reported by the device (%u).\n"),
> -			cfg->sectorsize, xi->dbsize);
> +			cfg->sectorsize, xi->data.bsize);
>  	}
>  }
> 
> @@ -2961,31 +2953,31 @@ _("log size %lld too large for internal log\n"),
>  	}
> 
>  	/* External/log subvolume checks */
> -	if (!*xi->logname || !xi->logdev) {
> +	if (!*xi->log.name || !xi->log.dev) {
>  		fprintf(stderr, _("no log subvolume or external log.\n"));
>  		usage();
>  	}
> 
>  	if (!cfg->logblocks) {
> -		if (xi->logBBsize == 0) {
> +		if (xi->log.size == 0) {
>  			fprintf(stderr,
>  _("unable to get size of the log subvolume.\n"));
>  			usage();
>  		}
> -		cfg->logblocks = DTOBT(xi->logBBsize, cfg->blocklog);
> -	} else if (cfg->logblocks > DTOBT(xi->logBBsize, cfg->blocklog)) {
> +		cfg->logblocks = DTOBT(xi->log.size, cfg->blocklog);
> +	} else if (cfg->logblocks > DTOBT(xi->log.size, cfg->blocklog)) {
>  		fprintf(stderr,
>  _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"),
>  			cli->logsize,
> -			(long long)DTOBT(xi->logBBsize, cfg->blocklog));
> +			(long long)DTOBT(xi->log.size, cfg->blocklog));
>  		usage();
>  	}
> 
> -	if (xi->lbsize > cfg->lsectorsize) {
> +	if (xi->log.bsize > cfg->lsectorsize) {
>  		fprintf(stderr, _(
>  "Warning: the log subvolume sector size %u is less than the sector size\n\
>  reported by the device (%u).\n"),
> -			cfg->lsectorsize, xi->lbsize);
> +			cfg->lsectorsize, xi->log.bsize);
>  	}
>  }
> 
> @@ -2996,7 +2988,7 @@ validate_rtdev(
>  {
>  	struct libxfs_init	*xi = cli->xi;
> 
> -	if (!xi->rtdev) {
> +	if (!xi->rt.dev) {
>  		if (cli->rtsize) {
>  			fprintf(stderr,
>  _("size specified for non-existent rt subvolume\n"));
> @@ -3008,28 +3000,28 @@ _("size specified for non-existent rt subvolume\n"));
>  		cfg->rtbmblocks = 0;
>  		return;
>  	}
> -	if (!xi->rtsize) {
> +	if (!xi->rt.size) {
>  		fprintf(stderr, _("Invalid zero length rt subvolume found\n"));
>  		usage();
>  	}
> 
>  	if (cli->rtsize) {
> -		if (cfg->rtblocks > DTOBT(xi->rtsize, cfg->blocklog)) {
> +		if (cfg->rtblocks > DTOBT(xi->rt.size, cfg->blocklog)) {
>  			fprintf(stderr,
>  _("size %s specified for rt subvolume is too large, maxi->um is %lld blocks\n"),
>  				cli->rtsize,
> -				(long long)DTOBT(xi->rtsize, cfg->blocklog));
> +				(long long)DTOBT(xi->rt.size, cfg->blocklog));
>  			usage();
>  		}
> -		if (xi->rtbsize > cfg->sectorsize) {
> +		if (xi->rt.bsize > cfg->sectorsize) {
>  			fprintf(stderr, _(
>  "Warning: the realtime subvolume sector size %u is less than the sector size\n\
>  reported by the device (%u).\n"),
> -				cfg->sectorsize, xi->rtbsize);
> +				cfg->sectorsize, xi->rt.bsize);
>  		}
>  	} else {
>  		/* grab volume size */
> -		cfg->rtblocks = DTOBT(xi->rtsize, cfg->blocklog);
> +		cfg->rtblocks = DTOBT(xi->rt.size, cfg->blocklog);
>  	}
> 
>  	cfg->rtextents = cfg->rtblocks / cfg->rtextblocks;
> @@ -3770,9 +3762,9 @@ prepare_devices(
>  	 * needed so that the reads for the end of the device in the mount code
>  	 * will succeed.
>  	 */
> -	if (xi->disfile &&
> -	    xi->dsize * xi->dbsize < cfg->dblocks * cfg->blocksize) {
> -		if (ftruncate(xi->dfd, cfg->dblocks * cfg->blocksize) < 0) {
> +	if (xi->data.isfile &&
> +	    xi->data.size * xi->data.bsize < cfg->dblocks * cfg->blocksize) {
> +		if (ftruncate(xi->data.fd, cfg->dblocks * cfg->blocksize) < 0) {
>  			fprintf(stderr,
>  				_("%s: Growing the data section failed\n"),
>  				progname);
> @@ -3780,7 +3772,7 @@ prepare_devices(
>  		}
> 
>  		/* update size to be able to whack blocks correctly */
> -		xi->dsize = BTOBB(cfg->dblocks * cfg->blocksize);
> +		xi->data.size = BTOBB(cfg->dblocks * cfg->blocksize);
>  	}
> 
>  	/*
> @@ -3788,7 +3780,7 @@ prepare_devices(
>  	 * the end of the device.  (MD sb is ~64k from the end, take out a wider
>  	 * swath to be sure)
>  	 */
> -	buf = alloc_write_buf(mp->m_ddev_targp, (xi->dsize - whack_blks),
> +	buf = alloc_write_buf(mp->m_ddev_targp, (xi->data.size - whack_blks),
>  			whack_blks);
>  	memset(buf->b_addr, 0, WHACK_SIZE);
>  	libxfs_buf_mark_dirty(buf);
> @@ -4183,7 +4175,7 @@ main(
>  		fprintf(stderr, _("extra arguments\n"));
>  		usage();
>  	} else if (argc - optind == 1) {
> -		xi.dname = getstr(argv[optind], &dopts, D_NAME);
> +		xi.data.name = getstr(argv[optind], &dopts, D_NAME);
>  	}
> 
>  	/*
> @@ -4236,7 +4228,7 @@ main(
>  	 * Open and validate the device configurations
>  	 */
>  	open_devices(&cfg, &xi);
> -	validate_overwrite(xi.dname, force_overwrite);
> +	validate_overwrite(xi.data.name, force_overwrite);
>  	validate_datadev(&cfg, &cli);
>  	validate_logdev(&cfg, &cli);
>  	validate_rtdev(&cfg, &cli);
> @@ -4280,7 +4272,7 @@ main(
>  		struct xfs_fsop_geom	geo;
> 
>  		libxfs_fs_geometry(mp, &geo, XFS_FS_GEOM_MAX_STRUCT_VER);
> -		xfs_report_geom(&geo, xi.dname, xi.logname, xi.rtname);
> +		xfs_report_geom(&geo, xi.data.name, xi.log.name, xi.rt.name);
>  		if (dry_run)
>  			exit(0);
>  	}
> diff --git a/repair/init.c b/repair/init.c
> index 2dc439a22..3788d00f2 100644
> --- a/repair/init.c
> +++ b/repair/init.c
> @@ -56,19 +56,19 @@ xfs_init(struct libxfs_init *args)
>  {
>  	memset(args, 0, sizeof(*args));
> 
> -	args->dname = fs_name;
> -	args->disfile = isa_file;
> +	args->data.name = fs_name;
> +	args->data.isfile = isa_file;
> 
>  	if (log_spec)  {	/* External log specified */
> -		args->logname = log_name;
> -		args->lisfile = (isa_file?1:0);
> +		args->log.name = log_name;
> +		args->log.isfile = isa_file;
>  		/* XXX assume data file also means log file */
>  		/* REVISIT: Need to do fs sanity / log validity checking */
>  	}
> 
>  	if (rt_spec)  {	/* RT device specified */
> -		args->rtname = rt_name;
> -		args->risfile = (isa_file?1:0);
> +		args->rt.name = rt_name;
> +		args->rt.isfile = isa_file;
>  		/* XXX assume data file also means rt file */
>  	}
> 
> diff --git a/repair/phase2.c b/repair/phase2.c
> index 48263e161..063748179 100644
> --- a/repair/phase2.c
> +++ b/repair/phase2.c
> @@ -341,11 +341,11 @@ phase2(
> 
>  	/* Check whether this fs has internal or external log */
>  	if (mp->m_sb.sb_logstart == 0) {
> -		if (!x.logname)
> +		if (!x.log.name)
>  			do_error(_("This filesystem has an external log.  "
>  				   "Specify log device with the -l option.\n"));
> 
> -		do_log(_("Phase 2 - using external log on %s\n"), x.logname);
> +		do_log(_("Phase 2 - using external log on %s\n"), x.log.name);
>  	} else
>  		do_log(_("Phase 2 - using internal log\n"));
> 
> diff --git a/repair/sb.c b/repair/sb.c
> index b823ba3a9..dedac53af 100644
> --- a/repair/sb.c
> +++ b/repair/sb.c
> @@ -125,13 +125,11 @@ __find_secondary_sb(
>  		/*
>  		 * read disk 1 MByte at a time.
>  		 */
> -		if (lseek(x.dfd, off, SEEK_SET) != off)  {
> +		if (lseek(x.data.fd, off, SEEK_SET) != off)
>  			done = 1;
> -		}
> 
> -		if (!done && (bsize = read(x.dfd, sb, BSIZE)) <= 0)  {
> +		if (!done && (bsize = read(x.data.fd, sb, BSIZE)) <= 0)
>  			done = 1;
> -		}
> 
>  		do_warn(".");
> 
> @@ -192,7 +190,7 @@ guess_default_geometry(
>  	 */
>  	blocklog = 12;
>  	multidisk = ft.dswidth | ft.dsunit;
> -	dblocks = x->dsize >> (blocklog - BBSHIFT);
> +	dblocks = x->data.size >> (blocklog - BBSHIFT);
>  	calc_default_ag_geometry(blocklog, dblocks, multidisk,
>  				 agsize, agcount);
> 
> @@ -533,7 +531,7 @@ write_primary_sb(xfs_sb_t *sbp, int size)
>  	}
>  	memset(buf, 0, size);
> 
> -	if (lseek(x.dfd, 0LL, SEEK_SET) != 0LL) {
> +	if (lseek(x.data.fd, 0LL, SEEK_SET) != 0LL) {
>  		free(buf);
>  		do_error(_("couldn't seek to offset 0 in filesystem\n"));
>  	}
> @@ -543,7 +541,7 @@ write_primary_sb(xfs_sb_t *sbp, int size)
>  	if (xfs_sb_version_hascrc(sbp))
>  		xfs_update_cksum((char *)buf, size, XFS_SB_CRC_OFF);
> 
> -	if (write(x.dfd, buf, size) != size) {
> +	if (write(x.data.fd, buf, size) != size) {
>  		free(buf);
>  		do_error(_("primary superblock write failed!\n"));
>  	}
> @@ -572,7 +570,7 @@ get_sb(xfs_sb_t *sbp, xfs_off_t off, int size, xfs_agnumber_t agno)
> 
>  	/* try and read it first */
> 
> -	if (lseek(x.dfd, off, SEEK_SET) != off)  {
> +	if (lseek(x.data.fd, off, SEEK_SET) != off)  {
>  		do_warn(
>  	_("error reading superblock %u -- seek to offset %" PRId64 " failed\n"),
>  			agno, off);
> @@ -580,7 +578,7 @@ get_sb(xfs_sb_t *sbp, xfs_off_t off, int size, xfs_agnumber_t agno)
>  		return(XR_EOF);
>  	}
> 
> -	if ((rval = read(x.dfd, buf, size)) != size)  {
> +	if ((rval = read(x.data.fd, buf, size)) != size)  {
>  		error = errno;
>  		do_warn(
>  	_("superblock read failed, offset %" PRId64 ", size %d, ag %u, rval %d\n"),
> diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c
> index cdbdbe855..ba9d28330 100644
> --- a/repair/xfs_repair.c
> +++ b/repair/xfs_repair.c
> @@ -728,7 +728,7 @@ check_fs_vs_host_sectsize(
>  	long	old_flags;
>  	struct xfs_fsop_geom	geom = { 0 };
> 
> -	ret = -xfrog_geometry(x.dfd, &geom);
> +	ret = -xfrog_geometry(x.data.fd, &geom);
>  	if (ret) {
>  		do_log(_("Cannot get host filesystem geometry.\n"
>  	"Repair may fail if there is a sector size mismatch between\n"
> @@ -737,8 +737,8 @@ check_fs_vs_host_sectsize(
>  	}
> 
>  	if (sb->sb_sectsize < geom.sectsize) {
> -		old_flags = fcntl(x.dfd, F_GETFL, 0);
> -		if (fcntl(x.dfd, F_SETFL, old_flags & ~O_DIRECT) < 0) {
> +		old_flags = fcntl(x.data.fd, F_GETFL, 0);
> +		if (fcntl(x.data.fd, F_SETFL, old_flags & ~O_DIRECT) < 0) {
>  			do_warn(_(
>  	"Sector size on host filesystem larger than image sector size.\n"
>  	"Cannot turn off direct IO, so exiting.\n"));
> @@ -986,7 +986,7 @@ main(int argc, char **argv)
>  	if (!isa_file) {
>  		struct stat	statbuf;
> 
> -		if (fstat(x.dfd, &statbuf) < 0)
> +		if (fstat(x.data.fd, &statbuf) < 0)
>  			do_warn(_("%s: couldn't stat \"%s\"\n"),
>  				progname, fs_name);
>  		else if (S_ISREG(statbuf.st_mode))
> --
> 2.39.2
> 
> 




[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux