Re: BUG REPORT: kernel nfs between 2.4.19-pre2 (server) and 2.2.21-pre3 (client)

Oleg Drokin
2002-03-11T13:00:07Z

[-- Attachment #1: Type: text/plain, Size: 700 bytes --]

Hello!

On Mon, Mar 11, 2002 at 01:47:17PM +0100, Stephan von Krawczynski wrote:
> What else can I try?
> I checked the setup with another client kernel 2.4.18, and guess what: it has
> the same problem. I have the impression that the problem is somewhere on the
> nfs server side - possibly around the umount case. Trond, Ken?
Just to be sure - have you tried 2.4.17 at the server?
2.4.18 have 2 patches included that were supposed to have another
stale filehandle problem resolved.
Our test have not shown any problems, but I am interested can you still
reproduce with these 2 patches reversed off the 2.4.18?
Also if you still can trigger, apply back only 1st hunk of G-... patch.

Bye,
Oleg

[-- Attachment #2: A-bigendian-lookup-fix.diff --]
[-- Type: text/plain, Size: 480 bytes --]

--- linux.orig/fs/reiserfs/inode.c Mon, 11 Feb 2002 12:21:42 -0500
+++ linux/fs/reiserfs/inode.c Mon, 18 Feb 2002 19:43:55 -0500
@@ -1207,7 +1211,8 @@
struct reiserfs_iget4_args *args;

args = opaque;
- return INODE_PKEY( inode ) -> k_dir_id == args -> objectid;
+ /* args is already in CPU order */
+ return le32_to_cpu(INODE_PKEY(inode)->k_dir_id) == args -> objectid;
}

struct inode * reiserfs_iget (struct super_block * s, const struct cpu_key * key)

[-- Attachment #3: G-nfs_stale_inode_access.diff --]
[-- Type: text/plain, Size: 1524 bytes --]

--- linux/fs/reiserfs/inode.c.o Fri Feb 1 14:08:22 2002
+++ linux/fs/reiserfs/inode.c Fri Feb 1 14:09:40 2002
@@ -1156,6 +1156,7 @@
/* a stale NFS handle can trigger this without it being an error */
pathrelse (&path_to_sd);
make_bad_inode(inode) ;
+ inode->i_nlink = 0;
return;
}

@@ -1188,6 +1189,27 @@

}

+/**
+ * reiserfs_find_actor() - "find actor" reiserfs supplies to iget4().
+ *
+ * @inode: inode from hash table to check
+ * @inode_no: inode number we are looking for
+ * @opaque: "cookie" passed to iget4(). This is &reiserfs_iget4_args.
+ *
+ * This function is called by iget4() to distinguish reiserfs inodes
+ * having the same inode numbers. Such inodes can only exist due to some
+ * error condition. One of them should be bad. Inodes with identical
+ * inode numbers (objectids) are distinguished by parent directory ids.
+ *
+ */
+static int reiserfs_find_actor( struct inode *inode,
+ unsigned long inode_no, void *opaque )
+{
+ struct reiserfs_iget4_args *args;
+
+ args = opaque;
+ return INODE_PKEY( inode ) -> k_dir_id == args -> objectid;
+}

struct inode * reiserfs_iget (struct super_block * s, const struct cpu_key * key)
{
@@ -1195,7 +1217,8 @@
struct reiserfs_iget4_args args ;

args.objectid = key->on_disk_key.k_dir_id ;
- inode = iget4 (s, key->on_disk_key.k_objectid, 0, (void *)(&args));
+ inode = iget4 (s, key->on_disk_key.k_objectid,
+ reiserfs_find_actor, (void *)(&args));
if (!inode)
return ERR_PTR(-ENOMEM) ;