Module Name:    src
Committed By:   christos
Date:           Fri Oct  4 01:28:03 UTC 2019

Modified Files:
        src/lib/libc/compat/sys: compat_statfs.c
        src/sys/compat/common: vfs_syscalls_20.c
        src/sys/compat/sys: mount.h

Log Message:
deduplicate the conversion function from statvfs -> statfs12


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/lib/libc/compat/sys/compat_statfs.c
cvs rdiff -u -r1.43 -r1.44 src/sys/compat/common/vfs_syscalls_20.c
cvs rdiff -u -r1.10 -r1.11 src/sys/compat/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/lib/libc/compat/sys/compat_statfs.c
diff -u src/lib/libc/compat/sys/compat_statfs.c:1.8 src/lib/libc/compat/sys/compat_statfs.c:1.9
--- src/lib/libc/compat/sys/compat_statfs.c:1.8	Sun Sep 22 18:59:38 2019
+++ src/lib/libc/compat/sys/compat_statfs.c	Thu Oct  3 21:28:03 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: compat_statfs.c,v 1.8 2019/09/22 22:59:38 christos Exp $	*/
+/*	$NetBSD: compat_statfs.c,v 1.9 2019/10/04 01:28:03 christos Exp $	*/
 
 /*-
  * Copyright (c) 2004, 2019 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: compat_statfs.c,v 1.8 2019/09/22 22:59:38 christos Exp $");
+__RCSID("$NetBSD: compat_statfs.c,v 1.9 2019/10/04 01:28:03 christos Exp $");
 #endif /* LIBC_SCCS and not lint */
 
 #define __LIBC12_SOURCE__
@@ -63,73 +63,6 @@ __strong_alias(fstatfs, __compat_fstatfs
 __strong_alias(fhstatfs, __compat_fhstatfs)
 __strong_alias(getfsstat, __compat_getfsstat)
 
-/*
- * Convert from a new statvfs to an old statfs structure.
- */
-
-static void vfs2fs(struct statfs12 *, const struct statvfs *);
-
-#define MOUNTNO_NONE	0
-#define MOUNTNO_UFS	1		/* UNIX "Fast" Filesystem */
-#define MOUNTNO_NFS	2		/* Network Filesystem */
-#define MOUNTNO_MFS	3		/* Memory Filesystem */
-#define MOUNTNO_MSDOS	4		/* MSDOS Filesystem */
-#define MOUNTNO_CD9660	5		/* iso9660 cdrom */
-#define MOUNTNO_FDESC	6		/* /dev/fd filesystem */
-#define MOUNTNO_KERNFS	7		/* kernel variable filesystem */ 
-#define MOUNTNO_DEVFS	8		/* device node filesystem */
-#define MOUNTNO_AFS	9		/* AFS 3.x */
-static const struct {
-	const char *name;
-	const int value;
-} nv[] = {
-	{ MOUNT_UFS, MOUNTNO_UFS },
-	{ MOUNT_NFS, MOUNTNO_NFS },
-	{ MOUNT_MFS, MOUNTNO_MFS },
-	{ MOUNT_MSDOS, MOUNTNO_MSDOS },
-	{ MOUNT_CD9660, MOUNTNO_CD9660 },
-	{ MOUNT_FDESC, MOUNTNO_FDESC },
-	{ MOUNT_KERNFS, MOUNTNO_KERNFS },
-	{ MOUNT_AFS, MOUNTNO_AFS },
-};
-
-static void
-vfs2fs(struct statfs12 *bfs, const struct statvfs *fs) 
-{
-	size_t i = 0;
-	bfs->f_type = 0;
-	bfs->f_oflags = (short)fs->f_flag;
-
-	for (i = 0; i < sizeof(nv) / sizeof(nv[0]); i++) {
-		if (strcmp(nv[i].name, fs->f_fstypename) == 0) {
-			bfs->f_type = nv[i].value;
-			break;
-		}
-	}
-#define CLAMP(a)	(long)(((a) & ~LONG_MAX) ? LONG_MAX : (a))
-	bfs->f_bsize = CLAMP(fs->f_frsize);
-	bfs->f_iosize = CLAMP(fs->f_iosize);
-	bfs->f_blocks = CLAMP(fs->f_blocks);
-	bfs->f_bfree = CLAMP(fs->f_bfree);
-	if (fs->f_bfree > fs->f_bresvd)
-		bfs->f_bavail = CLAMP(fs->f_bfree - fs->f_bresvd);
-	else
-		bfs->f_bavail = -CLAMP(fs->f_bresvd - fs->f_bfree);
-	bfs->f_files = CLAMP(fs->f_files);
-	bfs->f_ffree = CLAMP(fs->f_ffree);
-	bfs->f_fsid = fs->f_fsidx;
-	bfs->f_owner = fs->f_owner;
-	bfs->f_flags = (long)fs->f_flag;
-	bfs->f_syncwrites = CLAMP(fs->f_syncwrites);
-	bfs->f_asyncwrites = CLAMP(fs->f_asyncwrites);
-	(void)strncpy(bfs->f_fstypename, fs->f_fstypename,
-	    sizeof(bfs->f_fstypename));
-	(void)strncpy(bfs->f_mntonname, fs->f_mntonname,
-	    sizeof(bfs->f_mntonname));
-	(void)strncpy(bfs->f_mntfromname, fs->f_mntfromname,
-	    sizeof(bfs->f_mntfromname));
-}
-
 int
 __compat_statfs(const char *file, struct statfs12 *ost)
 {
@@ -138,7 +71,7 @@ __compat_statfs(const char *file, struct
 
 	if ((ret = __statvfs90(file, &nst)) == -1)
 		return ret;
-	vfs2fs(ost, &nst);
+	statvfs_to_statfs12(&nst, ost);
 	return ret;
 }
 
@@ -150,7 +83,7 @@ __compat_fstatfs(int f, struct statfs12 
 
 	if ((ret = __fstatvfs90(f, &nst)) == -1)
 		return ret;
-	vfs2fs(ost, &nst);
+	statvfs_to_statfs12(&nst, ost);
 	return ret;
 }
 
@@ -162,7 +95,7 @@ __compat_fhstatfs(const struct compat_30
 
 	if ((ret = __fhstatvfs190(fh, FHANDLE30_SIZE, &nst, ST_WAIT)) == -1)
 		return ret;
-	vfs2fs(ost, &nst);
+	statvfs_to_statfs12(&nst, ost);
 	return ret;
 }
 
@@ -183,7 +116,7 @@ __compat_getfsstat(struct statfs12 *ost,
 		goto done;
 	if (nst)
 		for (i = 0; i < ret; i++)
-			vfs2fs(&ost[i], &nst[i]);
+			statvfs_to_statfs12(&nst[i], &ost[i]);
 done:
 	if (nst)
 		free(nst);

Index: src/sys/compat/common/vfs_syscalls_20.c
diff -u src/sys/compat/common/vfs_syscalls_20.c:1.43 src/sys/compat/common/vfs_syscalls_20.c:1.44
--- src/sys/compat/common/vfs_syscalls_20.c:1.43	Wed Sep 25 21:28:27 2019
+++ src/sys/compat/common/vfs_syscalls_20.c	Thu Oct  3 21:28:03 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_syscalls_20.c,v 1.43 2019/09/26 01:28:27 christos Exp $	*/
+/*	$NetBSD: vfs_syscalls_20.c,v 1.44 2019/10/04 01:28:03 christos Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls_20.c,v 1.43 2019/09/26 01:28:27 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls_20.c,v 1.44 2019/10/04 01:28:03 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -67,30 +67,6 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_syscalls
 #include <compat/sys/mount.h>
 #include <compat/sys/statvfs.h>
 
-#define MOUNTNO_NONE	0
-#define MOUNTNO_UFS	1		/* UNIX "Fast" Filesystem */
-#define MOUNTNO_NFS	2		/* Network Filesystem */
-#define MOUNTNO_MFS	3		/* Memory Filesystem */
-#define MOUNTNO_MSDOS	4		/* MSDOS Filesystem */
-#define MOUNTNO_CD9660	5		/* iso9660 cdrom */
-#define MOUNTNO_FDESC	6		/* /dev/fd filesystem */
-#define MOUNTNO_KERNFS	7		/* kernel variable filesystem */
-#define MOUNTNO_DEVFS	8		/* device node filesystem */
-#define MOUNTNO_AFS	9		/* AFS 3.x */
-static const struct {
-	const char *name;
-	const int value;
-} nv[] = {
-	{ MOUNT_UFS, MOUNTNO_UFS },
-	{ MOUNT_NFS, MOUNTNO_NFS },
-	{ MOUNT_MFS, MOUNTNO_MFS },
-	{ MOUNT_MSDOS, MOUNTNO_MSDOS },
-	{ MOUNT_CD9660, MOUNTNO_CD9660 },
-	{ MOUNT_FDESC, MOUNTNO_FDESC },
-	{ MOUNT_KERNFS, MOUNTNO_KERNFS },
-	{ MOUNT_AFS, MOUNTNO_AFS },
-};
-
 static const struct syscall_package vfs_syscalls_20_syscalls[] = {
 	{ SYS_compat_20_fhstatfs, 0, (sy_call_t *)compat_20_sys_fhstatfs },
 	{ SYS_compat_20_fstatfs, 0, (sy_call_t *)compat_20_sys_fstatfs },
@@ -99,47 +75,6 @@ static const struct syscall_package vfs_
 	{ 0, 0, NULL }
 };
 
-static int
-statvfs_to_statfs12(const void *vfs, void *vbfs, size_t len)
-{
-	struct statfs12 ofs, *bfs = vbfs;
-	const struct statvfs *fs = vfs;
-	size_t i;
-	ofs.f_type = 0;
-	ofs.f_oflags = (short)fs->f_flag;
-
-	for (i = 0; i < sizeof(nv) / sizeof(nv[0]); i++) {
-		if (strcmp(nv[i].name, fs->f_fstypename) == 0) {
-			ofs.f_type = nv[i].value;
-			break;
-		}
-	}
-#define CLAMP(a)	(long)(((a) & ~LONG_MAX) ? LONG_MAX : (a))
-	ofs.f_bsize = CLAMP(fs->f_frsize);
-	ofs.f_iosize = CLAMP(fs->f_iosize);
-	ofs.f_blocks = CLAMP(fs->f_blocks);
-	ofs.f_bfree = CLAMP(fs->f_bfree);
-	if (fs->f_bfree > fs->f_bresvd)
-		ofs.f_bavail = CLAMP(fs->f_bfree - fs->f_bresvd);
-	else
-		ofs.f_bavail = -CLAMP(fs->f_bresvd - fs->f_bfree);
-	ofs.f_files = CLAMP(fs->f_files);
-	ofs.f_ffree = CLAMP(fs->f_ffree);
-	ofs.f_fsid = fs->f_fsidx;
-	ofs.f_owner = fs->f_owner;
-	ofs.f_flags = (long)fs->f_flag;
-	ofs.f_syncwrites = CLAMP(fs->f_syncwrites);
-	ofs.f_asyncwrites = CLAMP(fs->f_asyncwrites);
-	(void)strncpy(ofs.f_fstypename, fs->f_fstypename,
-	    sizeof(ofs.f_fstypename));
-	(void)strncpy(ofs.f_mntonname, fs->f_mntonname,
-	    sizeof(ofs.f_mntonname));
-	(void)strncpy(ofs.f_mntfromname, fs->f_mntfromname,
-	    sizeof(ofs.f_mntfromname));
-
-	return copyout(&ofs, bfs, sizeof(ofs));
-}
-
 /*
  * Get filesystem statistics.
  */
@@ -167,7 +102,7 @@ compat_20_sys_statfs(struct lwp *l, cons
 	if ((error = dostatvfs(mp, sbuf, l, 0, 1)) != 0)
 		goto done;
 
-	error = statvfs_to_statfs12(sbuf, SCARG(uap, buf), 0);
+	error = statvfs_to_statfs12_copy(sbuf, SCARG(uap, buf), 0);
 done:
 	vrele(vp);
 	STATVFSBUF_PUT(sbuf);
@@ -197,7 +132,7 @@ compat_20_sys_fstatfs(struct lwp *l, con
 	sbuf = STATVFSBUF_GET();
 	if ((error = dostatvfs(mp, sbuf, l, 0, 1)) != 0)
 		goto out;
-	error = statvfs_to_statfs12(sbuf, SCARG(uap, buf), 0);
+	error = statvfs_to_statfs12_copy(sbuf, SCARG(uap, buf), 0);
  out:
 	fd_putfile(SCARG(uap, fd));
 	STATVFSBUF_PUT(sbuf);
@@ -217,7 +152,7 @@ compat_20_sys_getfsstat(struct lwp *l, c
 		syscallarg(int) flags;
 	} */
 	return do_sys_getvfsstat(l, SCARG(uap, buf), SCARG(uap, bufsize),
-	    SCARG(uap, flags), statvfs_to_statfs12,
+	    SCARG(uap, flags), statvfs_to_statfs12_copy,
 	    sizeof(struct statvfs90), retval);
 }
 
@@ -253,7 +188,7 @@ compat_20_sys_fhstatfs(struct lwp *l, co
 	sbuf = STATVFSBUF_GET();
 	if ((error = VFS_STATVFS(mp, sbuf)) != 0)
 		goto out;
-	error = statvfs_to_statfs12(sbuf, SCARG(uap, buf), 0);
+	error = statvfs_to_statfs12_copy(sbuf, SCARG(uap, buf), 0);
 out:
 	vrele(vp);
 	STATVFSBUF_PUT(sbuf);

Index: src/sys/compat/sys/mount.h
diff -u src/sys/compat/sys/mount.h:1.10 src/sys/compat/sys/mount.h:1.11
--- src/sys/compat/sys/mount.h:1.10	Fri Oct  4 17:07:37 2013
+++ src/sys/compat/sys/mount.h	Thu Oct  3 21:28:02 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: mount.h,v 1.10 2013/10/04 21:07:37 christos Exp $	*/
+/*	$NetBSD: mount.h,v 1.11 2019/10/04 01:28:02 christos Exp $	*/
 
 /*
  * Copyright (c) 1989, 1991, 1993
@@ -61,10 +61,91 @@ struct statfs12 {
 	char	f_mntfromname[MNAMELEN];  /* mounted file system */
 };
 
+#ifndef _KERNEL
+#include <string.h>
+#endif
+
 /*
  * Operations supported on mounted file system.
  */
+/*
+ * Convert from a new statvfs to an old statfs structure.
+ */
+
+#define MOUNTNO_NONE	0
+#define MOUNTNO_UFS	1		/* UNIX "Fast" Filesystem */
+#define MOUNTNO_NFS	2		/* Network Filesystem */
+#define MOUNTNO_MFS	3		/* Memory Filesystem */
+#define MOUNTNO_MSDOS	4		/* MSDOS Filesystem */
+#define MOUNTNO_CD9660	5		/* iso9660 cdrom */
+#define MOUNTNO_FDESC	6		/* /dev/fd filesystem */
+#define MOUNTNO_KERNFS	7		/* kernel variable filesystem */ 
+#define MOUNTNO_DEVFS	8		/* device node filesystem */
+#define MOUNTNO_AFS	9		/* AFS 3.x */
+
+static const struct {
+	const char *name;
+	const int value;
+} __nv[] = {
+	{ MOUNT_UFS, MOUNTNO_UFS },
+	{ MOUNT_NFS, MOUNTNO_NFS },
+	{ MOUNT_MFS, MOUNTNO_MFS },
+	{ MOUNT_MSDOS, MOUNTNO_MSDOS },
+	{ MOUNT_CD9660, MOUNTNO_CD9660 },
+	{ MOUNT_FDESC, MOUNTNO_FDESC },
+	{ MOUNT_KERNFS, MOUNTNO_KERNFS },
+	{ MOUNT_AFS, MOUNTNO_AFS },
+};
+
+static __inline void
+statvfs_to_statfs12(const struct statvfs *fs, struct statfs12 *s12)
+{
+	size_t i = 0;
+	s12->f_type = 0;
+	s12->f_oflags = (short)fs->f_flag;
+
+	memset(s12, 0, sizeof(*s12));
+	for (i = 0; i < sizeof(__nv) / sizeof(__nv[0]); i++) {
+		if (strcmp(__nv[i].name, fs->f_fstypename) == 0) {
+			s12->f_type = __nv[i].value;
+			break;
+		}
+	}
+#define __STATFSCLAMP(a)	(long)(((a) & ~LONG_MAX) ? LONG_MAX : (a))
+	s12->f_bsize = __STATFSCLAMP(fs->f_frsize);
+	s12->f_iosize = __STATFSCLAMP(fs->f_iosize);
+	s12->f_blocks = __STATFSCLAMP(fs->f_blocks);
+	s12->f_bfree = __STATFSCLAMP(fs->f_bfree);
+	if (fs->f_bfree > fs->f_bresvd)
+		s12->f_bavail = __STATFSCLAMP(fs->f_bfree - fs->f_bresvd);
+	else
+		s12->f_bavail = -__STATFSCLAMP(fs->f_bresvd - fs->f_bfree);
+	s12->f_files = __STATFSCLAMP(fs->f_files);
+	s12->f_ffree = __STATFSCLAMP(fs->f_ffree);
+	s12->f_fsid = fs->f_fsidx;
+	s12->f_owner = fs->f_owner;
+	s12->f_flags = (long)fs->f_flag;
+	s12->f_syncwrites = __STATFSCLAMP(fs->f_syncwrites);
+	s12->f_asyncwrites = __STATFSCLAMP(fs->f_asyncwrites);
+	memcpy(s12->f_fstypename, fs->f_fstypename, sizeof(s12->f_fstypename));
+	memcpy(s12->f_mntonname, fs->f_mntonname, sizeof(s12->f_mntonname));
+	memcpy(s12->f_mntfromname, fs->f_mntfromname,
+	    sizeof(s12->f_mntfromname));
+}
+
 #ifdef _KERNEL
+static __inline int
+statvfs_to_statfs12_copy(const void *vs, void *vs12, size_t l)
+{
+	struct statfs12 *s12 = STATVFSBUF_GET();
+	int error;
+
+	statvfs_to_statfs12(vs, vs12);
+	error = copyout(s12, vs12, l);
+	STATVFSBUF_PUT(s12);
+
+	return error;
+}
 
 /*
  * Filesystem configuration information. Not used by NetBSD, but

Reply via email to