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>
