svn commit: r218497 - head/sys/compat/linux

Alexander Leidinger netchild at FreeBSD.org
Wed Feb 9 20:23:23 UTC 2011


Author: netchild
Date: Wed Feb  9 20:23:22 2011
New Revision: 218497
URL: http://svn.freebsd.org/changeset/base/218497

Log:
  Linux' shm_open() fails because it wants to find some funky shmfs
  to construct the full pathname. It starts to search at the default
  mountpoint which is /dev/shm. If this fails it runs through fstab
  and searches for shmfs and tmpfs. Whatever it finds will be
  statfs()'ed to be checked for Linux' fs magic for shmfs (0x01021994).
  
  Ideally our tmpfs should deliver this fs magic to Linux processes, but
  as our tmpfs is considered to be an experimental feature we can not
  assume that there is always a tmpfs available.
  
  To make shared memory work in the Linuxulator, force the fs type of
  /dev/shm (which can be a symlink) to match what Linux expects. The user
  is responsible (info has to be added to the linux base ports and the docs)
  to setup a suitable link for /dev/shm.
  
  Noticed by:	Andre Albsmeier <Andre.Albsmeier at siemens.com>
  Submitted by:	Andre Albsmeier <Andre.Albsmeier at siemens.com>
  MFC after:	1 month

Modified:
  head/sys/compat/linux/linux_stats.c

Modified: head/sys/compat/linux/linux_stats.c
==============================================================================
--- head/sys/compat/linux/linux_stats.c	Wed Feb  9 19:57:00 2011	(r218496)
+++ head/sys/compat/linux/linux_stats.c	Wed Feb  9 20:23:22 2011	(r218497)
@@ -58,6 +58,8 @@ __FBSDID("$FreeBSD$");
 #include <compat/linux/linux_util.h>
 #include <compat/linux/linux_file.h>
 
+#define	LINUX_SHMFS_MAGIC 0x01021994
+
 static void
 translate_vnhook_major_minor(struct vnode *vp, struct stat *sb)
 {
@@ -394,7 +396,7 @@ linux_statfs(struct thread *td, struct l
 	struct l_statfs linux_statfs;
 	struct statfs bsd_statfs;
 	char *path;
-	int error;
+	int error, dev_shm;
 
 	LCONVPATHEXIST(td, args->path, &path);
 
@@ -402,11 +404,17 @@ linux_statfs(struct thread *td, struct l
 	if (ldebug(statfs))
 		printf(ARGS(statfs, "%s, *"), path);
 #endif
+	dev_shm = 0;
 	error = kern_statfs(td, path, UIO_SYSSPACE, &bsd_statfs);
+	if (strncmp(path, "/dev/shm", sizeof("/dev/shm") - 1) == 0)
+		dev_shm = (path[8] == '\0'
+		    || (path[8] == '/' && path[9] == '\0'));
 	LFREEPATH(path);
 	if (error)
 		return (error);
 	bsd_to_linux_statfs(&bsd_statfs, &linux_statfs);
+	if (dev_shm)
+		linux_statfs.f_type = LINUX_SHMFS_MAGIC;
 	return copyout(&linux_statfs, args->buf, sizeof(linux_statfs));
 }
 


More information about the svn-src-head mailing list