svn commit: r219666 - stable/8/sys/compat/linux
Alexander Leidinger
netchild at FreeBSD.org
Tue Mar 15 13:19:27 UTC 2011
Author: netchild
Date: Tue Mar 15 13:19:26 2011
New Revision: 219666
URL: http://svn.freebsd.org/changeset/base/219666
Log:
MFC r218497:
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>
Modified:
stable/8/sys/compat/linux/linux_stats.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
Modified: stable/8/sys/compat/linux/linux_stats.c
==============================================================================
--- stable/8/sys/compat/linux/linux_stats.c Tue Mar 15 12:24:40 2011 (r219665)
+++ stable/8/sys/compat/linux/linux_stats.c Tue Mar 15 13:19:26 2011 (r219666)
@@ -60,6 +60,8 @@ __FBSDID("$FreeBSD$");
#include <security/mac/mac_framework.h>
+#define LINUX_SHMFS_MAGIC 0x01021994
+
static void
translate_vnhook_major_minor(struct vnode *vp, struct stat *sb)
{
@@ -390,7 +392,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);
@@ -398,11 +400,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-stable
mailing list