svn commit: r354413 - in head/sys: compat/linux i386/linux

Edward Tomasz Napierala trasz at FreeBSD.org
Wed Nov 6 20:53:34 UTC 2019


Author: trasz
Date: Wed Nov  6 20:53:33 2019
New Revision: 354413
URL: https://svnweb.freebsd.org/changeset/base/354413

Log:
  Make linux(4) create /dev/shm.  Linux applications often expect
  a tmpfs to be mounted there, and because they like to verify it's
  actually a mountpoint, a symlink won't do.
  
  Reviewed by:	dchagin (earlier version)
  MFC after:	2 weeks
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D20333

Modified:
  head/sys/compat/linux/linux.c
  head/sys/compat/linux/linux.h
  head/sys/compat/linux/linux_common.c
  head/sys/i386/linux/linux_sysvec.c

Modified: head/sys/compat/linux/linux.c
==============================================================================
--- head/sys/compat/linux/linux.c	Wed Nov  6 20:43:40 2019	(r354412)
+++ head/sys/compat/linux/linux.c	Wed Nov  6 20:53:33 2019	(r354413)
@@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
 #include <sys/systm.h>
+#include <sys/conf.h>
 #include <sys/ctype.h>
 #include <sys/jail.h>
 #include <sys/lock.h>
@@ -129,6 +130,12 @@ static int linux_to_bsd_sigtbl[LINUX_SIGTBLSZ] = {
 	SIGSYS		/* LINUX_SIGSYS */
 };
 
+static struct cdev *dev_shm_cdev;
+static struct cdevsw dev_shm_cdevsw = {
+     .d_version = D_VERSION,
+     .d_name    = "dev_shm",
+};
+
 /*
  * Map Linux RT signals to the FreeBSD RT signals.
  */
@@ -523,4 +530,24 @@ linux_to_bsd_sockaddr(const struct l_sockaddr *osa, st
 out:
 	free(kosa, M_SONAME);
 	return (error);
+}
+
+void
+linux_dev_shm_create(void)
+{
+	int error;
+
+	error = make_dev_p(MAKEDEV_CHECKNAME | MAKEDEV_WAITOK, &dev_shm_cdev,
+	    &dev_shm_cdevsw, NULL, UID_ROOT, GID_WHEEL, 0, "shm/.mountpoint");
+	if (error != 0) {
+		printf("%s: failed to create device node, error %d\n",
+		    __func__, error);
+	}
+}
+
+void
+linux_dev_shm_destroy(void)
+{
+
+	destroy_dev(dev_shm_cdev);
 }

Modified: head/sys/compat/linux/linux.h
==============================================================================
--- head/sys/compat/linux/linux.h	Wed Nov  6 20:43:40 2019	(r354412)
+++ head/sys/compat/linux/linux.h	Wed Nov  6 20:53:33 2019	(r354413)
@@ -143,4 +143,7 @@ int bsd_to_linux_signal(int sig);
 extern LIST_HEAD(futex_list, futex) futex_list;
 extern struct mtx futex_mtx;
 
+void linux_dev_shm_create(void);
+void linux_dev_shm_destroy(void);
+
 #endif /* _LINUX_MI_H_ */

Modified: head/sys/compat/linux/linux_common.c
==============================================================================
--- head/sys/compat/linux/linux_common.c	Wed Nov  6 20:43:40 2019	(r354412)
+++ head/sys/compat/linux/linux_common.c	Wed Nov  6 20:53:33 2019	(r354413)
@@ -68,6 +68,7 @@ linux_common_modevent(module_t mod, int type, void *da
 
 	switch(type) {
 	case MOD_LOAD:
+		linux_dev_shm_create();
 		linux_osd_jail_register();
 		linux_exit_tag = EVENTHANDLER_REGISTER(process_exit,
 		    linux_proc_exit, NULL, 1000);
@@ -81,6 +82,7 @@ linux_common_modevent(module_t mod, int type, void *da
 		mtx_init(&futex_mtx, "ftllk", NULL, MTX_DEF);
 		break;
 	case MOD_UNLOAD:
+		linux_dev_shm_destroy();
 		linux_osd_jail_deregister();
 		SET_FOREACH(ldhp, linux_device_handler_set)
 			linux_device_unregister_handler(*ldhp);

Modified: head/sys/i386/linux/linux_sysvec.c
==============================================================================
--- head/sys/i386/linux/linux_sysvec.c	Wed Nov  6 20:43:40 2019	(r354412)
+++ head/sys/i386/linux/linux_sysvec.c	Wed Nov  6 20:53:33 2019	(r354413)
@@ -1006,6 +1006,7 @@ linux_elf_modevent(module_t mod, int type, void *data)
 			linux_get_machine(&linux_kplatform);
 			linux_szplatform = roundup(strlen(linux_kplatform) + 1,
 			    sizeof(char *));
+			linux_dev_shm_create();
 			linux_osd_jail_register();
 			stclohz = (stathz ? stathz : hz);
 			if (bootverbose)
@@ -1031,6 +1032,7 @@ linux_elf_modevent(module_t mod, int type, void *data)
 			EVENTHANDLER_DEREGISTER(process_exit, linux_exit_tag);
 			EVENTHANDLER_DEREGISTER(process_exec, linux_exec_tag);
 			EVENTHANDLER_DEREGISTER(thread_dtor, linux_thread_dtor_tag);
+			linux_dev_shm_destroy();
 			linux_osd_jail_deregister();
 			if (bootverbose)
 				printf("Linux ELF exec handler removed\n");


More information about the svn-src-all mailing list