[PATCH] knfsd: add some new fsid types
[safe/jmp/linux-2.6] / fs / nfsd / nfs3xdr.c
index e695660..6f67798 100644 (file)
@@ -149,6 +149,27 @@ decode_sattr3(__be32 *p, struct iattr *iap)
        return p;
 }
 
+static __be32 *encode_fsid(__be32 *p, struct svc_fh *fhp)
+{
+       u64 f;
+       switch(fsid_source(fhp)) {
+       default:
+       case FSIDSOURCE_DEV:
+               p = xdr_encode_hyper(p, (u64)huge_encode_dev
+                                    (fhp->fh_dentry->d_inode->i_sb->s_dev));
+               break;
+       case FSIDSOURCE_FSID:
+               p = xdr_encode_hyper(p, (u64) fhp->fh_export->ex_fsid);
+               break;
+       case FSIDSOURCE_UUID:
+               f = ((u64*)fhp->fh_export->ex_uuid)[0];
+               f ^= ((u64*)fhp->fh_export->ex_uuid)[1];
+               p = xdr_encode_hyper(p, f);
+               break;
+       }
+       return p;
+}
+
 static __be32 *
 encode_fattr3(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp,
              struct kstat *stat)
@@ -169,10 +190,7 @@ encode_fattr3(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp,
        p = xdr_encode_hyper(p, ((u64)stat->blocks) << 9);
        *p++ = htonl((u32) MAJOR(stat->rdev));
        *p++ = htonl((u32) MINOR(stat->rdev));
-       if (is_fsid(fhp, rqstp->rq_reffh))
-               p = xdr_encode_hyper(p, (u64) fhp->fh_export->ex_fsid);
-       else
-               p = xdr_encode_hyper(p, (u64) huge_encode_dev(stat->dev));
+       p = encode_fsid(p, fhp);
        p = xdr_encode_hyper(p, (u64) stat->ino);
        p = encode_time3(p, &stat->atime);
        lease_get_mtime(dentry->d_inode, &time); 
@@ -203,10 +221,7 @@ encode_saved_post_attr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)
        p = xdr_encode_hyper(p, ((u64)fhp->fh_post_blocks) << 9);
        *p++ = fhp->fh_post_rdev[0];
        *p++ = fhp->fh_post_rdev[1];
-       if (is_fsid(fhp, rqstp->rq_reffh))
-               p = xdr_encode_hyper(p, (u64) fhp->fh_export->ex_fsid);
-       else
-               p = xdr_encode_hyper(p, (u64)huge_encode_dev(inode->i_sb->s_dev));
+       p = encode_fsid(p, fhp);
        p = xdr_encode_hyper(p, (u64) inode->i_ino);
        p = encode_time3(p, &fhp->fh_post_atime);
        p = encode_time3(p, &fhp->fh_post_mtime);