From: NeilBrown <neilb@cse.unsw.edu.au>



---

 25-akpm/fs/nfsd/nfs4xdr.c         |   11 +++++++++++
 25-akpm/include/linux/nfs4.h      |    1 +
 25-akpm/include/linux/nfsd/nfsd.h |    2 +-
 3 files changed, 13 insertions(+), 1 deletion(-)

diff -puN fs/nfsd/nfs4xdr.c~knfsd-05-mounted_on_fileid-support fs/nfsd/nfs4xdr.c
--- 25/fs/nfsd/nfs4xdr.c~knfsd-05-mounted_on_fileid-support	2004-03-25 17:15:05.338217760 -0800
+++ 25-akpm/fs/nfsd/nfs4xdr.c	2004-03-25 17:15:05.345216696 -0800
@@ -1588,7 +1588,18 @@ nfsd4_encode_fattr(struct svc_fh *fhp, s
 		WRITE32(stat.mtime.tv_sec);
 		WRITE32(stat.mtime.tv_nsec);
 	}
+	if (bmval1 & FATTR4_WORD1_MOUNTED_ON_FILEID) {
+		struct dentry *mnt_pnt, *mnt_root;
 
+		if ((buflen -= 8) < 0)
+                	goto out_resource;
+		mnt_root = exp->ex_mnt->mnt_root;
+		if (mnt_root->d_inode == dentry->d_inode) {
+			mnt_pnt = exp->ex_mnt->mnt_mountpoint;
+			WRITE64((u64) mnt_pnt->d_inode->i_ino);
+		} else
+                	WRITE64((u64) stat.ino);
+	}
 	*attrlenp = htonl((char *)p - (char *)attrlenp - 4);
 	*countp = p - buffer;
 	status = nfs_ok;
diff -puN include/linux/nfs4.h~knfsd-05-mounted_on_fileid-support include/linux/nfs4.h
--- 25/include/linux/nfs4.h~knfsd-05-mounted_on_fileid-support	2004-03-25 17:15:05.340217456 -0800
+++ 25-akpm/include/linux/nfs4.h	2004-03-25 17:15:48.294687384 -0800
@@ -279,6 +279,7 @@ enum lock_type4 {
 #define FATTR4_WORD1_TIME_METADATA      (1UL << 20)
 #define FATTR4_WORD1_TIME_MODIFY        (1UL << 21)
 #define FATTR4_WORD1_TIME_MODIFY_SET    (1UL << 22)
+#define FATTR4_WORD1_MOUNTED_ON_FILEID  (1UL << 23)
 
 #define NFSPROC4_NULL 0
 #define NFSPROC4_COMPOUND 1
diff -puN include/linux/nfsd/nfsd.h~knfsd-05-mounted_on_fileid-support include/linux/nfsd/nfsd.h
--- 25/include/linux/nfsd/nfsd.h~knfsd-05-mounted_on_fileid-support	2004-03-25 17:15:05.341217304 -0800
+++ 25-akpm/include/linux/nfsd/nfsd.h	2004-03-25 17:15:05.347216392 -0800
@@ -278,7 +278,7 @@ static inline int is_fsid(struct svc_fh 
  | FATTR4_WORD1_SPACE_AVAIL     | FATTR4_WORD1_SPACE_FREE   | FATTR4_WORD1_SPACE_TOTAL      \
  | FATTR4_WORD1_SPACE_USED      | FATTR4_WORD1_TIME_ACCESS  | FATTR4_WORD1_TIME_ACCESS_SET  \
  | FATTR4_WORD1_TIME_CREATE     | FATTR4_WORD1_TIME_DELTA   | FATTR4_WORD1_TIME_METADATA    \
- | FATTR4_WORD1_TIME_MODIFY     | FATTR4_WORD1_TIME_MODIFY_SET)
+ | FATTR4_WORD1_TIME_MODIFY     | FATTR4_WORD1_TIME_MODIFY_SET | FATTR4_WORD1_MOUNTED_ON_FILEID)
 
 /* These will return ERR_INVAL if specified in GETATTR or READDIR. */
 #define NFSD_WRITEONLY_ATTRS_WORD1							    \

_