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@siemens.com> Submitted by: Andre Albsmeier <Andre.Albsmeier@siemens.com> MFC after: 1 month
This commit is contained in:
parent
8d5ac6c3cf
commit
529844c77c
@ -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 linux_statfs_args *args)
|
||||
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 linux_statfs_args *args)
|
||||
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));
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user