Re: 2.6.24-rc3-git4 NFS crossmnt regression

From: Trond Myklebust
Date: Fri Dec 07 2007 - 13:46:40 EST



On Fri, 2007-12-07 at 13:14 -0500, Shane wrote:
> On Dec 7, 2007 7:02 AM, Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> wrote:
> ...
> > > 2.6.24-rc3-git1 is last known good kernel. The problem also exists
> > > with the latest snap 2.6.24-rc4-git4. NFS server is 2.6.23-rc9 and
> > > is unchanged.
> >
> > hm, there have been no nfs changes since 2.6.24-rc4.
>
> Ok, but the problem seems to have appeared before 2.6.24-rc4.
>
> > > It is easily reproducible here, hopefully for the person who
> > > knows how to debug it too :)
> > >
> >
> > I guess a full set of the commands which you typed to reproduce this would
> > help.
>
> Server is 2.6.23-rc9 and is exporting:
>
> /dirA/dirB
> 10.10.20.0/255.255.255.0(rw,async,no_root_squash,no_subtree_check,insecure,crossmnt)
> /dirA/dirB/dirC
> 10.10.20.0/255.255.255.0(rw,async,no_root_squash,no_subtree_check,insecure)
> /dirA/dirB/dirD
> 10.10.20.0/255.255.255.0(rw,async,no_root_squash,no_subtree_check,insecure)
>
> The NFS client (Core2 SMP) 2.6.24-rc3-git4:
>
> NFS-server:/dirA/dirB /dirA/dirB nfs
> auto,rsize=16384,wsize=16384,hard,intr,users,exec,nfsvers=3,tcp,nolock,actimeo=0
>
> Then on the client when the new kernel has booted:
>
> ls /dirA/dirB --> normal listing
> ls /dirA/dirB/dirC --> Stale NFS file handle
> ls /dirA/dirB/dirD --> Stale NFS file handle
>
> I will do a few more builds/boots and check -rc3-git2 and -rc3-git3.

This problem has already been reported. The fix (which I'm planning on
sending to Linus soon) is appended.

Cheers
Trond
--- Begin Message --- The check that was added to nfs_xdev_get_sb() to work around broken
servers, works fine for NFSv2, but causes mountpoint crossing on NFSv3 to
always return ESTALE.

Signed-off-by: Trond Myklebust <Trond.Myklebust@xxxxxxxxxx>
---

fs/nfs/super.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 2426e71..ea92920 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -1475,7 +1475,7 @@ static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags,
error = PTR_ERR(mntroot);
goto error_splat_super;
}
- if (mntroot->d_inode->i_op != &nfs_dir_inode_operations) {
+ if (mntroot->d_inode->i_op != server->nfs_client->rpc_ops->dir_inode_ops) {
dput(mntroot);
error = -ESTALE;
goto error_splat_super;

--- End Message ---