Date: Fri, 16 Jun 2000 07:33:38 -0400 (EDT) From: vns@delta.odessa.ua To: FreeBSD-gnats-submit@freebsd.org Cc: emulation@freebsd.org Subject: Broken linprocfs filesystem in -stable Message-ID: <200006161133.HAA00450@jupiter.delta.ny.us>
next in thread | raw e-mail | index | archive | help
>Submitter-Id: current-users >Originator: Vladimir N. Silyaev >Organization: >Confidential: no >Synopsis: Broken linprocfs filesystem in -stable >Severity: serious >Priority: medium >Category: kern >Release: FreeBSD 4.0-STABLE i386 >Class: sw-bug >Environment: FreeBSD 4.0-STABLE i386 >Description: Broken linprocfs filesystem in -stable. It was broken by MFC revision 1.3 of the src/sys/i386/linux/linprocfs/linprocfs_vnops.c >How-To-Repeat: In the directory /sys/modules/linprocfs start the command 'make load', you'll get exec format error (undefined symbol 'textvp_fullpath' >Fix: To do a MFC for revision 1.44 of the /src/sys/kern/vfs_cache.c and 1.114 of the /src/sys/sys/vnode.h,v As a quick and dirty fix apply the following patch: --- vfs_cache.c.orig Mon Feb 14 01:09:01 2000 +++ vfs_cache.c Fri May 26 06:11:22 2000 @@ -587,3 +587,97 @@ return (error); } +/* + * Thus begins the fullpath magic. + */ + +#undef STATNODE +#define STATNODE(name) \ + static u_int name; \ + SYSCTL_INT(_vfs_cache, OID_AUTO, name, CTLFLAG_RD, &name, 0, "") + +static int disablefullpath; +SYSCTL_INT(_debug, OID_AUTO, disablefullpath, CTLFLAG_RW, + &disablefullpath, 0, ""); + +STATNODE(numfullpathcalls); +STATNODE(numfullpathfail1); +STATNODE(numfullpathfail2); +STATNODE(numfullpathfail3); +STATNODE(numfullpathfail4); +STATNODE(numfullpathfound); + +int +textvp_fullpath(struct proc *p, char **retbuf, char **retfreebuf) { + char *bp, *buf; + int i, slash_prefixed; + struct filedesc *fdp; + struct namecache *ncp; + struct vnode *vp, *textvp; + + numfullpathcalls++; + if (disablefullpath) + return (ENODEV); + textvp = p->p_textvp; + if (textvp == NULL) + return (EINVAL); + buf = malloc(MAXPATHLEN, M_TEMP, M_WAITOK); + bp = buf + MAXPATHLEN - 1; + *bp = '\0'; + fdp = p->p_fd; + slash_prefixed = 0; + for (vp = textvp; vp != fdp->fd_rdir && vp != rootvnode;) { + if (vp->v_flag & VROOT) { + if (vp->v_mount == NULL) { /* forced unmount */ + free(buf, M_TEMP); + return (EBADF); + } + vp = vp->v_mount->mnt_vnodecovered; + continue; + } + if (vp != textvp && vp->v_dd->v_id != vp->v_ddid) { + numfullpathfail1++; + free(buf, M_TEMP); + return (ENOTDIR); + } + ncp = TAILQ_FIRST(&vp->v_cache_dst); + if (!ncp) { + numfullpathfail2++; + free(buf, M_TEMP); + return (ENOENT); + } + if (vp != textvp && ncp->nc_dvp != vp->v_dd) { + numfullpathfail3++; + free(buf, M_TEMP); + return (EBADF); + } + for (i = ncp->nc_nlen - 1; i >= 0; i--) { + if (bp == buf) { + numfullpathfail4++; + free(buf, M_TEMP); + return (ENOMEM); + } + *--bp = ncp->nc_name[i]; + } + if (bp == buf) { + numfullpathfail4++; + free(buf, M_TEMP); + return (ENOMEM); + } + *--bp = '/'; + slash_prefixed = 1; + vp = ncp->nc_dvp; + } + if (!slash_prefixed) { + if (bp == buf) { + numfullpathfail4++; + free(buf, M_TEMP); + return (ENOMEM); + } + *--bp = '/'; + } + numfullpathfound++; + *retbuf = bp; + *retfreebuf = buf; + return (0); +} To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-emulation" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200006161133.HAA00450>