diff options
Diffstat (limited to 'fs/nfsd/nfs4xdr.c')
-rw-r--r-- | fs/nfsd/nfs4xdr.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 8ef0964179bc..e15f2cf8ac15 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c | |||
@@ -1475,7 +1475,8 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp, | |||
1475 | err = vfs_getattr(exp->ex_mnt, dentry, &stat); | 1475 | err = vfs_getattr(exp->ex_mnt, dentry, &stat); |
1476 | if (err) | 1476 | if (err) |
1477 | goto out_nfserr; | 1477 | goto out_nfserr; |
1478 | if ((bmval0 & (FATTR4_WORD0_FILES_FREE | FATTR4_WORD0_FILES_TOTAL)) || | 1478 | if ((bmval0 & (FATTR4_WORD0_FILES_FREE | FATTR4_WORD0_FILES_TOTAL | |
1479 | FATTR4_WORD0_MAXNAME)) || | ||
1479 | (bmval1 & (FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE | | 1480 | (bmval1 & (FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE | |
1480 | FATTR4_WORD1_SPACE_TOTAL))) { | 1481 | FATTR4_WORD1_SPACE_TOTAL))) { |
1481 | err = vfs_statfs(dentry, &statfs); | 1482 | err = vfs_statfs(dentry, &statfs); |
@@ -1679,7 +1680,7 @@ out_acl: | |||
1679 | if (bmval0 & FATTR4_WORD0_FILEID) { | 1680 | if (bmval0 & FATTR4_WORD0_FILEID) { |
1680 | if ((buflen -= 8) < 0) | 1681 | if ((buflen -= 8) < 0) |
1681 | goto out_resource; | 1682 | goto out_resource; |
1682 | WRITE64((u64) stat.ino); | 1683 | WRITE64(stat.ino); |
1683 | } | 1684 | } |
1684 | if (bmval0 & FATTR4_WORD0_FILES_AVAIL) { | 1685 | if (bmval0 & FATTR4_WORD0_FILES_AVAIL) { |
1685 | if ((buflen -= 8) < 0) | 1686 | if ((buflen -= 8) < 0) |
@@ -1721,7 +1722,7 @@ out_acl: | |||
1721 | if (bmval0 & FATTR4_WORD0_MAXNAME) { | 1722 | if (bmval0 & FATTR4_WORD0_MAXNAME) { |
1722 | if ((buflen -= 4) < 0) | 1723 | if ((buflen -= 4) < 0) |
1723 | goto out_resource; | 1724 | goto out_resource; |
1724 | WRITE32(~(u32) 0); | 1725 | WRITE32(statfs.f_namelen); |
1725 | } | 1726 | } |
1726 | if (bmval0 & FATTR4_WORD0_MAXREAD) { | 1727 | if (bmval0 & FATTR4_WORD0_MAXREAD) { |
1727 | if ((buflen -= 8) < 0) | 1728 | if ((buflen -= 8) < 0) |
@@ -1821,16 +1822,15 @@ out_acl: | |||
1821 | WRITE32(stat.mtime.tv_nsec); | 1822 | WRITE32(stat.mtime.tv_nsec); |
1822 | } | 1823 | } |
1823 | if (bmval1 & FATTR4_WORD1_MOUNTED_ON_FILEID) { | 1824 | if (bmval1 & FATTR4_WORD1_MOUNTED_ON_FILEID) { |
1824 | struct dentry *mnt_pnt, *mnt_root; | ||
1825 | |||
1826 | if ((buflen -= 8) < 0) | 1825 | if ((buflen -= 8) < 0) |
1827 | goto out_resource; | 1826 | goto out_resource; |
1828 | mnt_root = exp->ex_mnt->mnt_root; | 1827 | if (exp->ex_mnt->mnt_root->d_inode == dentry->d_inode) { |
1829 | if (mnt_root->d_inode == dentry->d_inode) { | 1828 | err = vfs_getattr(exp->ex_mnt->mnt_parent, |
1830 | mnt_pnt = exp->ex_mnt->mnt_mountpoint; | 1829 | exp->ex_mnt->mnt_mountpoint, &stat); |
1831 | WRITE64((u64) mnt_pnt->d_inode->i_ino); | 1830 | if (err) |
1832 | } else | 1831 | goto out_nfserr; |
1833 | WRITE64((u64) stat.ino); | 1832 | } |
1833 | WRITE64(stat.ino); | ||
1834 | } | 1834 | } |
1835 | *attrlenp = htonl((char *)p - (char *)attrlenp - 4); | 1835 | *attrlenp = htonl((char *)p - (char *)attrlenp - 4); |
1836 | *countp = p - buffer; | 1836 | *countp = p - buffer; |