From owner-freebsd-emulation Fri Jun 16 4:33:51 2000 Delivered-To: freebsd-emulation@freebsd.org Received: from blount.mail.mindspring.net (blount.mail.mindspring.net [207.69.200.226]) by hub.freebsd.org (Postfix) with ESMTP id 25B1F37BDDE; Fri, 16 Jun 2000 04:33:43 -0700 (PDT) (envelope-from vsilyaev@mindspring.com) Received: from jupiter.delta.ny.us (nyf-ny7-25.ix.netcom.com [198.211.17.153]) by blount.mail.mindspring.net (8.9.3/8.8.5) with ESMTP id HAA31546; Fri, 16 Jun 2000 07:33:40 -0400 (EDT) Received: (from vsilyaev@localhost) by jupiter.delta.ny.us (8.9.3/8.9.3) id HAA00450; Fri, 16 Jun 2000 07:33:38 -0400 (EDT) (envelope-from vsilyaev) Date: Fri, 16 Jun 2000 07:33:38 -0400 (EDT) Message-Id: <200006161133.HAA00450@jupiter.delta.ny.us> To: FreeBSD-gnats-submit@freebsd.org Subject: Broken linprocfs filesystem in -stable Cc: emulation@freebsd.org From: vns@delta.odessa.ua Reply-To: vns@delta.odessa.ua X-send-pr-version: 3.2 Sender: owner-freebsd-emulation@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org >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