The r184588 changed the layout of struct export_args, causing an ABI
breakage for old mount(2) syscall, since most struct <filesystem>_args embed export_args. The mount(2) is supposed to provide ABI compatibility for pre-nmount mount(8) binaries, so restore ABI to pre-r184588. Requested and reviewed by: bde MFC after: 2 weeks
This commit is contained in:
parent
21bf062e7e
commit
d0cc54f3b4
@ -40,7 +40,7 @@
|
|||||||
*/
|
*/
|
||||||
struct iso_args {
|
struct iso_args {
|
||||||
char *fspec; /* block special device to mount */
|
char *fspec; /* block special device to mount */
|
||||||
struct export_args export; /* network export info */
|
struct oexport_args export; /* network export info */
|
||||||
int flags; /* mounting flags, see below */
|
int flags; /* mounting flags, see below */
|
||||||
int ssector; /* starting sector, 0 for 1st session */
|
int ssector; /* starting sector, 0 for 1st session */
|
||||||
char *cs_disk; /* disk charset for Joliet cs conversion */
|
char *cs_disk; /* disk charset for Joliet cs conversion */
|
||||||
|
@ -98,14 +98,16 @@ static int
|
|||||||
cd9660_cmount(struct mntarg *ma, void *data, int flags)
|
cd9660_cmount(struct mntarg *ma, void *data, int flags)
|
||||||
{
|
{
|
||||||
struct iso_args args;
|
struct iso_args args;
|
||||||
|
struct export_args exp;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
error = copyin(data, &args, sizeof args);
|
error = copyin(data, &args, sizeof args);
|
||||||
if (error)
|
if (error)
|
||||||
return (error);
|
return (error);
|
||||||
|
vfs_oexport_conv(&args.export, &exp);
|
||||||
|
|
||||||
ma = mount_argsu(ma, "from", args.fspec, MAXPATHLEN);
|
ma = mount_argsu(ma, "from", args.fspec, MAXPATHLEN);
|
||||||
ma = mount_arg(ma, "export", &args.export, sizeof args.export);
|
ma = mount_arg(ma, "export", &exp, sizeof(exp));
|
||||||
ma = mount_argsu(ma, "cs_disk", args.cs_disk, 64);
|
ma = mount_argsu(ma, "cs_disk", args.cs_disk, 64);
|
||||||
ma = mount_argsu(ma, "cs_local", args.cs_local, 64);
|
ma = mount_argsu(ma, "cs_local", args.cs_local, 64);
|
||||||
ma = mount_argf(ma, "ssector", "%u", args.ssector);
|
ma = mount_argf(ma, "ssector", "%u", args.ssector);
|
||||||
|
@ -76,14 +76,16 @@ hpfs_cmount (
|
|||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
struct hpfs_args args;
|
struct hpfs_args args;
|
||||||
|
struct export_args exp;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
error = copyin(data, (caddr_t)&args, sizeof (struct hpfs_args));
|
error = copyin(data, (caddr_t)&args, sizeof (struct hpfs_args));
|
||||||
if (error)
|
if (error)
|
||||||
return (error);
|
return (error);
|
||||||
|
vfs_oexport_conv(&args.export, &exp);
|
||||||
|
|
||||||
ma = mount_argsu(ma, "from", args.fspec, MAXPATHLEN);
|
ma = mount_argsu(ma, "from", args.fspec, MAXPATHLEN);
|
||||||
ma = mount_arg(ma, "export", &args.export, sizeof args.export);
|
ma = mount_arg(ma, "export", &exp, sizeof(exp));
|
||||||
ma = mount_argf(ma, "uid", "%d", args.uid);
|
ma = mount_argf(ma, "uid", "%d", args.uid);
|
||||||
ma = mount_argf(ma, "gid", "%d", args.gid);
|
ma = mount_argf(ma, "gid", "%d", args.gid);
|
||||||
ma = mount_argf(ma, "mode", "%d", args.mode);
|
ma = mount_argf(ma, "mode", "%d", args.mode);
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
#define HPFSMNT_TABLES 0x0001
|
#define HPFSMNT_TABLES 0x0001
|
||||||
struct hpfs_args {
|
struct hpfs_args {
|
||||||
char *fspec; /* block special device to mount */
|
char *fspec; /* block special device to mount */
|
||||||
struct export_args export; /* network export information */
|
struct oexport_args export; /* network export information */
|
||||||
uid_t uid; /* uid that owns hpfs files */
|
uid_t uid; /* uid that owns hpfs files */
|
||||||
gid_t gid; /* gid that owns hpfs files */
|
gid_t gid; /* gid that owns hpfs files */
|
||||||
mode_t mode; /* mask to be applied for hpfs perms */
|
mode_t mode; /* mask to be applied for hpfs perms */
|
||||||
|
@ -200,6 +200,7 @@ static int
|
|||||||
msdosfs_cmount(struct mntarg *ma, void *data, int flags)
|
msdosfs_cmount(struct mntarg *ma, void *data, int flags)
|
||||||
{
|
{
|
||||||
struct msdosfs_args args;
|
struct msdosfs_args args;
|
||||||
|
struct export_args exp;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
@ -207,9 +208,10 @@ msdosfs_cmount(struct mntarg *ma, void *data, int flags)
|
|||||||
error = copyin(data, &args, sizeof args);
|
error = copyin(data, &args, sizeof args);
|
||||||
if (error)
|
if (error)
|
||||||
return (error);
|
return (error);
|
||||||
|
vfs_oexport_conv(&args.export, &exp);
|
||||||
|
|
||||||
ma = mount_argsu(ma, "from", args.fspec, MAXPATHLEN);
|
ma = mount_argsu(ma, "from", args.fspec, MAXPATHLEN);
|
||||||
ma = mount_arg(ma, "export", &args.export, sizeof args.export);
|
ma = mount_arg(ma, "export", &exp, sizeof(exp));
|
||||||
ma = mount_argf(ma, "uid", "%d", args.uid);
|
ma = mount_argf(ma, "uid", "%d", args.uid);
|
||||||
ma = mount_argf(ma, "gid", "%d", args.gid);
|
ma = mount_argf(ma, "gid", "%d", args.gid);
|
||||||
ma = mount_argf(ma, "mask", "%d", args.mask);
|
ma = mount_argf(ma, "mask", "%d", args.mask);
|
||||||
|
@ -234,7 +234,7 @@ uint32_t msdosfs_fileno_map(struct mount *, uint64_t);
|
|||||||
*/
|
*/
|
||||||
struct msdosfs_args {
|
struct msdosfs_args {
|
||||||
char *fspec; /* blocks special holding the fs to mount */
|
char *fspec; /* blocks special holding the fs to mount */
|
||||||
struct export_args export; /* network export information */
|
struct oexport_args export; /* network export information */
|
||||||
uid_t uid; /* uid that owns msdosfs files */
|
uid_t uid; /* uid that owns msdosfs files */
|
||||||
gid_t gid; /* gid that owns msdosfs files */
|
gid_t gid; /* gid that owns msdosfs files */
|
||||||
mode_t mask; /* file mask to be applied for msdosfs perms */
|
mode_t mask; /* file mask to be applied for msdosfs perms */
|
||||||
|
@ -119,14 +119,16 @@ ntfs_cmount (
|
|||||||
void *data,
|
void *data,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
int error;
|
|
||||||
struct ntfs_args args;
|
struct ntfs_args args;
|
||||||
|
struct export_args exp;
|
||||||
|
int error;
|
||||||
|
|
||||||
error = copyin(data, (caddr_t)&args, sizeof args);
|
error = copyin(data, &args, sizeof(args));
|
||||||
if (error)
|
if (error)
|
||||||
return (error);
|
return (error);
|
||||||
|
vfs_oexport_conv(&args.export, &exp);
|
||||||
ma = mount_argsu(ma, "from", args.fspec, MAXPATHLEN);
|
ma = mount_argsu(ma, "from", args.fspec, MAXPATHLEN);
|
||||||
ma = mount_arg(ma, "export", &args.export, sizeof args.export);
|
ma = mount_arg(ma, "export", &exp, sizeof(exp));
|
||||||
ma = mount_argf(ma, "uid", "%d", args.uid);
|
ma = mount_argf(ma, "uid", "%d", args.uid);
|
||||||
ma = mount_argf(ma, "gid", "%d", args.gid);
|
ma = mount_argf(ma, "gid", "%d", args.gid);
|
||||||
ma = mount_argf(ma, "mode", "%d", args.mode);
|
ma = mount_argf(ma, "mode", "%d", args.mode);
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
struct ntfs_args {
|
struct ntfs_args {
|
||||||
char *fspec; /* block special device to mount */
|
char *fspec; /* block special device to mount */
|
||||||
struct export_args export; /* network export information */
|
struct oexport_args export; /* network export information */
|
||||||
uid_t uid; /* uid that owns ntfs files */
|
uid_t uid; /* uid that owns ntfs files */
|
||||||
gid_t gid; /* gid that owns ntfs files */
|
gid_t gid; /* gid that owns ntfs files */
|
||||||
mode_t mode; /* mask to be applied for ntfs perms */
|
mode_t mode; /* mask to be applied for ntfs perms */
|
||||||
|
@ -39,7 +39,7 @@ struct reiserfs_mount {
|
|||||||
/* Arguments to mount ReiserFS filesystems. */
|
/* Arguments to mount ReiserFS filesystems. */
|
||||||
struct reiserfs_args {
|
struct reiserfs_args {
|
||||||
char *fspec; /* blocks special holding the fs to mount */
|
char *fspec; /* blocks special holding the fs to mount */
|
||||||
struct export_args export; /* network export information */
|
struct oexport_args export; /* network export information */
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* !defined _GNU_REISERFS_REISERFS_MOUNT_H */
|
#endif /* !defined _GNU_REISERFS_REISERFS_MOUNT_H */
|
||||||
|
@ -52,14 +52,16 @@ static int
|
|||||||
reiserfs_cmount(struct mntarg *ma, void *data, int flags)
|
reiserfs_cmount(struct mntarg *ma, void *data, int flags)
|
||||||
{
|
{
|
||||||
struct reiserfs_args args;
|
struct reiserfs_args args;
|
||||||
|
struct export_args exp;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
error = copyin(data, &args, sizeof(args));
|
error = copyin(data, &args, sizeof(args));
|
||||||
if (error)
|
if (error)
|
||||||
return (error);
|
return (error);
|
||||||
|
vfs_oexport_conv(&args.export, &exp);
|
||||||
|
|
||||||
ma = mount_argsu(ma, "from", args.fspec, MAXPATHLEN);
|
ma = mount_argsu(ma, "from", args.fspec, MAXPATHLEN);
|
||||||
ma = mount_arg(ma, "export", &args.export, sizeof args.export);
|
ma = mount_arg(ma, "export", &exp, sizeof(exp));
|
||||||
|
|
||||||
error = kernel_mount(ma, flags);
|
error = kernel_mount(ma, flags);
|
||||||
|
|
||||||
|
@ -1960,3 +1960,11 @@ kernel_vmount(int flags, ...)
|
|||||||
error = kernel_mount(ma, flags);
|
error = kernel_mount(ma, flags);
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vfs_oexport_conv(const struct oexport_args *oexp, struct export_args *exp)
|
||||||
|
{
|
||||||
|
|
||||||
|
bcopy(oexp, exp, sizeof(*oexp));
|
||||||
|
exp->ex_numsecflavors = 0;
|
||||||
|
}
|
||||||
|
@ -741,6 +741,8 @@ int vfs_modevent(module_t, int, void *);
|
|||||||
void vfs_mount_error(struct mount *, const char *, ...);
|
void vfs_mount_error(struct mount *, const char *, ...);
|
||||||
void vfs_mountroot(void); /* mount our root filesystem */
|
void vfs_mountroot(void); /* mount our root filesystem */
|
||||||
void vfs_mountedfrom(struct mount *, const char *from);
|
void vfs_mountedfrom(struct mount *, const char *from);
|
||||||
|
void vfs_oexport_conv(const struct oexport_args *oexp,
|
||||||
|
struct export_args *exp);
|
||||||
void vfs_ref(struct mount *);
|
void vfs_ref(struct mount *);
|
||||||
void vfs_rel(struct mount *);
|
void vfs_rel(struct mount *);
|
||||||
struct mount *vfs_mount_alloc(struct vnode *, struct vfsconf *, const char *,
|
struct mount *vfs_mount_alloc(struct vnode *, struct vfsconf *, const char *,
|
||||||
|
@ -463,6 +463,7 @@ static int
|
|||||||
ffs_cmount(struct mntarg *ma, void *data, int flags)
|
ffs_cmount(struct mntarg *ma, void *data, int flags)
|
||||||
{
|
{
|
||||||
struct ufs_args args;
|
struct ufs_args args;
|
||||||
|
struct export_args exp;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
@ -470,9 +471,10 @@ ffs_cmount(struct mntarg *ma, void *data, int flags)
|
|||||||
error = copyin(data, &args, sizeof args);
|
error = copyin(data, &args, sizeof args);
|
||||||
if (error)
|
if (error)
|
||||||
return (error);
|
return (error);
|
||||||
|
vfs_oexport_conv(&args.export, &exp);
|
||||||
|
|
||||||
ma = mount_argsu(ma, "from", args.fspec, MAXPATHLEN);
|
ma = mount_argsu(ma, "from", args.fspec, MAXPATHLEN);
|
||||||
ma = mount_arg(ma, "export", &args.export, sizeof args.export);
|
ma = mount_arg(ma, "export", &exp, sizeof(exp));
|
||||||
error = kernel_mount(ma, flags);
|
error = kernel_mount(ma, flags);
|
||||||
|
|
||||||
return (error);
|
return (error);
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
*/
|
*/
|
||||||
struct ufs_args {
|
struct ufs_args {
|
||||||
char *fspec; /* block special device to mount */
|
char *fspec; /* block special device to mount */
|
||||||
struct export_args export; /* network export information */
|
struct oexport_args export; /* network export information */
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef _KERNEL
|
#ifdef _KERNEL
|
||||||
|
Loading…
x
Reference in New Issue
Block a user