tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Change do_sys_mount()
Hi,
here is a patch I must have written after fixing the bugs in mount one or
two years ago. It changes do_sys_mount() so that it only takes as argument
the type of the drive instead of its associated vfsops.
It does change the behavior for the compat layers: now that the associated
vfsops is retrieved via mount_get_vfsops(), the MODULE_CLASS_VFS modules
are autoloaded when a compat binary wants to mount something. Curiously, it
hasn't been the case so far.
Tested quickly on amd64. Ok?
Index: kern/vfs_syscalls.c
===================================================================
RCS file: /cvsroot/src/sys/kern/vfs_syscalls.c,v
retrieving revision 1.500
diff -u -r1.500 vfs_syscalls.c
--- kern/vfs_syscalls.c 24 Jul 2015 13:02:52 -0000 1.500
+++ kern/vfs_syscalls.c 21 Oct 2015 10:49:53 -0000
@@ -360,13 +360,20 @@
}
static int
-mount_get_vfsops(const char *fstype, struct vfsops **vfsops)
+mount_get_vfsops(const char *fstype, enum uio_seg type_seg,
+ struct vfsops **vfsops)
{
char fstypename[sizeof(((struct statvfs *)NULL)->f_fstypename)];
int error;
- /* Copy file-system type from userspace. */
- error = copyinstr(fstype, fstypename, sizeof(fstypename), NULL);
+ if (type_seg == UIO_USERSPACE) {
+ /* Copy file-system type from userspace. */
+ error = copyinstr(fstype, fstypename, sizeof(fstypename), NULL);
+ } else {
+ error = copystr(fstype, fstypename, sizeof(fstypename), NULL);
+ KASSERT(error != 0);
+ }
+
if (error) {
/*
* Historically, filesystem types were identified by numbers.
@@ -445,26 +452,23 @@
syscallarg(size_t) data_len;
} */
- return do_sys_mount(l, NULL, SCARG(uap, type), SCARG(uap, path),
+ return do_sys_mount(l, SCARG(uap, type), UIO_USERSPACE, SCARG(uap, path),
SCARG(uap, flags), SCARG(uap, data), UIO_USERSPACE,
SCARG(uap, data_len), retval);
}
int
-do_sys_mount(struct lwp *l, struct vfsops *vfsops, const char *type,
+do_sys_mount(struct lwp *l, const char *type, enum uio_seg type_seg,
const char *path, int flags, void *data, enum uio_seg data_seg,
size_t data_len, register_t *retval)
{
+ struct vfsops *vfsops;
struct vnode *vp;
void *data_buf = data;
bool vfsopsrele = false;
size_t alloc_sz = 0;
int error;
- /* XXX: The calling convention of this routine is totally bizarre */
- if (vfsops)
- vfsopsrele = true;
-
/*
* Get vnode to be covered
*/
@@ -474,16 +478,14 @@
goto done;
}
- if (vfsops == NULL) {
- if (flags & (MNT_GETARGS | MNT_UPDATE)) {
- vfsops = vp->v_mount->mnt_op;
- } else {
- /* 'type' is userspace */
- error = mount_get_vfsops(type, &vfsops);
- if (error != 0)
- goto done;
- vfsopsrele = true;
- }
+ if (flags & (MNT_GETARGS | MNT_UPDATE)) {
+ vfsops = vp->v_mount->mnt_op;
+ } else {
+ /* 'type' is userspace */
+ error = mount_get_vfsops(type, type_seg, &vfsops);
+ if (error != 0)
+ goto done;
+ vfsopsrele = true;
}
/*
Index: sys/mount.h
===================================================================
RCS file: /cvsroot/src/sys/sys/mount.h,v
retrieving revision 1.217
diff -u -r1.217 mount.h
--- sys/mount.h 6 May 2015 15:57:08 -0000 1.217
+++ sys/mount.h 21 Oct 2015 10:49:53 -0000
@@ -475,7 +475,7 @@
int mount_domount(struct lwp *, struct vnode **, struct vfsops *,
const char *, int, void *, size_t *);
int dounmount(struct mount *, int, struct lwp *);
-int do_sys_mount(struct lwp *, struct vfsops *, const char *, const char *,
+int do_sys_mount(struct lwp *, const char *, enum uio_seg, const char *,
int, void *, enum uio_seg, size_t, register_t *);
void vfsinit(void);
void vfs_opv_init(const struct vnodeopv_desc * const *);
Index: compat/common/vfs_syscalls_40.c
===================================================================
RCS file: /cvsroot/src/sys/compat/common/vfs_syscalls_40.c,v
retrieving revision 1.3
diff -u -r1.3 vfs_syscalls_40.c
--- compat/common/vfs_syscalls_40.c 19 Jan 2011 10:21:16 -0000 1.3
+++ compat/common/vfs_syscalls_40.c 21 Oct 2015 10:49:53 -0000
@@ -81,6 +81,6 @@
} */
register_t dummy;
- return do_sys_mount(l, NULL, SCARG(uap, type), SCARG(uap, path),
+ return do_sys_mount(l, SCARG(uap, type), UIO_USERSPACE, SCARG(uap, path),
SCARG(uap, flags), SCARG(uap, data), UIO_USERSPACE, 0, &dummy);
}
Index: compat/freebsd/freebsd_file.c
===================================================================
RCS file: /cvsroot/src/sys/compat/freebsd/freebsd_file.c,v
retrieving revision 1.33
diff -u -r1.33 freebsd_file.c
--- compat/freebsd/freebsd_file.c 9 Nov 2014 18:30:38 -0000 1.33
+++ compat/freebsd/freebsd_file.c 21 Oct 2015 10:49:53 -0000
@@ -98,16 +98,12 @@
syscallarg(void *) data;
} */
const char *type;
- struct vfsops *vfsops;
register_t dummy;
if ((type = convert_from_freebsd_mount_type(SCARG(uap, type))) == NULL)
return ENODEV;
- vfsops = vfs_getopsbyname(type);
- if (vfsops == NULL)
- return ENODEV;
- return do_sys_mount(l, vfsops, NULL, SCARG(uap, path),
+ return do_sys_mount(l, type, UIO_SYSSPACE, SCARG(uap, path),
SCARG(uap, flags), SCARG(uap, data), UIO_USERSPACE, 0, &dummy);
}
Index: compat/netbsd32/netbsd32_fs.c
===================================================================
RCS file: /cvsroot/src/sys/compat/netbsd32/netbsd32_fs.c,v
retrieving revision 1.72
diff -u -r1.72 netbsd32_fs.c
--- compat/netbsd32/netbsd32_fs.c 5 Oct 2014 20:17:28 -0000 1.72
+++ compat/netbsd32/netbsd32_fs.c 21 Oct 2015 10:49:54 -0000
@@ -958,7 +958,7 @@
} else {
data_seg = UIO_USERSPACE;
}
- error = do_sys_mount(l, NULL, type, path, flags, data, data_seg,
+ error = do_sys_mount(l, mtype, UIO_SYSSPACE, path, flags, data, data_seg,
data_len, retval);
if (error)
return error;
Index: compat/osf1/osf1_mount.c
===================================================================
RCS file: /cvsroot/src/sys/compat/osf1/osf1_mount.c,v
retrieving revision 1.52
diff -u -r1.52 osf1_mount.c
--- compat/osf1/osf1_mount.c 5 Sep 2014 09:21:54 -0000 1.52
+++ compat/osf1/osf1_mount.c 21 Oct 2015 10:49:54 -0000
@@ -261,7 +261,7 @@
bsd_ma.base = osf_ma.base;
bsd_ma.size = osf_ma.size;
- return do_sys_mount(l, vfs_getopsbyname("mfs"), NULL, SCARG(uap, path),
+ return do_sys_mount(l, "mfs", UIO_SYSSPACE, SCARG(uap, path),
SCARG(uap, flags), &bsd_ma, UIO_SYSSPACE, sizeof bsd_ma, &dummy);
}
@@ -312,6 +312,6 @@
if (bsd_na.flags & NFSMNT_RETRANS)
bsd_na.retrans = osf_na.retrans;
- return do_sys_mount(l, vfs_getopsbyname("nfs"), NULL, SCARG(uap, path),
+ return do_sys_mount(l, "nfs", UIO_SYSSPACE, SCARG(uap, path),
SCARG(uap, flags), &bsd_na, UIO_SYSSPACE, sizeof bsd_na, &dummy);
}
Index: compat/sunos/sunos_misc.c
===================================================================
RCS file: /cvsroot/src/sys/compat/sunos/sunos_misc.c,v
retrieving revision 1.169
diff -u -r1.169 sunos_misc.c
--- compat/sunos/sunos_misc.c 5 Sep 2014 09:21:55 -0000 1.169
+++ compat/sunos/sunos_misc.c 21 Oct 2015 10:49:54 -0000
@@ -279,7 +279,7 @@
na.retrans = sna.retrans;
na.hostname = /* (char *)(u_long) */ sna.hostname;
- return do_sys_mount(l, vfs_getopsbyname("nfs"), NULL,
+ return do_sys_mount(l, "nfs", UIO_SYSSPACE,
SCARG(uap, dir), nflags, &na,
UIO_SYSSPACE, sizeof na, &dummy);
}
@@ -287,7 +287,7 @@
if (strcmp(fsname, "4.2") == 0)
strcpy(fsname, "ffs");
- return do_sys_mount(l, vfs_getopsbyname(fsname), NULL,
+ return do_sys_mount(l, fsname, UIO_SYSSPACE,
SCARG(uap, dir), nflags, SCARG(uap, data),
UIO_USERSPACE, 0, &dummy);
}
Index: compat/sunos32/sunos32_misc.c
===================================================================
RCS file: /cvsroot/src/sys/compat/sunos32/sunos32_misc.c,v
retrieving revision 1.75
diff -u -r1.75 sunos32_misc.c
--- compat/sunos32/sunos32_misc.c 5 Sep 2014 09:21:55 -0000 1.75
+++ compat/sunos32/sunos32_misc.c 21 Oct 2015 10:49:54 -0000
@@ -522,7 +522,7 @@
na.retrans = sna.retrans;
na.hostname = (char *)(u_long)sna.hostname;
- return do_sys_mount(l, vfs_getopsbyname("nfs"), NULL,
+ return do_sys_mount(l, "nfs", UIO_SYSSPACE,
SCARG_P32(uap, path), nflags, &na, UIO_SYSSPACE, sizeof na,
&dummy);
}
@@ -530,7 +530,7 @@
if (strcmp(fsname, "4.2") == 0)
strcpy(fsname, "ffs");
- return do_sys_mount(l, vfs_getopsbyname(fsname), NULL,
+ return do_sys_mount(l, fsname, UIO_SYSSPACE,
SCARG_P32(uap, path), nflags, SCARG_P32(uap, data), UIO_USERSPACE,
0, &dummy);
}
Index: compat/ultrix/ultrix_fs.c
===================================================================
RCS file: /cvsroot/src/sys/compat/ultrix/ultrix_fs.c,v
retrieving revision 1.55
diff -u -r1.55 ultrix_fs.c
--- compat/ultrix/ultrix_fs.c 24 Jul 2015 13:02:52 -0000 1.55
+++ compat/ultrix/ultrix_fs.c 21 Oct 2015 10:49:54 -0000
@@ -401,7 +401,7 @@
na.timeo = una.timeo;
na.retrans = una.retrans;
na.hostname = una.hostname;
- return do_sys_mount(l, vfs_getopsbyname("nfs"), NULL,
+ return do_sys_mount(l, "nfs", UIO_SYSSPACE,
SCARG(uap, special), nflags, &na, UIO_SYSSPACE,
sizeof na, &dummy);
}
@@ -431,7 +431,7 @@
printf("COMPAT_ULTRIX: mount with MNT_UPDATE on %s\n",
fsname);
}
- return do_sys_mount(l, vfs_getopsbyname("ffs"), NULL,
+ return do_sys_mount(l, "ffs", UIO_SYSSPACE,
SCARG(uap, dir), nflags, &ua, UIO_SYSSPACE, sizeof ua,
&dummy);
}
Home |
Main Index |
Thread Index |
Old Index