[106] in arla-drinkers

home help back first fref pref prev next nref lref last post

patch to fix symlink-related GPFs on Linux

daemon@ATHENA.MIT.EDU (Aaron M. Ucko)
Sun Jul 19 12:13:51 1998

From arla-drinkers-request@sundance.stacken.kth.se Sun Jul 19 16:13:50 1998
Return-Path: <arla-drinkers-request@sundance.stacken.kth.se>
Delivered-To: arla-drinkers-mtg@bloom-picayune.mit.edu
Received: (qmail 9182 invoked from network); 19 Jul 1998 16:13:49 -0000
Received: from unknown (HELO sundance.stacken.kth.se) (130.237.234.41)
  by bloom-picayune.mit.edu with SMTP; 19 Jul 1998 16:13:49 -0000
Received: from dorm-s-007-m.fdu.edu (amu@dorm-s-007-m.fdu.edu [132.238.75.7])
	by sundance.stacken.kth.se (8.8.8/8.8.8) with ESMTP id SAA14895
	for <arla-drinkers@stacken.kth.se>; Sun, 19 Jul 1998 18:07:31 +0200 (MET DST)
Received: (from amu@localhost)
	by dorm-s-007-m.fdu.edu (8.8.7/8.8.7) id MAA00659;
	Sun, 19 Jul 1998 12:07:28 -0400
Sender: amu@dorm-s-007-m.fdu.edu
From: amu@mit.edu (Aaron M. Ucko)
To: arla-drinkers@stacken.kth.se
Subject: patch to fix symlink-related GPFs on Linux
Date: 19 Jul 1998 12:07:28 -0400
Message-ID: <udlu34dkenz.fsf@dorm-s-007-m.fdu.edu>
Lines: 73

We need to set the to_kmem argument of read_exec based on *gasp*
whether we're reading to kernel space.

--- arla-0.7.2/xfs/linux/xfs_inodeops.c.old	Thu Jul 16 17:45:39 1998
+++ arla-0.7.2/xfs/linux/xfs_inodeops.c	Sun Jul 19 11:53:12 1998
@@ -1206,7 +1206,7 @@
     int fileno;
     char *buf;
 #ifndef LINUX2_1
-    long oldfs;
+    unsigned long oldfs;
 #endif /* LINUX2_1 */
 
     XFSDEB(XDEBREADDIR, ("xfs_readdir\n"));
@@ -1228,7 +1228,7 @@
 		
 		XFSDEB(XDEBREADDIR, ("xfs_readdir begin_offset: %d offset: %d\n",(int)begin_offset,(int)offset));
 		oldfs = get_fs();
-		set_fs(KERNEL_DS);
+		set_fs(get_ds());
 		file->f_pos = begin_offset;
 		file->f_reada = 0;
 		error = t->i_op->default_file_ops->read(t, file, buf, XFS_DIRENT_BLOCKSIZE);
@@ -1349,9 +1349,11 @@
 
 static int
 #ifndef LINUX2_1
-xfs_readlink(struct inode *inode, char *buffer, int buflen)
+xfs_readlink_internal(struct inode *inode, char *buffer, int buflen,
+		      int to_kmem)
 #else
-xfs_readlink(struct dentry *dentry, char *buffer, int buflen)
+xfs_readlink_internal(struct dentry *dentry, char *buffer, int buflen,
+		      int to_kmem)
 #endif /* LINUX2_1 */
 {
     int error = 0;
@@ -1375,12 +1377,22 @@
 	size = (buflen > inode->i_size) ?
 	    (inode->i_size) :
 	    (buflen);
-	error = read_exec(t, 0, buffer, size, 1);
+	error = read_exec(t, 0, buffer, size, to_kmem);
     }
     
     return error;
 }
 
+static int
+#ifndef LINUX2_1
+xfs_readlink(struct inode *x, char *buffer, int buflen)
+#else
+xfs_readlink(struct dentry *x, char *buffer, int buflen)
+#endif /* LINUX2_1 */
+{
+    return xfs_readlink_internal(x, buffer, buflen, 0);
+}
+
 #ifndef LINUX2_1
 static int xfs_follow_link(struct inode * dir, struct inode * inode,
 			   int flag, int mode, struct inode ** res_inode)
@@ -1432,9 +1444,9 @@
 #endif /* LINUX2_1 */
     }
 #ifndef LINUX2_1
-    error = xfs_readlink(inode, buffer, MAXPATHLEN);
+    error = xfs_readlink_internal(inode, buffer, MAXPATHLEN, 1);
 #else
-    error = xfs_readlink(dentry, buffer, MAXPATHLEN);
+    error = xfs_readlink_internal(dentry, buffer, MAXPATHLEN, 1);
 #endif /* LINUX2_1 */
     if (error < 0) {
 #ifndef LINUX2_1

home help back first fref pref prev next nref lref last post