Module Name:    src
Committed By:   maxv
Date:           Fri Oct 23 19:40:11 UTC 2015

Modified Files:
        src/sys/compat/common: vfs_syscalls_40.c
        src/sys/compat/freebsd: freebsd_file.c
        src/sys/compat/netbsd32: netbsd32_fs.c
        src/sys/compat/osf1: osf1_mount.c
        src/sys/compat/sunos: sunos_misc.c
        src/sys/compat/sunos32: sunos32_misc.c
        src/sys/compat/ultrix: ultrix_fs.c
        src/sys/kern: vfs_syscalls.c
        src/sys/sys: mount.h

Log Message:
Change do_sys_mount() so that it only takes as argument the type of the
drive instead of its associated vfsops. Makes it more friendly, and allows
compat binaries to autoload VFS modules if needed.

sent on tech-kern@, ok christos@


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/compat/common/vfs_syscalls_40.c
cvs rdiff -u -r1.33 -r1.34 src/sys/compat/freebsd/freebsd_file.c
cvs rdiff -u -r1.72 -r1.73 src/sys/compat/netbsd32/netbsd32_fs.c
cvs rdiff -u -r1.52 -r1.53 src/sys/compat/osf1/osf1_mount.c
cvs rdiff -u -r1.169 -r1.170 src/sys/compat/sunos/sunos_misc.c
cvs rdiff -u -r1.75 -r1.76 src/sys/compat/sunos32/sunos32_misc.c
cvs rdiff -u -r1.55 -r1.56 src/sys/compat/ultrix/ultrix_fs.c
cvs rdiff -u -r1.500 -r1.501 src/sys/kern/vfs_syscalls.c
cvs rdiff -u -r1.217 -r1.218 src/sys/sys/mount.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/compat/common/vfs_syscalls_40.c
diff -u src/sys/compat/common/vfs_syscalls_40.c:1.3 src/sys/compat/common/vfs_syscalls_40.c:1.4
--- src/sys/compat/common/vfs_syscalls_40.c:1.3	Wed Jan 19 10:21:16 2011
+++ src/sys/compat/common/vfs_syscalls_40.c	Fri Oct 23 19:40:10 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_syscalls_40.c,v 1.3 2011/01/19 10:21:16 tsutsui Exp $	*/
+/*	$NetBSD: vfs_syscalls_40.c,v 1.4 2015/10/23 19:40:10 maxv Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -63,7 +63,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls_40.c,v 1.3 2011/01/19 10:21:16 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls_40.c,v 1.4 2015/10/23 19:40:10 maxv Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -81,6 +81,6 @@ compat_40_sys_mount(struct lwp *l, const
 	} */
 	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: src/sys/compat/freebsd/freebsd_file.c
diff -u src/sys/compat/freebsd/freebsd_file.c:1.33 src/sys/compat/freebsd/freebsd_file.c:1.34
--- src/sys/compat/freebsd/freebsd_file.c:1.33	Sun Nov  9 18:30:38 2014
+++ src/sys/compat/freebsd/freebsd_file.c	Fri Oct 23 19:40:10 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: freebsd_file.c,v 1.33 2014/11/09 18:30:38 maxv Exp $	*/
+/*	$NetBSD: freebsd_file.c,v 1.34 2015/10/23 19:40:10 maxv Exp $	*/
 
 /*
  * Copyright (c) 1995 Frank van der Linden
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: freebsd_file.c,v 1.33 2014/11/09 18:30:38 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: freebsd_file.c,v 1.34 2015/10/23 19:40:10 maxv Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -98,16 +98,12 @@ freebsd_sys_mount(struct lwp *l, const s
 		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: src/sys/compat/netbsd32/netbsd32_fs.c
diff -u src/sys/compat/netbsd32/netbsd32_fs.c:1.72 src/sys/compat/netbsd32/netbsd32_fs.c:1.73
--- src/sys/compat/netbsd32/netbsd32_fs.c:1.72	Sun Oct  5 20:17:28 2014
+++ src/sys/compat/netbsd32/netbsd32_fs.c	Fri Oct 23 19:40:10 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_fs.c,v 1.72 2014/10/05 20:17:28 christos Exp $	*/
+/*	$NetBSD: netbsd32_fs.c,v 1.73 2015/10/23 19:40:10 maxv Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Matthew R. Green
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_fs.c,v 1.72 2014/10/05 20:17:28 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_fs.c,v 1.73 2015/10/23 19:40:10 maxv Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -958,7 +958,7 @@ netbsd32___mount50(struct lwp *l, const 
 	} 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: src/sys/compat/osf1/osf1_mount.c
diff -u src/sys/compat/osf1/osf1_mount.c:1.52 src/sys/compat/osf1/osf1_mount.c:1.53
--- src/sys/compat/osf1/osf1_mount.c:1.52	Fri Sep  5 09:21:54 2014
+++ src/sys/compat/osf1/osf1_mount.c	Fri Oct 23 19:40:11 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: osf1_mount.c,v 1.52 2014/09/05 09:21:54 matt Exp $	*/
+/*	$NetBSD: osf1_mount.c,v 1.53 2015/10/23 19:40:11 maxv Exp $	*/
 
 /*
  * Copyright (c) 1999 Christopher G. Demetriou.  All rights reserved.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: osf1_mount.c,v 1.52 2014/09/05 09:21:54 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: osf1_mount.c,v 1.53 2015/10/23 19:40:11 maxv Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -261,7 +261,7 @@ osf1_mount_mfs(struct lwp *l, const stru
 	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 @@ osf1_mount_nfs(struct lwp *l, const stru
 	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: src/sys/compat/sunos/sunos_misc.c
diff -u src/sys/compat/sunos/sunos_misc.c:1.169 src/sys/compat/sunos/sunos_misc.c:1.170
--- src/sys/compat/sunos/sunos_misc.c:1.169	Fri Sep  5 09:21:55 2014
+++ src/sys/compat/sunos/sunos_misc.c	Fri Oct 23 19:40:11 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: sunos_misc.c,v 1.169 2014/09/05 09:21:55 matt Exp $	*/
+/*	$NetBSD: sunos_misc.c,v 1.170 2015/10/23 19:40:11 maxv Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -50,7 +50,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunos_misc.c,v 1.169 2014/09/05 09:21:55 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunos_misc.c,v 1.170 2015/10/23 19:40:11 maxv Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -279,7 +279,7 @@ sunos_sys_mount(struct lwp *l, const str
 		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 @@ sunos_sys_mount(struct lwp *l, const str
 	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: src/sys/compat/sunos32/sunos32_misc.c
diff -u src/sys/compat/sunos32/sunos32_misc.c:1.75 src/sys/compat/sunos32/sunos32_misc.c:1.76
--- src/sys/compat/sunos32/sunos32_misc.c:1.75	Fri Sep  5 09:21:55 2014
+++ src/sys/compat/sunos32/sunos32_misc.c	Fri Oct 23 19:40:11 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: sunos32_misc.c,v 1.75 2014/09/05 09:21:55 matt Exp $	*/
+/*	$NetBSD: sunos32_misc.c,v 1.76 2015/10/23 19:40:11 maxv Exp $	*/
 /* from :NetBSD: sunos_misc.c,v 1.107 2000/12/01 19:25:10 jdolecek Exp	*/
 
 /*
@@ -77,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunos32_misc.c,v 1.75 2014/09/05 09:21:55 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunos32_misc.c,v 1.76 2015/10/23 19:40:11 maxv Exp $");
 
 #define COMPAT_SUNOS 1
 
@@ -522,7 +522,7 @@ sunos32_sys_mount(struct lwp *l, const s
 		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 @@ sunos32_sys_mount(struct lwp *l, const s
 	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: src/sys/compat/ultrix/ultrix_fs.c
diff -u src/sys/compat/ultrix/ultrix_fs.c:1.55 src/sys/compat/ultrix/ultrix_fs.c:1.56
--- src/sys/compat/ultrix/ultrix_fs.c:1.55	Fri Jul 24 13:02:52 2015
+++ src/sys/compat/ultrix/ultrix_fs.c	Fri Oct 23 19:40:11 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ultrix_fs.c,v 1.55 2015/07/24 13:02:52 maxv Exp $	*/
+/*	$NetBSD: ultrix_fs.c,v 1.56 2015/10/23 19:40:11 maxv Exp $	*/
 
 /*
  * Copyright (c) 1995, 1997 Jonathan Stone
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ultrix_fs.c,v 1.55 2015/07/24 13:02:52 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ultrix_fs.c,v 1.56 2015/10/23 19:40:11 maxv Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -401,7 +401,7 @@ ultrix_sys_mount(struct lwp *l, const st
 		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 @@ ultrix_sys_mount(struct lwp *l, const st
 			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);
 	}

Index: src/sys/kern/vfs_syscalls.c
diff -u src/sys/kern/vfs_syscalls.c:1.500 src/sys/kern/vfs_syscalls.c:1.501
--- src/sys/kern/vfs_syscalls.c:1.500	Fri Jul 24 13:02:52 2015
+++ src/sys/kern/vfs_syscalls.c	Fri Oct 23 19:40:10 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_syscalls.c,v 1.500 2015/07/24 13:02:52 maxv Exp $	*/
+/*	$NetBSD: vfs_syscalls.c,v 1.501 2015/10/23 19:40:10 maxv Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.500 2015/07/24 13:02:52 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.501 2015/10/23 19:40:10 maxv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_fileassoc.h"
@@ -360,13 +360,20 @@ mount_update(struct lwp *l, struct vnode
 }
 
 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 @@ sys___mount50(struct lwp *l, const struc
 		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 @@ do_sys_mount(struct lwp *l, struct vfsop
 		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: src/sys/sys/mount.h
diff -u src/sys/sys/mount.h:1.217 src/sys/sys/mount.h:1.218
--- src/sys/sys/mount.h:1.217	Wed May  6 15:57:08 2015
+++ src/sys/sys/mount.h	Fri Oct 23 19:40:10 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: mount.h,v 1.217 2015/05/06 15:57:08 hannken Exp $	*/
+/*	$NetBSD: mount.h,v 1.218 2015/10/23 19:40:10 maxv Exp $	*/
 
 /*
  * Copyright (c) 1989, 1991, 1993
@@ -475,7 +475,7 @@ long	makefstype(const char *);
 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 *);

Reply via email to