Skip site navigation (1)Skip section navigation (2)
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>