Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 3 Oct 2018 00:40:27 +0000
From:      Rick Macklem <rmacklem@uoguelph.ca>
To:        "freebsd-current@FreeBSD.org" <freebsd-current@FreeBSD.org>
Cc:        Josh Paetzel <josh@tcbug.org>
Subject:   which way to update export_args structure?
Message-ID:  <YTOPR0101MB182021549F8CF8277477A4C5DDE90@YTOPR0101MB1820.CANPRD01.PROD.OUTLOOK.COM>

next in thread | raw e-mail | index | archive | help
Hi,

I am working on updating "struct export_args" to fix/add a few things.
One of these is that "ex_flags" is an int, but the flags are defined in mou=
nt.h
as MNT_xx bits that now exceed 32bits (mnt_flag is now uint64_t).
For now, this doesn't break anything, since the flags used by ex_flags are
all defined in the low order 32bits but...it seems like this should be addr=
essed
by a new version of "struct export_args".

I have two versions of the updated structure:
A)
struct export_args {
	uint64_t ex_flags;		/* export related flags */
	uid_t	ex_root;		/* mapping for root uid */
	struct	xucred ex_anon;		/* mapping for anonymous user */
	struct	sockaddr *ex_addr;	/* net address to which exported */
	u_char	ex_addrlen;		/* and the net address length */
	struct	sockaddr *ex_mask;	/* mask of valid bits in saddr */
	u_char	ex_masklen;		/* and the smask length */
	char	*ex_indexfile;		/* index file for WebNFS URLs */
	int	ex_numsecflavors;	/* security flavor count */
	int	ex_secflavors[MAXSECFLAVORS]; /* list of security flavors */
	int32_t	ex_fsid;		/* mnt_stat.f_fsid.val[0] if */
					/* MNT_EXPORTFSID set in ex_flags64 */
	gid_t	*ex_suppgroups;		/* Supplemental groups if */
					/* ex_anon.cr_ngroups > XU_NGROUPS */
};
B)
struct export_args {
	int	ex_flags;		/* export related flags */
	uid_t	ex_root;		/* mapping for root uid */
	struct	xucred ex_anon;		/* mapping for anonymous user */
	struct	sockaddr *ex_addr;	/* net address to which exported */
	u_char	ex_addrlen;		/* and the net address length */
	struct	sockaddr *ex_mask;	/* mask of valid bits in saddr */
	u_char	ex_masklen;		/* and the smask length */
	char	*ex_indexfile;		/* index file for WebNFS URLs */
	int	ex_numsecflavors;	/* security flavor count */
	int	ex_secflavors[MAXSECFLAVORS]; /* list of security flavors */
	uint64_t ex_flagshighbits;	/* High order bits of mnt_flag */
	int32_t	ex_fsid;		/* mnt_stat.f_fsid.val[0] if */
					/* MNT_EXPORTFSID set in ex_flags64 */
	gid_t	*ex_suppgroups;		/* Supplemental groups if */
					/* ex_anon.cr_ngroups > XU_NGROUPS */
};

A) does the obvious thing. Unfortunately, this changes the vfs KABI
(specifically the function vfs_oexport_conv()) such that a file system
module compiled with an unpatched mount.h could crash a patched system.
As such, I think it couldn't be MFC'd and would be stuck in head/current
until FreeBSD13 (or FreeBSD14 if 13 gets skipped over;-).

B) doesn't change any fields, but adds a second ex_flagshighbits for the hi=
gh
order bit. Since it only adds fields where none of those bits are used afte=
r
the exports are processed by vfs_export() and, as such, will not break
the VFS KABI, since vfs_domount_update() differentiates which version
of export_args is being used.
As such, I believe this version can be MFC'd. However, it does seem confusi=
ng
to have the two ex_flags fields for the low and high 32bits.

So, which do you think it preferable? rick
ps: Josh Paetzel has volunteered to do the mountd.c changes and I have a ke=
rne
      patch that I'll put up on phabricator once Josh has been able to test=
 it.




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?YTOPR0101MB182021549F8CF8277477A4C5DDE90>