mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* NFS client bug
@ 2001-09-02 22:20 Alan Cox
  2001-09-02 23:17 ` Trond Myklebust
  0 siblings, 1 reply; 2+ messages in thread
From: Alan Cox @ 2001-09-02 22:20 UTC (permalink / raw)
  To: linux-kernel; +Cc: trond.myklebust

During some discussion with Al Viro about the right way to do supermount he
complained that it probably wanted doing in userspace. Anyway I was actually
annoyed enough with the magicdev program to try and do this.

I have it working for a subset of working (only one device, hardcoded path)
except for what seems to be an NFS client bug.

For obvious reasons I mount with very little caching in the client. 
[mount -oport=497,mountprog=200005,noac,nolock,soft
	127.0.0.1:/var/cache/volumagic/cdrom /mnt/cdrom]

Everything is fine until I do 

	cd /mnt/cdrom/somedir

[remove CD, insert different CD]

	ls

	[stale NFS file handle - correct so far]

[remove CD, insert original CD]

	ls

	[stale NFS file handle - cached on client - wrong]

It then gets more bizarre

	cd /mnt/cdrom/somedir

	[Looks ok a new filehandle, works ok]
	ls
	[Immediate stale NFS file handle from client - no traffic]

It seems this 'dead' handle remains stuck in the system until umount.

Alan

^ permalink raw reply	[flat|nested] 2+ messages in thread

* NFS client bug
  2001-09-02 22:20 NFS client bug Alan Cox
@ 2001-09-02 23:17 ` Trond Myklebust
  0 siblings, 0 replies; 2+ messages in thread
From: Trond Myklebust @ 2001-09-02 23:17 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-kernel, Linus Torvalds

>>>>> " " == Alan Cox <alan@lxorguk.ukuu.org.uk> writes:

     > [remove CD, insert original CD]

     > 	ls

     > 	[stale NFS file handle - cached on client - wrong]

     > It then gets more bizarre

     > 	cd /mnt/cdrom/somedir

     > 	[Looks ok a new filehandle, works ok] ls [Immediate stale NFS
     > 	file handle from client - no traffic]

     > It seems this 'dead' handle remains stuck in the system until
     > umount.

Yes. We normally mark inodes permanently as being stale as a mechanism
to avoid problems with the unfsd server. The latter can actually reuse
both the inode number *and* the filehandle, thus making it impossible
to tell which file you are writing to.

Normally, we arrange for the inode to be sent to the great /dev/null
in the sky via 'remove_inode_hash()' in nfs_revalidate_inode(),
however the whole mechanism will not (and should for obvious reasons
not) apply to the root inode.

The appended patch has been available for some time on my WWW site,
and was in fact sent both to Linus & the L-K list several months
ago. It failed to make 'top priority' on my list of resends simply due
to the issues with mmap writes. Now that the latter has been settled,
I can start pestering Linus & you with this one again. ;-)

Cheers,
   Trond

diff -u --recursive --new-file linux-2.4.6-mmap/fs/nfs/inode.c linux-2.4.6-stale/fs/nfs/inode.c
--- linux-2.4.6-mmap/fs/nfs/inode.c	Wed Jul  4 20:48:01 2001
+++ linux-2.4.6-stale/fs/nfs/inode.c	Wed Jul  4 21:06:57 2001
@@ -662,7 +662,7 @@
 	if ((fattr->mode & S_IFMT) != (inode->i_mode & S_IFMT))
 		return 1;
 
-	if (is_bad_inode(inode))
+	if (is_bad_inode(inode) || NFS_STALE(inode))
 		return 1;
 
 	/* Has the filehandle changed? If so is the old one stale? */
@@ -863,24 +863,22 @@
 int
 __nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
 {
-	int		 status = 0;
+	int		 status = -ESTALE;
 	struct nfs_fattr fattr;
 
 	dfprintk(PAGECACHE, "NFS: revalidating (%x/%Ld)\n",
 		inode->i_dev, (long long)NFS_FILEID(inode));
 
 	lock_kernel();
-	if (!inode || is_bad_inode(inode) || NFS_STALE(inode)) {
-		unlock_kernel();
-		return -ESTALE;
-	}
+	if (!inode || is_bad_inode(inode))
+ 		goto out_nowait;
+	if (NFS_STALE(inode) && inode != inode->i_sb->s_root->d_inode)
+ 		goto out_nowait;
 
 	while (NFS_REVALIDATING(inode)) {
 		status = nfs_wait_on_inode(inode, NFS_INO_REVALIDATING);
-		if (status < 0) {
-			unlock_kernel();
-			return status;
-		}
+		if (status < 0)
+			goto out_nowait;
 		if (time_before(jiffies,NFS_READTIME(inode)+NFS_ATTRTIMEO(inode))) {
 			status = NFS_STALE(inode) ? -ESTALE : 0;
 			goto out_nowait;
@@ -894,7 +892,8 @@
 			 inode->i_dev, (long long)NFS_FILEID(inode), status);
 		if (status == -ESTALE) {
 			NFS_FLAGS(inode) |= NFS_INO_STALE;
-			remove_inode_hash(inode);
+			if (inode != inode->i_sb->s_root->d_inode)
+				remove_inode_hash(inode);
 		}
 		goto out;
 	}
@@ -907,6 +906,8 @@
 	}
 	dfprintk(PAGECACHE, "NFS: (%x/%Ld) revalidation complete\n",
 		inode->i_dev, (long long)NFS_FILEID(inode));
+
+	NFS_FLAGS(inode) &= ~NFS_INO_STALE;
 out:
 	NFS_FLAGS(inode) &= ~NFS_INO_REVALIDATING;
 	wake_up(&inode->i_wait);


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2001-09-02 23:18 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-09-02 22:20 NFS client bug Alan Cox
2001-09-02 23:17 ` Trond Myklebust

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®