| From 462d60577a997aa87c935ae4521bd303733a9f2b Mon Sep 17 00:00:00 2001 |
| From: Al Viro <viro@zeniv.linux.org.uk> |
| Date: Sat, 30 Jan 2010 16:11:21 -0500 |
| Subject: fix NFS4 handling of mountpoint stat |
| |
| From: Al Viro <viro@zeniv.linux.org.uk> |
| |
| commit 462d60577a997aa87c935ae4521bd303733a9f2b upstream. |
| |
| RFC says we need to follow the chain of mounts if there's more |
| than one stacked on that point. |
| |
| Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| fs/nfsd/nfs4xdr.c | 12 +++++++++--- |
| 1 file changed, 9 insertions(+), 3 deletions(-) |
| |
| --- a/fs/nfsd/nfs4xdr.c |
| +++ b/fs/nfsd/nfs4xdr.c |
| @@ -2129,9 +2129,15 @@ out_acl: |
| * and this is the root of a cross-mounted filesystem. |
| */ |
| if (ignore_crossmnt == 0 && |
| - exp->ex_path.mnt->mnt_root->d_inode == dentry->d_inode) { |
| - err = vfs_getattr(exp->ex_path.mnt->mnt_parent, |
| - exp->ex_path.mnt->mnt_mountpoint, &stat); |
| + dentry == exp->ex_path.mnt->mnt_root) { |
| + struct path path = exp->ex_path; |
| + path_get(&path); |
| + while (follow_up(&path)) { |
| + if (path.dentry != path.mnt->mnt_root) |
| + break; |
| + } |
| + err = vfs_getattr(path.mnt, path.dentry, &stat); |
| + path_put(&path); |
| if (err) |
| goto out_nfserr; |
| } |