#include <linux/sunrpc/svc.h>
#include <linux/nfsd/nfsd.h>
#include <linux/nfsd/xdr3.h>
+#include <linux/vserver/xid.h>
#define NFSDDBG_FACILITY NFSDDBG_XDR
decode_sattr3(u32 *p, struct iattr *iap)
{
u32 tmp;
+ uid_t uid = 0;
+ gid_t gid = 0;
iap->ia_valid = 0;
}
if (*p++) {
iap->ia_valid |= ATTR_UID;
- iap->ia_uid = ntohl(*p++);
+ uid = ntohl(*p++);
}
if (*p++) {
iap->ia_valid |= ATTR_GID;
- iap->ia_gid = ntohl(*p++);
+ gid = ntohl(*p++);
}
+ iap->ia_uid = INOXID_UID(1, uid, gid);
+ iap->ia_gid = INOXID_GID(1, uid, gid);
+ iap->ia_xid = INOXID_XID(1, uid, gid, 0);
if (*p++) {
u64 newsize;
*p++ = htonl(nfs3_ftypes[(stat.mode & S_IFMT) >> 12]);
*p++ = htonl((u32) stat.mode);
*p++ = htonl((u32) stat.nlink);
- *p++ = htonl((u32) nfsd_ruid(rqstp, stat.uid));
- *p++ = htonl((u32) nfsd_rgid(rqstp, stat.gid));
+ *p++ = htonl((u32) nfsd_ruid(rqstp,
+ XIDINO_UID(XID_TAG(dentry->d_inode), stat.uid, stat.xid)));
+ *p++ = htonl((u32) nfsd_rgid(rqstp,
+ XIDINO_GID(XID_TAG(dentry->d_inode), stat.gid, stat.xid)));
if (S_ISLNK(stat.mode) && stat.size > NFS3_MAXPATHLEN) {
p = xdr_encode_hyper(p, (u64) NFS3_MAXPATHLEN);
} else {