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 {
|
||||
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 ssector; /* starting sector, 0 for 1st session */
|
||||
char *cs_disk; /* disk charset for Joliet cs conversion */
|
||||
|
@ -98,14 +98,16 @@ static int
|
||||
cd9660_cmount(struct mntarg *ma, void *data, int flags)
|
||||
{
|
||||
struct iso_args args;
|
||||
struct export_args exp;
|
||||
int error;
|
||||
|
||||
error = copyin(data, &args, sizeof args);
|
||||
if (error)
|
||||
return (error);
|
||||
vfs_oexport_conv(&args.export, &exp);
|
||||
|
||||
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_local", args.cs_local, 64);
|
||||
ma = mount_argf(ma, "ssector", "%u", args.ssector);
|
||||
|
@ -76,14 +76,16 @@ hpfs_cmount (
|
||||
int flags)
|
||||
{
|
||||
struct hpfs_args args;
|
||||
struct export_args exp;
|
||||
int error;
|
||||
|
||||
error = copyin(data, (caddr_t)&args, sizeof (struct hpfs_args));
|
||||
if (error)
|
||||
return (error);
|
||||
vfs_oexport_conv(&args.export, &exp);
|
||||
|
||||
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, "gid", "%d", args.gid);
|
||||
ma = mount_argf(ma, "mode", "%d", args.mode);
|
||||
|
@ -29,7 +29,7 @@
|
||||
#define HPFSMNT_TABLES 0x0001
|
||||
struct hpfs_args {
|
||||
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 */
|
||||
gid_t gid; /* gid that owns hpfs files */
|
||||
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)
|
||||
{
|
||||
struct msdosfs_args args;
|
||||
struct export_args exp;
|
||||
int error;
|
||||
|
||||
if (data == NULL)
|
||||
@ -207,9 +208,10 @@ msdosfs_cmount(struct mntarg *ma, void *data, int flags)
|
||||
error = copyin(data, &args, sizeof args);
|
||||
if (error)
|
||||
return (error);
|
||||
vfs_oexport_conv(&args.export, &exp);
|
||||
|
||||
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, "gid", "%d", args.gid);
|
||||
ma = mount_argf(ma, "mask", "%d", args.mask);
|
||||
|
@ -234,7 +234,7 @@ uint32_t msdosfs_fileno_map(struct mount *, uint64_t);
|
||||
*/
|
||||
struct msdosfs_args {
|
||||
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 */
|
||||
gid_t gid; /* gid that owns msdosfs files */
|
||||
mode_t mask; /* file mask to be applied for msdosfs perms */
|
||||
|
@ -119,14 +119,16 @@ ntfs_cmount (
|
||||
void *data,
|
||||
int flags)
|
||||
{
|
||||
int error;
|
||||
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)
|
||||
return (error);
|
||||
vfs_oexport_conv(&args.export, &exp);
|
||||
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, "gid", "%d", args.gid);
|
||||
ma = mount_argf(ma, "mode", "%d", args.mode);
|
||||
|
@ -34,7 +34,7 @@
|
||||
|
||||
struct ntfs_args {
|
||||
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 */
|
||||
gid_t gid; /* gid that owns ntfs files */
|
||||
mode_t mode; /* mask to be applied for ntfs perms */
|
||||
|
@ -39,7 +39,7 @@ struct reiserfs_mount {
|
||||
/* Arguments to mount ReiserFS filesystems. */
|
||||
struct reiserfs_args {
|
||||
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 */
|
||||
|
@ -52,14 +52,16 @@ static int
|
||||
reiserfs_cmount(struct mntarg *ma, void *data, int flags)
|
||||
{
|
||||
struct reiserfs_args args;
|
||||
struct export_args exp;
|
||||
int error;
|
||||
|
||||
error = copyin(data, &args, sizeof(args));
|
||||
if (error)
|
||||
return (error);
|
||||
vfs_oexport_conv(&args.export, &exp);
|
||||
|
||||
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);
|
||||
|
||||
|
@ -1960,3 +1960,11 @@ kernel_vmount(int flags, ...)
|
||||
error = kernel_mount(ma, flags);
|
||||
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_mountroot(void); /* mount our root filesystem */
|
||||
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_rel(struct mount *);
|
||||
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)
|
||||
{
|
||||
struct ufs_args args;
|
||||
struct export_args exp;
|
||||
int error;
|
||||
|
||||
if (data == NULL)
|
||||
@ -470,9 +471,10 @@ ffs_cmount(struct mntarg *ma, void *data, int flags)
|
||||
error = copyin(data, &args, sizeof args);
|
||||
if (error)
|
||||
return (error);
|
||||
vfs_oexport_conv(&args.export, &exp);
|
||||
|
||||
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);
|
||||
|
||||
return (error);
|
||||
|
@ -40,7 +40,7 @@
|
||||
*/
|
||||
struct ufs_args {
|
||||
char *fspec; /* block special device to mount */
|
||||
struct export_args export; /* network export information */
|
||||
struct oexport_args export; /* network export information */
|
||||
};
|
||||
|
||||
#ifdef _KERNEL
|
||||
|
Loading…
Reference in New Issue
Block a user