tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: procfs files vs symlink
On Fri, Jan 07, 2022 at 03:20:04PM +0100, Manuel Bouyer wrote:
> Hello
> I'm trying to get a linux binary to run on NetBSD, as stated in this thread
> http://mail-index.netbsd.org/current-users/2022/01/06/msg041891.html
>
> Now I hit an issue where the linux process does a readlink() on a procfs
> file and gets EINVAL.
> It seems that this is because, on linux all files in /proc/<pid>/fd/ are
> symlinks, while on NetBSD they are some kind of hard links.
> E.g. on linux:
> bip:/dsk/l1/misc/bouyer/HEAD/clean/src>ls -l /proc/$$/fd/
> total 0
> lr-x------ 1 bouyer ita-iatos 64 Jan 7 14:13 0 -> /dev/null
> lr-x------ 1 bouyer ita-iatos 64 Jan 7 14:13 1 -> /dev/null
> lrwx------ 1 bouyer ita-iatos 64 Jan 7 15:16 15 -> /dev/pts/11
> lrwx------ 1 bouyer ita-iatos 64 Jan 7 14:13 16 -> /dev/pts/11
> lrwx------ 1 bouyer ita-iatos 64 Jan 7 15:16 17 -> /dev/pts/11
> lrwx------ 1 bouyer ita-iatos 64 Jan 7 15:16 18 -> /dev/pts/11
> lrwx------ 1 bouyer ita-iatos 64 Jan 7 15:16 19 -> /dev/pts/11
> lr-x------ 1 bouyer ita-iatos 64 Jan 7 14:13 2 -> /dev/null
>
> On NetBSD:
> armandeche:/local/armandeche1/bouyer>/emul/linux/bin/ls -l /proc/$$/fd/
> total 0
> crw--w---- 1 bouyer tty 3, 13 Jan 7 15:19 15
> crw--w---- 1 bouyer tty 3, 13 Jan 7 15:19 16
> crw--w---- 1 bouyer tty 3, 13 Jan 7 15:19 17
>
> Any idea on how to properly fix it ?
The attached diff changes the procfs behavior to match the linux one, for
linux processes:
comore:/home/bouyer>ls -l /proc/self/fd/
total 1
crw--w---- 1 bouyer tty 5, 0 Jan 11 11:08 0
crw--w---- 1 bouyer tty 5, 0 Jan 11 11:08 1
crw--w---- 1 bouyer tty 5, 0 Jan 11 11:08 2
lr-xr-xr-x 1 bouyer staff 512 Jan 11 11:08 3 -> /home/bouyer
ls: /proc/self/fd//4: Invalid argument
lr-xr-xr-x 1 bouyer staff 0 Jan 11 11:08 4
comore:/home/bouyer>/emul/linux/bin/ls -l /proc/self/fd/ total 0
lr-xr-xr-x 1 root wheel 0 Jan 11 11:08 0 -> /dev/ttyp0
lr-xr-xr-x 1 root wheel 0 Jan 11 11:08 1 -> /dev/ttyp0
lr-xr-xr-x 1 root wheel 0 Jan 11 11:08 2 -> /dev/ttyp0
lr-xr-xr-x 1 bouyer staff 0 Jan 11 11:08 3 -> /
and my linux binaries seems to work properly now
would it be OK to commit ?
--
Manuel Bouyer <bouyer%antioche.eu.org@localhost>
NetBSD: 26 ans d'experience feront toujours la difference
--
Index: sys/miscfs/procfs/procfs.h
===================================================================
RCS file: /cvsroot/src/sys/miscfs/procfs/procfs.h,v
retrieving revision 1.80
diff -u -p -u -r1.80 procfs.h
--- sys/miscfs/procfs/procfs.h 29 Apr 2020 07:18:24 -0000 1.80
+++ sys/miscfs/procfs/procfs.h 11 Jan 2022 10:06:44 -0000
@@ -213,6 +213,14 @@ struct mount;
struct proc *procfs_proc_find(struct mount *, pid_t);
bool procfs_use_linux_compat(struct mount *);
+
+static inline bool
+procfs_proc_is_linux_compat(void)
+{
+ const char *emulname = curlwp->l_proc->p_emul->e_name;
+ return (strncmp(emulname, "linux", 5) == 0);
+}
+
int procfs_proc_lock(struct mount *, int, struct proc **, int);
void procfs_proc_unlock(struct proc *);
int procfs_allocvp(struct mount *, struct vnode **, pid_t, pfstype, int);
Index: sys/miscfs/procfs/procfs_vfsops.c
===================================================================
RCS file: /cvsroot/src/sys/miscfs/procfs/procfs_vfsops.c,v
retrieving revision 1.110
diff -u -p -u -r1.110 procfs_vfsops.c
--- sys/miscfs/procfs/procfs_vfsops.c 28 Dec 2020 22:36:16 -0000 1.110
+++ sys/miscfs/procfs/procfs_vfsops.c 11 Jan 2022 10:06:44 -0000
@@ -343,7 +343,8 @@ procfs_loadvnode(struct mount *mp, struc
* We make symlinks for directories
* to avoid cycles.
*/
- if (vxp->v_type == VDIR)
+ if (vxp->v_type == VDIR ||
+ procfs_proc_is_linux_compat())
goto symlink;
vp->v_type = vxp->v_type;
break;
Index: sys/miscfs/procfs/procfs_vnops.c
===================================================================
RCS file: /cvsroot/src/sys/miscfs/procfs/procfs_vnops.c,v
retrieving revision 1.220
diff -u -p -u -r1.220 procfs_vnops.c
--- sys/miscfs/procfs/procfs_vnops.c 8 Dec 2021 20:11:54 -0000 1.220
+++ sys/miscfs/procfs/procfs_vnops.c 11 Jan 2022 10:06:44 -0000
@@ -1142,7 +1142,8 @@ procfs_lookup(void *v)
fvp = fp->f_vnode;
/* Don't show directories */
- if (fp->f_type == DTYPE_VNODE && fvp->v_type != VDIR) {
+ if (fp->f_type == DTYPE_VNODE && fvp->v_type != VDIR &&
+ !procfs_proc_is_linux_compat()) {
vref(fvp);
closef(fp);
procfs_proc_unlock(p);
@@ -1659,7 +1660,8 @@ procfs_readlink(void *v)
switch (fp->f_type) {
case DTYPE_VNODE:
vxp = fp->f_vnode;
- if (vxp->v_type != VDIR) {
+ if (vxp->v_type != VDIR &&
+ !procfs_proc_is_linux_compat()) {
error = EINVAL;
break;
}
Home |
Main Index |
Thread Index |
Old Index