svn commit: r343485 - in head: lib/libprocstat sys/kern sys/sys

Konstantin Belousov kib at FreeBSD.org
Sun Jan 27 00:46:08 UTC 2019


Author: kib
Date: Sun Jan 27 00:46:06 2019
New Revision: 343485
URL: https://svnweb.freebsd.org/changeset/base/343485

Log:
  Bump SPECNAMELEN to MAXNAMLEN.
  
  This includes the bump for cdevsw d_version.  Otherwise, the impact on
  the ABI (not KBI) is surprisingly low.  The most important affected
  interface is devname(3) and ttyname(3) which already correctly handle
  long names (and ttyname(3) should not be affected at all).
  
  Still, due to the d_version bump, I argue that the change is not MFC-able.
  
  Requested by:	mmacy
  Reviewed by:	jhb
  Sponsored by:	The FreeBSD Foundation
  Differential revision:	https://reviews.freebsd.org/D18932

Modified:
  head/lib/libprocstat/Symbol.map
  head/lib/libprocstat/libprocstat_compat.c
  head/sys/kern/kern_conf.c
  head/sys/sys/conf.h
  head/sys/sys/param.h

Modified: head/lib/libprocstat/Symbol.map
==============================================================================
--- head/lib/libprocstat/Symbol.map	Sun Jan 27 00:37:52 2019	(r343484)
+++ head/lib/libprocstat/Symbol.map	Sun Jan 27 00:46:06 2019	(r343485)
@@ -35,9 +35,12 @@ FBSD_1.3 {
 FBSD_1.5 {
 	procstat_freeptlwpinfo;
 	procstat_getptlwpinfo;
-	procstat_get_pts_info;
 	procstat_get_sem_info;
 	procstat_get_shm_info;
 	procstat_get_socket_info;
+};
+
+FBSD_1.6 {
+	procstat_get_pts_info;
 	procstat_get_vnode_info;
 };

Modified: head/lib/libprocstat/libprocstat_compat.c
==============================================================================
--- head/lib/libprocstat/libprocstat_compat.c	Sun Jan 27 00:37:52 2019	(r343484)
+++ head/lib/libprocstat/libprocstat_compat.c	Sun Jan 27 00:46:06 2019	(r343485)
@@ -36,9 +36,11 @@ __FBSDID("$FreeBSD$");
 
 #include "libprocstat.h"
 
+#define	SPECNAMELEN_COMPAT12	63
+
 struct freebsd11_ptsstat {
 	uint32_t	dev;
-	char		devname[SPECNAMELEN + 1];
+	char		devname[SPECNAMELEN_COMPAT12 + 1];
 };
 
 struct freebsd11_vnstat {
@@ -49,7 +51,7 @@ struct freebsd11_vnstat {
 	uint32_t	vn_fsid;
 	int		vn_type;
 	uint16_t	vn_mode;
-	char		vn_devname[SPECNAMELEN + 1];
+	char		vn_devname[SPECNAMELEN_COMPAT12 + 1];
 };
 struct freebsd11_semstat {
 	uint32_t	value;
@@ -75,8 +77,25 @@ struct freebsd11_sockstat {
 	char		dname[32];
 };
 
+struct freebsd12_vnstat {
+	uint64_t	vn_fileid;
+	uint64_t	vn_size;
+	uint64_t	vn_dev;
+	uint64_t	vn_fsid;
+	char		*vn_mntdir;
+	int		vn_type;
+	uint16_t	vn_mode;
+	char		vn_devname[SPECNAMELEN_COMPAT12 + 1];
+};
+struct freebsd12_ptsstat {
+	uint64_t	dev;
+	char		devname[SPECNAMELEN_COMPAT12 + 1];
+};
+
 int	freebsd11_procstat_get_pts_info(struct procstat *procstat,
     struct filestat *fst, struct freebsd11_ptsstat *pts, char *errbuf);
+int	freebsd12_procstat_get_pts_info(struct procstat *procstat,
+    struct filestat *fst, struct freebsd12_ptsstat *pts_compat, char *errbuf);
 int	freebsd11_procstat_get_sem_info(struct procstat *procstat,
     struct filestat *fst, struct freebsd11_semstat *sem, char *errbuf);
 int	freebsd11_procstat_get_shm_info(struct procstat *procstat,
@@ -85,7 +104,11 @@ int	freebsd11_procstat_get_socket_info(struct procstat
     struct filestat *fst, struct freebsd11_sockstat *sock, char *errbuf);
 int	freebsd11_procstat_get_vnode_info(struct procstat *procstat,
     struct filestat *fst, struct freebsd11_vnstat *vn, char *errbuf);
+int	freebsd12_procstat_get_vnode_info(struct procstat *procstat,
+    struct filestat *fst, struct freebsd12_vnstat *vn_compat, char *errbuf);
 
+static const char trunc_name[] = "<TRUNCATED>";
+
 int
 freebsd11_procstat_get_pts_info(struct procstat *procstat,
     struct filestat *fst, struct freebsd11_ptsstat *pts_compat, char *errbuf)
@@ -97,12 +120,34 @@ freebsd11_procstat_get_pts_info(struct procstat *procs
 	if (r != 0)
 		return (r);
 	pts_compat->dev = pts.dev;
-	memcpy(pts_compat->devname, pts.devname,
-	    sizeof(pts_compat->devname));
+	if (strlen(pts.devname) >= sizeof(pts_compat->devname))
+		strcpy(pts_compat->devname, trunc_name);
+	else
+		memcpy(pts_compat->devname, pts.devname,
+		    sizeof(pts_compat->devname));
 	return (0);
 }
 
 int
+freebsd12_procstat_get_pts_info(struct procstat *procstat,
+    struct filestat *fst, struct freebsd12_ptsstat *pts_compat, char *errbuf)
+{
+	struct ptsstat pts;
+	int r;
+
+	r = procstat_get_pts_info(procstat, fst, &pts, errbuf);
+	if (r != 0)
+		return (r);
+	pts_compat->dev = pts.dev;
+	if (strlen(pts.devname) >= sizeof(pts_compat->devname))
+		strcpy(pts_compat->devname, trunc_name);
+	else
+		memcpy(pts_compat->devname, pts.devname,
+		    sizeof(pts_compat->devname));
+	return (0);
+}
+
+int
 freebsd11_procstat_get_sem_info(struct procstat *procstat,
     struct filestat *fst, struct freebsd11_semstat *sem_compat, char *errbuf)
 {
@@ -174,11 +219,39 @@ freebsd11_procstat_get_vnode_info(struct procstat *pro
 	vn_compat->vn_fsid = vn.vn_fsid;
 	vn_compat->vn_type = vn.vn_type;
 	vn_compat->vn_mode = vn.vn_mode;
-	memcpy(vn_compat->vn_devname, vn.vn_devname,
-	    sizeof(vn_compat->vn_devname));
+	if (strlen(vn.vn_devname) >= sizeof(vn_compat->vn_devname))
+		strcpy(vn_compat->vn_devname, trunc_name);
+	else
+		memcpy(vn_compat->vn_devname, vn.vn_devname,
+		    sizeof(vn_compat->vn_devname));
 	return (0);
 }
 
+int
+freebsd12_procstat_get_vnode_info(struct procstat *procstat,
+    struct filestat *fst, struct freebsd12_vnstat *vn_compat, char *errbuf)
+{
+	struct vnstat vn;
+	int r;
+
+	r = procstat_get_vnode_info(procstat, fst, &vn, errbuf);
+	if (r != 0)
+		return (r);
+	vn_compat->vn_fileid = vn.vn_fileid;
+	vn_compat->vn_size = vn.vn_size;
+	vn_compat->vn_mntdir = vn.vn_mntdir;
+	vn_compat->vn_dev = vn.vn_dev;
+	vn_compat->vn_fsid = vn.vn_fsid;
+	vn_compat->vn_type = vn.vn_type;
+	vn_compat->vn_mode = vn.vn_mode;
+	if (strlen(vn.vn_devname) >= sizeof(vn_compat->vn_devname))
+		strcpy(vn_compat->vn_devname, trunc_name);
+	else
+		memcpy(vn_compat->vn_devname, vn.vn_devname,
+		    sizeof(vn_compat->vn_devname));
+	return (0);
+}
+
 __sym_compat(procstat_get_pts_info, freebsd11_procstat_get_pts_info, FBSD_1.2);
 __sym_compat(procstat_get_socket_info, freebsd11_procstat_get_socket_info,
     FBSD_1.2);
@@ -186,3 +259,6 @@ __sym_compat(procstat_get_vnode_info, freebsd11_procst
     FBSD_1.2);
 __sym_compat(procstat_get_sem_info, freebsd11_procstat_get_sem_info, FBSD_1.3);
 __sym_compat(procstat_get_shm_info, freebsd11_procstat_get_shm_info, FBSD_1.3);
+__sym_compat(procstat_get_pts_info, freebsd12_procstat_get_pts_info, FBSD_1.5);
+__sym_compat(procstat_get_vnode_info, freebsd12_procstat_get_vnode_info,
+    FBSD_1.5);

Modified: head/sys/kern/kern_conf.c
==============================================================================
--- head/sys/kern/kern_conf.c	Sun Jan 27 00:37:52 2019	(r343484)
+++ head/sys/kern/kern_conf.c	Sun Jan 27 00:46:06 2019	(r343485)
@@ -630,7 +630,7 @@ prep_cdevsw(struct cdevsw *devsw, int flags)
 		return (0);
 	}
 
-	if (devsw->d_version != D_VERSION_03) {
+	if (devsw->d_version != D_VERSION_04) {
 		printf(
 		    "WARNING: Device driver \"%s\" has wrong version %s\n",
 		    devsw->d_name == NULL ? "???" : devsw->d_name,

Modified: head/sys/sys/conf.h
==============================================================================
--- head/sys/sys/conf.h	Sun Jan 27 00:37:52 2019	(r343484)
+++ head/sys/sys/conf.h	Sun Jan 27 00:46:06 2019	(r343485)
@@ -166,7 +166,8 @@ typedef int dumper_hdr_t(struct dumperinfo *di, struct
 #define	D_VERSION_01	0x17032005	/* Add d_uid,gid,mode & kind */
 #define	D_VERSION_02	0x28042009	/* Add d_mmap_single */
 #define	D_VERSION_03	0x17122009	/* d_mmap takes memattr,vm_ooffset_t */
-#define	D_VERSION	D_VERSION_03
+#define	D_VERSION_04	0x5c48c353	/* SPECNAMELEN bumped to MAXNAMLEN */
+#define	D_VERSION	D_VERSION_04
 
 /*
  * Flags used for internal housekeeping

Modified: head/sys/sys/param.h
==============================================================================
--- head/sys/sys/param.h	Sun Jan 27 00:37:52 2019	(r343484)
+++ head/sys/sys/param.h	Sun Jan 27 00:46:06 2019	(r343485)
@@ -60,7 +60,7 @@
  *		in the range 5 to 9.
  */
 #undef __FreeBSD_version
-#define __FreeBSD_version 1300009	/* Master, propagated to newvers */
+#define __FreeBSD_version 1300010	/* Master, propagated to newvers */
 
 /*
  * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
@@ -115,7 +115,7 @@
 #define	NOFILE		OPEN_MAX	/* max open files per process */
 #define	NOGROUP		65535		/* marker for empty group set member */
 #define MAXHOSTNAMELEN	256		/* max hostname size */
-#define SPECNAMELEN	63		/* max length of devicename */
+#define SPECNAMELEN	255		/* max length of devicename */
 
 /* More types and definitions used throughout the kernel. */
 #ifdef _KERNEL


More information about the svn-src-head mailing list