[106] in arla-drinkers
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