diff mbox series

[14/23] libxfs: making passing flags to libxfs_init less confusing

Message ID 20231211163742.837427-15-hch@lst.de (mailing list archive)
State Accepted
Headers show
Series [01/23] libxfs: remove the unused icache_flags member from struct libxfs_xinit | expand

Commit Message

Christoph Hellwig Dec. 11, 2023, 4:37 p.m. UTC
The libxfs_xinit stucture has four different ways to pass flags to
libxfs_init:

 - the isreadonly argument despite it's name contains various LIBXFS_
   flags that go beyond just the readonly flag
 - the isdirect flag contains a single LIBXFS_ flag from the same name
 - the usebuflock is an integer used as bool
 - the bcache_flags member is used to pass flags directly to cache_init()
   for the buffer cache

While there is good arguments for keeping the last one separate, all the
others are rather confusing.  Consolidate them into a single flags member
using flags in the LIBXFS_* namespace.
---
 copy/xfs_copy.c     |  4 +---
 db/crc.c            |  2 +-
 db/fuzz.c           |  2 +-
 db/init.c           |  6 +++---
 db/sb.c             |  6 +++---
 db/write.c          |  2 +-
 growfs/xfs_growfs.c |  2 +-
 include/libxfs.h    | 26 ++++++++++++++++++--------
 libxfs/init.c       | 17 +++++++----------
 logprint/logprint.c |  2 +-
 mkfs/xfs_mkfs.c     |  5 ++---
 repair/init.c       | 15 ++++++++-------
 12 files changed, 47 insertions(+), 42 deletions(-)

Comments

Carlos Maiolino Dec. 18, 2023, 12:30 p.m. UTC | #1
On Mon, Dec 11, 2023 at 05:37:33PM +0100, Christoph Hellwig wrote:
> The libxfs_xinit stucture has four different ways to pass flags to
> libxfs_init:
> 
>  - the isreadonly argument despite it's name contains various LIBXFS_
>    flags that go beyond just the readonly flag
>  - the isdirect flag contains a single LIBXFS_ flag from the same name
>  - the usebuflock is an integer used as bool
>  - the bcache_flags member is used to pass flags directly to cache_init()
>    for the buffer cache
> 
> While there is good arguments for keeping the last one separate, all the
> others are rather confusing.  Consolidate them into a single flags member
> using flags in the LIBXFS_* namespace.

Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>

> ---
>  copy/xfs_copy.c     |  4 +---
>  db/crc.c            |  2 +-
>  db/fuzz.c           |  2 +-
>  db/init.c           |  6 +++---
>  db/sb.c             |  6 +++---
>  db/write.c          |  2 +-
>  growfs/xfs_growfs.c |  2 +-
>  include/libxfs.h    | 26 ++++++++++++++++++--------
>  libxfs/init.c       | 17 +++++++----------
>  logprint/logprint.c |  2 +-
>  mkfs/xfs_mkfs.c     |  5 ++---
>  repair/init.c       | 15 ++++++++-------
>  12 files changed, 47 insertions(+), 42 deletions(-)
> 
> diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c
> index 2f98ae8fb..bd7c6d334 100644
> --- a/copy/xfs_copy.c
> +++ b/copy/xfs_copy.c
> @@ -715,9 +715,7 @@ main(int argc, char **argv)
>  	/* prepare the libxfs_init structure */
> 
>  	memset(&xargs, 0, sizeof(xargs));
> -	xargs.isdirect = LIBXFS_DIRECT;
> -	xargs.isreadonly = LIBXFS_ISREADONLY;
> -
> +	xargs.flags = LIBXFS_ISREADONLY | LIBXFS_DIRECT;
>  	xargs.dname = source_name;
>  	xargs.disfile = source_is_file;
> 
> diff --git a/db/crc.c b/db/crc.c
> index 1c73f9803..9043b3f48 100644
> --- a/db/crc.c
> +++ b/db/crc.c
> @@ -98,7 +98,7 @@ crc_f(
>  	}
> 
>  	if ((invalidate || recalculate) &&
> -	    ((x.isreadonly & LIBXFS_ISREADONLY) || !expert_mode)) {
> +	    ((x.flags & LIBXFS_ISREADONLY) || !expert_mode)) {
>  		dbprintf(_("%s not in expert mode, writing disabled\n"),
>  			progname);
>  		return 0;
> diff --git a/db/fuzz.c b/db/fuzz.c
> index ba64bad7a..fafbca3e3 100644
> --- a/db/fuzz.c
> +++ b/db/fuzz.c
> @@ -77,7 +77,7 @@ fuzz_f(
>  	struct xfs_buf_ops local_ops;
>  	const struct xfs_buf_ops *stashed_ops = NULL;
> 
> -	if (x.isreadonly & LIBXFS_ISREADONLY) {
> +	if (x.flags & LIBXFS_ISREADONLY) {
>  		dbprintf(_("%s started in read only mode, fuzzing disabled\n"),
>  			progname);
>  		return 0;
> diff --git a/db/init.c b/db/init.c
> index 8bd8e83f6..f240d0f66 100644
> --- a/db/init.c
> +++ b/db/init.c
> @@ -67,13 +67,13 @@ init(
>  			force = 1;
>  			break;
>  		case 'i':
> -			x.isreadonly = (LIBXFS_ISREADONLY|LIBXFS_ISINACTIVE);
> +			x.flags = LIBXFS_ISREADONLY | LIBXFS_ISINACTIVE;
>  			break;
>  		case 'p':
>  			progname = optarg;
>  			break;
>  		case 'r':
> -			x.isreadonly = LIBXFS_ISREADONLY;
> +			x.flags = LIBXFS_ISREADONLY;
>  			break;
>  		case 'l':
>  			x.logname = optarg;
> @@ -92,7 +92,7 @@ init(
>  		usage();
> 
>  	x.dname = argv[optind];
> -	x.isdirect = LIBXFS_DIRECT;
> +	x.flags |= LIBXFS_DIRECT;
> 
>  	x.bcache_flags = CACHE_MISCOMPARE_PURGE;
>  	if (!libxfs_init(&x)) {
> diff --git a/db/sb.c b/db/sb.c
> index 30709e84e..b2aa4a626 100644
> --- a/db/sb.c
> +++ b/db/sb.c
> @@ -374,7 +374,7 @@ uuid_f(
> 
>  	if (argc == 2) {	/* WRITE UUID */
> 
> -		if ((x.isreadonly & LIBXFS_ISREADONLY) || !expert_mode) {
> +		if ((x.flags & LIBXFS_ISREADONLY) || !expert_mode) {
>  			dbprintf(_("%s: not in expert mode, writing disabled\n"),
>  				progname);
>  			return 0;
> @@ -542,7 +542,7 @@ label_f(
> 
>  	if (argc == 2) {	/* WRITE LABEL */
> 
> -		if ((x.isreadonly & LIBXFS_ISREADONLY) || !expert_mode) {
> +		if ((x.flags & LIBXFS_ISREADONLY) || !expert_mode) {
>  			dbprintf(_("%s: not in expert mode, writing disabled\n"),
>  				progname);
>  			return 0;
> @@ -727,7 +727,7 @@ version_f(
> 
>  	if (argc == 2) {	/* WRITE VERSION */
> 
> -		if ((x.isreadonly & LIBXFS_ISREADONLY) || !expert_mode) {
> +		if ((x.flags & LIBXFS_ISREADONLY) || !expert_mode) {
>  			dbprintf(_("%s: not in expert mode, writing disabled\n"),
>  				progname);
>  			return 0;
> diff --git a/db/write.c b/db/write.c
> index 6c67e839a..96dea7051 100644
> --- a/db/write.c
> +++ b/db/write.c
> @@ -88,7 +88,7 @@ write_f(
>  	struct xfs_buf_ops local_ops;
>  	const struct xfs_buf_ops *stashed_ops = NULL;
> 
> -	if (x.isreadonly & LIBXFS_ISREADONLY) {
> +	if (x.flags & LIBXFS_ISREADONLY) {
>  		dbprintf(_("%s started in read only mode, writing disabled\n"),
>  			progname);
>  		return 0;
> diff --git a/growfs/xfs_growfs.c b/growfs/xfs_growfs.c
> index 802e01154..05aea3496 100644
> --- a/growfs/xfs_growfs.c
> +++ b/growfs/xfs_growfs.c
> @@ -186,7 +186,7 @@ main(int argc, char **argv)
>  	xi.dname = datadev;
>  	xi.logname = logdev;
>  	xi.rtname = rtdev;
> -	xi.isreadonly = LIBXFS_ISREADONLY;
> +	xi.flags = LIBXFS_ISREADONLY;
> 
>  	if (!libxfs_init(&xi))
>  		usage();
> diff --git a/include/libxfs.h b/include/libxfs.h
> index 6da8fd1c8..9ee3dd979 100644
> --- a/include/libxfs.h
> +++ b/include/libxfs.h
> @@ -97,8 +97,7 @@ struct libxfs_init {
>  	char            *dname;         /* pathname of data "subvolume" */
>  	char            *logname;       /* pathname of log "subvolume" */
>  	char            *rtname;        /* pathname of realtime "subvolume" */
> -	int             isreadonly;     /* filesystem is only read in applic */
> -	int             isdirect;       /* we can attempt to use direct I/O */
> +	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 */
> @@ -106,7 +105,6 @@ struct libxfs_init {
>  	int             risfile;        /* realtime "subvolume" is a reg file */
>  	int             rcreat;         /* try to create realtime subvolume */
>  	int		setblksize;	/* attempt to set device blksize */
> -	int		usebuflock;	/* lock xfs_buf's - for MT usage */
>  				/* output results */
>  	dev_t           ddev;           /* device for data subvolume */
>  	dev_t           logdev;         /* device for log subvolume */
> @@ -125,11 +123,23 @@ struct libxfs_init {
>  	int		bcache_flags;	/* cache init flags */
>  };
> 
> -#define LIBXFS_ISREADONLY	0x0002	/* disallow all mounted filesystems */
> -#define LIBXFS_ISINACTIVE	0x0004	/* allow mounted only if mounted ro */
> -#define LIBXFS_DANGEROUSLY	0x0008	/* repairing a device mounted ro    */
> -#define LIBXFS_EXCLUSIVELY	0x0010	/* disallow other accesses (O_EXCL) */
> -#define LIBXFS_DIRECT		0x0020	/* can use direct I/O, not buffered */
> +/* disallow all mounted filesystems: */
> +#define LIBXFS_ISREADONLY	(1U << 0)
> +
> +/* allow mounted only if mounted ro: */
> +#define LIBXFS_ISINACTIVE	(1U << 1)
> +
> +/* repairing a device mounted ro: */
> +#define LIBXFS_DANGEROUSLY	(1U << 2)
> +
> +/* disallow other accesses (O_EXCL): */
> +#define LIBXFS_EXCLUSIVELY	(1U << 3)
> +
> +/* can use direct I/O, not buffered: */
> +#define LIBXFS_DIRECT		(1U << 4)
> +
> +/* lock xfs_buf's - for MT usage */
> +#define LIBXFS_USEBUFLOCK	(1U << 5)
> 
>  extern char	*progname;
>  extern xfs_lsn_t libxfs_max_lsn;
> diff --git a/libxfs/init.c b/libxfs/init.c
> index 86b810bfe..de1e588f1 100644
> --- a/libxfs/init.c
> +++ b/libxfs/init.c
> @@ -296,7 +296,6 @@ libxfs_init(struct libxfs_init *a)
>  	char		*dname;
>  	char		*logname;
>  	char		*rtname;
> -	int		flags;
> 
>  	dname = a->dname;
>  	logname = a->logname;
> @@ -306,33 +305,31 @@ libxfs_init(struct libxfs_init *a)
>  	a->dsize = a->lbsize = a->rtbsize = 0;
>  	a->dbsize = a->logBBsize = a->rtsize = 0;
> 
> -	flags = (a->isreadonly | a->isdirect);
> -
>  	rcu_init();
>  	rcu_register_thread();
>  	radix_tree_init();
> 
>  	if (dname) {
> -		if (!a->disfile && !check_open(dname, flags))
> +		if (!a->disfile && !check_open(dname, a->flags))
>  			goto done;
> -		a->ddev = libxfs_device_open(dname, a->dcreat, flags,
> +		a->ddev = libxfs_device_open(dname, a->dcreat, a->flags,
>  				a->setblksize);
>  		a->dfd = libxfs_device_to_fd(a->ddev);
>  		platform_findsizes(dname, a->dfd, &a->dsize, &a->dbsize);
>  	}
>  	if (logname) {
> -		if (!a->lisfile && !check_open(logname, flags))
> +		if (!a->lisfile && !check_open(logname, a->flags))
>  			goto done;
> -		a->logdev = libxfs_device_open(logname, a->lcreat, flags,
> +		a->logdev = libxfs_device_open(logname, a->lcreat, a->flags,
>  				a->setblksize);
>  		a->logfd = libxfs_device_to_fd(a->logdev);
>  		platform_findsizes(logname, a->logfd, &a->logBBsize,
>  				&a->lbsize);
>  	}
>  	if (rtname) {
> -		if (a->risfile && !check_open(rtname, flags))
> +		if (a->risfile && !check_open(rtname, a->flags))
>  			goto done;
> -		a->rtdev = libxfs_device_open(rtname, a->rcreat, flags,
> +		a->rtdev = libxfs_device_open(rtname, a->rcreat, a->flags,
>  				a->setblksize);
>  		a->rtfd = libxfs_device_to_fd(a->rtdev);
>  		platform_findsizes(dname, a->rtfd, &a->rtsize, &a->rtbsize);
> @@ -357,7 +354,7 @@ libxfs_init(struct libxfs_init *a)
>  		libxfs_bhash_size = LIBXFS_BHASHSIZE(sbp);
>  	libxfs_bcache = cache_init(a->bcache_flags, libxfs_bhash_size,
>  				   &libxfs_bcache_operations);
> -	use_xfs_buf_lock = a->usebuflock;
> +	use_xfs_buf_lock = a->flags & LIBXFS_USEBUFLOCK;
>  	xfs_dir_startup();
>  	init_caches();
>  	return 1;
> diff --git a/logprint/logprint.c b/logprint/logprint.c
> index c2976333d..5349e7838 100644
> --- a/logprint/logprint.c
> +++ b/logprint/logprint.c
> @@ -208,7 +208,7 @@ main(int argc, char **argv)
>  	if (x.dname == NULL)
>  		usage();
> 
> -	x.isreadonly = LIBXFS_ISINACTIVE;
> +	x.flags = LIBXFS_ISINACTIVE;
>  	printf(_("xfs_logprint:\n"));
>  	if (!libxfs_init(&x))
>  		exit(1);
> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
> index 50b0a7e19..dd5f4c8b6 100644
> --- a/mkfs/xfs_mkfs.c
> +++ b/mkfs/xfs_mkfs.c
> @@ -1984,7 +1984,7 @@ validate_sectorsize(
>  	 * host filesystem.
>  	 */
>  	if (cli->xi->disfile || cli->xi->lisfile || cli->xi->risfile)
> -		cli->xi->isdirect = 0;
> +		cli->xi->flags &= ~LIBXFS_DIRECT;
> 
>  	memset(ft, 0, sizeof(*ft));
>  	get_topology(cli->xi, ft, force_overwrite);
> @@ -4057,8 +4057,7 @@ main(
>  	int			worst_freelist = 0;
> 
>  	struct libxfs_init	xi = {
> -		.isdirect = LIBXFS_DIRECT,
> -		.isreadonly = LIBXFS_EXCLUSIVELY,
> +		.flags = LIBXFS_EXCLUSIVELY | LIBXFS_DIRECT,
>  	};
>  	struct xfs_mount	mbuf = {};
>  	struct xfs_mount	*mp = &mbuf;
> diff --git a/repair/init.c b/repair/init.c
> index 1c562fb34..2dc439a22 100644
> --- a/repair/init.c
> +++ b/repair/init.c
> @@ -72,21 +72,22 @@ xfs_init(struct libxfs_init *args)
>  		/* XXX assume data file also means rt file */
>  	}
> 
> -	args->usebuflock = do_prefetch;
>  	args->setblksize = 0;
> -	args->isdirect = LIBXFS_DIRECT;
>  	if (no_modify)
> -		args->isreadonly = (LIBXFS_ISREADONLY | LIBXFS_ISINACTIVE);
> +		args->flags = LIBXFS_ISREADONLY | LIBXFS_ISINACTIVE;
>  	else if (dangerously)
> -		args->isreadonly = (LIBXFS_ISINACTIVE | LIBXFS_DANGEROUSLY);
> +		args->flags = LIBXFS_ISINACTIVE | LIBXFS_DANGEROUSLY;
>  	else
> -		args->isreadonly = LIBXFS_EXCLUSIVELY;
> +		args->flags = LIBXFS_EXCLUSIVELY;
> +	args->flags |= LIBXFS_DIRECT;
> +	if (do_prefetch)
> +		args->flags |= LIBXFS_USEBUFLOCK;
> 
>  	if (!libxfs_init(args)) {
>  		/* would -d be an option? */
>  		if (!no_modify && !dangerously) {
> -			args->isreadonly = (LIBXFS_ISINACTIVE |
> -					    LIBXFS_DANGEROUSLY);
> +			args->flags &= ~LIBXFS_EXCLUSIVELY;
> +			args->flags |= LIBXFS_ISINACTIVE | LIBXFS_DANGEROUSLY;
>  			if (libxfs_init(args))
>  				fprintf(stderr,
>  _("Unmount or use the dangerous (-d) option to repair a read-only mounted filesystem\n"));
> --
> 2.39.2
>
Christoph Hellwig Dec. 18, 2023, 2:36 p.m. UTC | #2
Btw, please add my mising:

Signed-off-by: Christoph Hellwig <hch@lst.de>

here.
diff mbox series

Patch

diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c
index 2f98ae8fb..bd7c6d334 100644
--- a/copy/xfs_copy.c
+++ b/copy/xfs_copy.c
@@ -715,9 +715,7 @@  main(int argc, char **argv)
 	/* prepare the libxfs_init structure */
 
 	memset(&xargs, 0, sizeof(xargs));
-	xargs.isdirect = LIBXFS_DIRECT;
-	xargs.isreadonly = LIBXFS_ISREADONLY;
-
+	xargs.flags = LIBXFS_ISREADONLY | LIBXFS_DIRECT;
 	xargs.dname = source_name;
 	xargs.disfile = source_is_file;
 
diff --git a/db/crc.c b/db/crc.c
index 1c73f9803..9043b3f48 100644
--- a/db/crc.c
+++ b/db/crc.c
@@ -98,7 +98,7 @@  crc_f(
 	}
 
 	if ((invalidate || recalculate) &&
-	    ((x.isreadonly & LIBXFS_ISREADONLY) || !expert_mode)) {
+	    ((x.flags & LIBXFS_ISREADONLY) || !expert_mode)) {
 		dbprintf(_("%s not in expert mode, writing disabled\n"),
 			progname);
 		return 0;
diff --git a/db/fuzz.c b/db/fuzz.c
index ba64bad7a..fafbca3e3 100644
--- a/db/fuzz.c
+++ b/db/fuzz.c
@@ -77,7 +77,7 @@  fuzz_f(
 	struct xfs_buf_ops local_ops;
 	const struct xfs_buf_ops *stashed_ops = NULL;
 
-	if (x.isreadonly & LIBXFS_ISREADONLY) {
+	if (x.flags & LIBXFS_ISREADONLY) {
 		dbprintf(_("%s started in read only mode, fuzzing disabled\n"),
 			progname);
 		return 0;
diff --git a/db/init.c b/db/init.c
index 8bd8e83f6..f240d0f66 100644
--- a/db/init.c
+++ b/db/init.c
@@ -67,13 +67,13 @@  init(
 			force = 1;
 			break;
 		case 'i':
-			x.isreadonly = (LIBXFS_ISREADONLY|LIBXFS_ISINACTIVE);
+			x.flags = LIBXFS_ISREADONLY | LIBXFS_ISINACTIVE;
 			break;
 		case 'p':
 			progname = optarg;
 			break;
 		case 'r':
-			x.isreadonly = LIBXFS_ISREADONLY;
+			x.flags = LIBXFS_ISREADONLY;
 			break;
 		case 'l':
 			x.logname = optarg;
@@ -92,7 +92,7 @@  init(
 		usage();
 
 	x.dname = argv[optind];
-	x.isdirect = LIBXFS_DIRECT;
+	x.flags |= LIBXFS_DIRECT;
 
 	x.bcache_flags = CACHE_MISCOMPARE_PURGE;
 	if (!libxfs_init(&x)) {
diff --git a/db/sb.c b/db/sb.c
index 30709e84e..b2aa4a626 100644
--- a/db/sb.c
+++ b/db/sb.c
@@ -374,7 +374,7 @@  uuid_f(
 
 	if (argc == 2) {	/* WRITE UUID */
 
-		if ((x.isreadonly & LIBXFS_ISREADONLY) || !expert_mode) {
+		if ((x.flags & LIBXFS_ISREADONLY) || !expert_mode) {
 			dbprintf(_("%s: not in expert mode, writing disabled\n"),
 				progname);
 			return 0;
@@ -542,7 +542,7 @@  label_f(
 
 	if (argc == 2) {	/* WRITE LABEL */
 
-		if ((x.isreadonly & LIBXFS_ISREADONLY) || !expert_mode) {
+		if ((x.flags & LIBXFS_ISREADONLY) || !expert_mode) {
 			dbprintf(_("%s: not in expert mode, writing disabled\n"),
 				progname);
 			return 0;
@@ -727,7 +727,7 @@  version_f(
 
 	if (argc == 2) {	/* WRITE VERSION */
 
-		if ((x.isreadonly & LIBXFS_ISREADONLY) || !expert_mode) {
+		if ((x.flags & LIBXFS_ISREADONLY) || !expert_mode) {
 			dbprintf(_("%s: not in expert mode, writing disabled\n"),
 				progname);
 			return 0;
diff --git a/db/write.c b/db/write.c
index 6c67e839a..96dea7051 100644
--- a/db/write.c
+++ b/db/write.c
@@ -88,7 +88,7 @@  write_f(
 	struct xfs_buf_ops local_ops;
 	const struct xfs_buf_ops *stashed_ops = NULL;
 
-	if (x.isreadonly & LIBXFS_ISREADONLY) {
+	if (x.flags & LIBXFS_ISREADONLY) {
 		dbprintf(_("%s started in read only mode, writing disabled\n"),
 			progname);
 		return 0;
diff --git a/growfs/xfs_growfs.c b/growfs/xfs_growfs.c
index 802e01154..05aea3496 100644
--- a/growfs/xfs_growfs.c
+++ b/growfs/xfs_growfs.c
@@ -186,7 +186,7 @@  main(int argc, char **argv)
 	xi.dname = datadev;
 	xi.logname = logdev;
 	xi.rtname = rtdev;
-	xi.isreadonly = LIBXFS_ISREADONLY;
+	xi.flags = LIBXFS_ISREADONLY;
 
 	if (!libxfs_init(&xi))
 		usage();
diff --git a/include/libxfs.h b/include/libxfs.h
index 6da8fd1c8..9ee3dd979 100644
--- a/include/libxfs.h
+++ b/include/libxfs.h
@@ -97,8 +97,7 @@  struct libxfs_init {
 	char            *dname;         /* pathname of data "subvolume" */
 	char            *logname;       /* pathname of log "subvolume" */
 	char            *rtname;        /* pathname of realtime "subvolume" */
-	int             isreadonly;     /* filesystem is only read in applic */
-	int             isdirect;       /* we can attempt to use direct I/O */
+	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 */
@@ -106,7 +105,6 @@  struct libxfs_init {
 	int             risfile;        /* realtime "subvolume" is a reg file */
 	int             rcreat;         /* try to create realtime subvolume */
 	int		setblksize;	/* attempt to set device blksize */
-	int		usebuflock;	/* lock xfs_buf's - for MT usage */
 				/* output results */
 	dev_t           ddev;           /* device for data subvolume */
 	dev_t           logdev;         /* device for log subvolume */
@@ -125,11 +123,23 @@  struct libxfs_init {
 	int		bcache_flags;	/* cache init flags */
 };
 
-#define LIBXFS_ISREADONLY	0x0002	/* disallow all mounted filesystems */
-#define LIBXFS_ISINACTIVE	0x0004	/* allow mounted only if mounted ro */
-#define LIBXFS_DANGEROUSLY	0x0008	/* repairing a device mounted ro    */
-#define LIBXFS_EXCLUSIVELY	0x0010	/* disallow other accesses (O_EXCL) */
-#define LIBXFS_DIRECT		0x0020	/* can use direct I/O, not buffered */
+/* disallow all mounted filesystems: */
+#define LIBXFS_ISREADONLY	(1U << 0)
+
+/* allow mounted only if mounted ro: */
+#define LIBXFS_ISINACTIVE	(1U << 1)
+
+/* repairing a device mounted ro: */
+#define LIBXFS_DANGEROUSLY	(1U << 2)
+
+/* disallow other accesses (O_EXCL): */
+#define LIBXFS_EXCLUSIVELY	(1U << 3)
+
+/* can use direct I/O, not buffered: */
+#define LIBXFS_DIRECT		(1U << 4)
+
+/* lock xfs_buf's - for MT usage */
+#define LIBXFS_USEBUFLOCK	(1U << 5)
 
 extern char	*progname;
 extern xfs_lsn_t libxfs_max_lsn;
diff --git a/libxfs/init.c b/libxfs/init.c
index 86b810bfe..de1e588f1 100644
--- a/libxfs/init.c
+++ b/libxfs/init.c
@@ -296,7 +296,6 @@  libxfs_init(struct libxfs_init *a)
 	char		*dname;
 	char		*logname;
 	char		*rtname;
-	int		flags;
 
 	dname = a->dname;
 	logname = a->logname;
@@ -306,33 +305,31 @@  libxfs_init(struct libxfs_init *a)
 	a->dsize = a->lbsize = a->rtbsize = 0;
 	a->dbsize = a->logBBsize = a->rtsize = 0;
 
-	flags = (a->isreadonly | a->isdirect);
-
 	rcu_init();
 	rcu_register_thread();
 	radix_tree_init();
 
 	if (dname) {
-		if (!a->disfile && !check_open(dname, flags))
+		if (!a->disfile && !check_open(dname, a->flags))
 			goto done;
-		a->ddev = libxfs_device_open(dname, a->dcreat, flags,
+		a->ddev = libxfs_device_open(dname, a->dcreat, a->flags,
 				a->setblksize);
 		a->dfd = libxfs_device_to_fd(a->ddev);
 		platform_findsizes(dname, a->dfd, &a->dsize, &a->dbsize);
 	}
 	if (logname) {
-		if (!a->lisfile && !check_open(logname, flags))
+		if (!a->lisfile && !check_open(logname, a->flags))
 			goto done;
-		a->logdev = libxfs_device_open(logname, a->lcreat, flags,
+		a->logdev = libxfs_device_open(logname, a->lcreat, a->flags,
 				a->setblksize);
 		a->logfd = libxfs_device_to_fd(a->logdev);
 		platform_findsizes(logname, a->logfd, &a->logBBsize,
 				&a->lbsize);
 	}
 	if (rtname) {
-		if (a->risfile && !check_open(rtname, flags))
+		if (a->risfile && !check_open(rtname, a->flags))
 			goto done;
-		a->rtdev = libxfs_device_open(rtname, a->rcreat, flags,
+		a->rtdev = libxfs_device_open(rtname, a->rcreat, a->flags,
 				a->setblksize);
 		a->rtfd = libxfs_device_to_fd(a->rtdev);
 		platform_findsizes(dname, a->rtfd, &a->rtsize, &a->rtbsize);
@@ -357,7 +354,7 @@  libxfs_init(struct libxfs_init *a)
 		libxfs_bhash_size = LIBXFS_BHASHSIZE(sbp);
 	libxfs_bcache = cache_init(a->bcache_flags, libxfs_bhash_size,
 				   &libxfs_bcache_operations);
-	use_xfs_buf_lock = a->usebuflock;
+	use_xfs_buf_lock = a->flags & LIBXFS_USEBUFLOCK;
 	xfs_dir_startup();
 	init_caches();
 	return 1;
diff --git a/logprint/logprint.c b/logprint/logprint.c
index c2976333d..5349e7838 100644
--- a/logprint/logprint.c
+++ b/logprint/logprint.c
@@ -208,7 +208,7 @@  main(int argc, char **argv)
 	if (x.dname == NULL)
 		usage();
 
-	x.isreadonly = LIBXFS_ISINACTIVE;
+	x.flags = LIBXFS_ISINACTIVE;
 	printf(_("xfs_logprint:\n"));
 	if (!libxfs_init(&x))
 		exit(1);
diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
index 50b0a7e19..dd5f4c8b6 100644
--- a/mkfs/xfs_mkfs.c
+++ b/mkfs/xfs_mkfs.c
@@ -1984,7 +1984,7 @@  validate_sectorsize(
 	 * host filesystem.
 	 */
 	if (cli->xi->disfile || cli->xi->lisfile || cli->xi->risfile)
-		cli->xi->isdirect = 0;
+		cli->xi->flags &= ~LIBXFS_DIRECT;
 
 	memset(ft, 0, sizeof(*ft));
 	get_topology(cli->xi, ft, force_overwrite);
@@ -4057,8 +4057,7 @@  main(
 	int			worst_freelist = 0;
 
 	struct libxfs_init	xi = {
-		.isdirect = LIBXFS_DIRECT,
-		.isreadonly = LIBXFS_EXCLUSIVELY,
+		.flags = LIBXFS_EXCLUSIVELY | LIBXFS_DIRECT,
 	};
 	struct xfs_mount	mbuf = {};
 	struct xfs_mount	*mp = &mbuf;
diff --git a/repair/init.c b/repair/init.c
index 1c562fb34..2dc439a22 100644
--- a/repair/init.c
+++ b/repair/init.c
@@ -72,21 +72,22 @@  xfs_init(struct libxfs_init *args)
 		/* XXX assume data file also means rt file */
 	}
 
-	args->usebuflock = do_prefetch;
 	args->setblksize = 0;
-	args->isdirect = LIBXFS_DIRECT;
 	if (no_modify)
-		args->isreadonly = (LIBXFS_ISREADONLY | LIBXFS_ISINACTIVE);
+		args->flags = LIBXFS_ISREADONLY | LIBXFS_ISINACTIVE;
 	else if (dangerously)
-		args->isreadonly = (LIBXFS_ISINACTIVE | LIBXFS_DANGEROUSLY);
+		args->flags = LIBXFS_ISINACTIVE | LIBXFS_DANGEROUSLY;
 	else
-		args->isreadonly = LIBXFS_EXCLUSIVELY;
+		args->flags = LIBXFS_EXCLUSIVELY;
+	args->flags |= LIBXFS_DIRECT;
+	if (do_prefetch)
+		args->flags |= LIBXFS_USEBUFLOCK;
 
 	if (!libxfs_init(args)) {
 		/* would -d be an option? */
 		if (!no_modify && !dangerously) {
-			args->isreadonly = (LIBXFS_ISINACTIVE |
-					    LIBXFS_DANGEROUSLY);
+			args->flags &= ~LIBXFS_EXCLUSIVELY;
+			args->flags |= LIBXFS_ISINACTIVE | LIBXFS_DANGEROUSLY;
 			if (libxfs_init(args))
 				fprintf(stderr,
 _("Unmount or use the dangerous (-d) option to repair a read-only mounted filesystem\n"));