diff -NurpP --minimal linux-2.6.8-rc2-vs1.9.2.15/fs/nfs/inode.c linux-2.6.8-rc2-vs1.9.2.15x/fs/nfs/inode.c --- linux-2.6.8-rc2-vs1.9.2.15/fs/nfs/inode.c 2004-07-28 20:27:01.000000000 +0200 +++ linux-2.6.8-rc2-vs1.9.2.15x/fs/nfs/inode.c 2004-08-01 05:55:27.000000000 +0200 @@ -390,6 +390,7 @@ nfs_create_client(struct nfs_server *ser clnt->cl_intr = (server->flags & NFS_MOUNT_INTR) ? 1 : 0; clnt->cl_softrtry = (server->flags & NFS_MOUNT_SOFT) ? 1 : 0; clnt->cl_droppriv = (server->flags & NFS_MOUNT_BROKEN_SUID) ? 1 : 0; + clnt->cl_tagxid = (server->flags & NFS_MOUNT_TAGXID) ? 1 : 0; clnt->cl_chatty = 1; return clnt; diff -NurpP --minimal linux-2.6.8-rc2-vs1.9.2.15/fs/nfs/nfs3xdr.c linux-2.6.8-rc2-vs1.9.2.15x/fs/nfs/nfs3xdr.c --- linux-2.6.8-rc2-vs1.9.2.15/fs/nfs/nfs3xdr.c 2004-07-28 20:27:01.000000000 +0200 +++ linux-2.6.8-rc2-vs1.9.2.15x/fs/nfs/nfs3xdr.c 2004-08-01 06:26:03.000000000 +0200 @@ -178,23 +178,30 @@ xdr_decode_fattr(u32 *p, struct nfs_fatt } static inline u32 * -xdr_encode_sattr(u32 *p, struct iattr *attr) +xdr_encode_sattr(u32 *p, struct iattr *attr, int tagxid) { + printk("xdr_encode_sattr: tagxid = %d\n", tagxid); if (attr->ia_valid & ATTR_MODE) { *p++ = xdr_one; *p++ = htonl(attr->ia_mode); } else { *p++ = xdr_zero; } - if (attr->ia_valid & ATTR_UID || attr->ia_valid & ATTR_XID) { + if (attr->ia_valid & ATTR_UID || + (tagxid && (attr->ia_valid & ATTR_XID))) { *p++ = xdr_one; - *p++ = htonl(XIDINO_UID(NULL, attr->ia_uid, attr->ia_xid)); + *p++ = htonl(tagxid ? + XIDINO_UID(NULL, attr->ia_uid, attr->ia_xid) + : attr->ia_uid); } else { *p++ = xdr_zero; } - if (attr->ia_valid & ATTR_GID || attr->ia_valid & ATTR_XID) { + if (attr->ia_valid & ATTR_GID || + (tagxid && (attr->ia_valid & ATTR_XID))) { *p++ = xdr_one; - *p++ = htonl(XIDINO_GID(NULL, attr->ia_gid, attr->ia_xid)); + *p++ = htonl(tagxid ? + XIDINO_GID(NULL, attr->ia_gid, attr->ia_xid) + : attr->ia_gid); } else { *p++ = xdr_zero; } @@ -279,7 +286,8 @@ static int nfs3_xdr_sattrargs(struct rpc_rqst *req, u32 *p, struct nfs3_sattrargs *args) { p = xdr_encode_fhandle(p, args->fh); - p = xdr_encode_sattr(p, args->sattr); + p = xdr_encode_sattr(p, args->sattr, + req->rq_task->tk_client->cl_tagxid); *p++ = htonl(args->guard); if (args->guard) p = xdr_encode_time3(p, &args->guardtime); @@ -370,7 +378,8 @@ nfs3_xdr_createargs(struct rpc_rqst *req *p++ = args->verifier[0]; *p++ = args->verifier[1]; } else - p = xdr_encode_sattr(p, args->sattr); + p = xdr_encode_sattr(p, args->sattr, + req->rq_task->tk_client->cl_tagxid); req->rq_slen = xdr_adjust_iovec(req->rq_svec, p); return 0; @@ -384,7 +393,8 @@ nfs3_xdr_mkdirargs(struct rpc_rqst *req, { p = xdr_encode_fhandle(p, args->fh); p = xdr_encode_array(p, args->name, args->len); - p = xdr_encode_sattr(p, args->sattr); + p = xdr_encode_sattr(p, args->sattr, + req->rq_task->tk_client->cl_tagxid); req->rq_slen = xdr_adjust_iovec(req->rq_svec, p); return 0; } @@ -397,7 +407,8 @@ nfs3_xdr_symlinkargs(struct rpc_rqst *re { p = xdr_encode_fhandle(p, args->fromfh); p = xdr_encode_array(p, args->fromname, args->fromlen); - p = xdr_encode_sattr(p, args->sattr); + p = xdr_encode_sattr(p, args->sattr, + req->rq_task->tk_client->cl_tagxid); p = xdr_encode_array(p, args->topath, args->tolen); req->rq_slen = xdr_adjust_iovec(req->rq_svec, p); return 0; @@ -412,7 +423,8 @@ nfs3_xdr_mknodargs(struct rpc_rqst *req, p = xdr_encode_fhandle(p, args->fh); p = xdr_encode_array(p, args->name, args->len); *p++ = htonl(args->type); - p = xdr_encode_sattr(p, args->sattr); + p = xdr_encode_sattr(p, args->sattr, + req->rq_task->tk_client->cl_tagxid); if (args->type == NF3CHR || args->type == NF3BLK) { *p++ = htonl(MAJOR(args->rdev)); *p++ = htonl(MINOR(args->rdev)); diff -NurpP --minimal linux-2.6.8-rc2-vs1.9.2.15/include/linux/sunrpc/clnt.h linux-2.6.8-rc2-vs1.9.2.15x/include/linux/sunrpc/clnt.h --- linux-2.6.8-rc2-vs1.9.2.15/include/linux/sunrpc/clnt.h 2004-06-16 07:19:36.000000000 +0200 +++ linux-2.6.8-rc2-vs1.9.2.15x/include/linux/sunrpc/clnt.h 2004-08-01 06:09:38.000000000 +0200 @@ -53,7 +53,8 @@ struct rpc_clnt { cl_autobind : 1,/* use getport() */ cl_droppriv : 1,/* enable NFS suid hack */ cl_oneshot : 1,/* dispose after use */ - cl_dead : 1;/* abandoned */ + cl_dead : 1,/* abandoned */ + cl_tagxid : 1;/* do xid tagging */ struct rpc_rtt * cl_rtt; /* RTO estimator data */ struct rpc_portmap * cl_pmap; /* port mapping */ diff -NurpP --minimal linux-2.6.8-rc2-vs1.9.2.15/net/sunrpc/auth_unix.c linux-2.6.8-rc2-vs1.9.2.15x/net/sunrpc/auth_unix.c --- linux-2.6.8-rc2-vs1.9.2.15/net/sunrpc/auth_unix.c 2004-08-01 04:03:16.000000000 +0200 +++ linux-2.6.8-rc2-vs1.9.2.15x/net/sunrpc/auth_unix.c 2004-08-01 06:33:12.000000000 +0200 @@ -157,7 +157,7 @@ unx_marshal(struct rpc_task *task, u32 * struct rpc_clnt *clnt = task->tk_client; struct unx_cred *cred = (struct unx_cred *) task->tk_msg.rpc_cred; u32 *base, *hold; - int i; + int i, tagxid; *p++ = htonl(RPC_AUTH_UNIX); base = p++; @@ -167,14 +167,23 @@ unx_marshal(struct rpc_task *task, u32 * * Copy the UTS nodename captured when the client was created. */ p = xdr_encode_array(p, clnt->cl_nodename, clnt->cl_nodelen); + tagxid = task->tk_client->cl_tagxid; /* Note: we don't use real uid if it involves raising privilege */ if (ruid && cred->uc_puid != 0 && cred->uc_pgid != 0) { - *p++ = htonl((u32) XIDINO_UID(NULL, cred->uc_puid, cred->uc_pxid)); - *p++ = htonl((u32) XIDINO_GID(NULL, cred->uc_pgid, cred->uc_pxid)); + *p++ = htonl((u32) (tagxid ? + XIDINO_UID(NULL, cred->uc_puid, cred->uc_pxid) + :cred->uc_puid)); + *p++ = htonl((u32) (tagxid ? + XIDINO_GID(NULL, cred->uc_pgid, cred->uc_pxid) + :cred->uc_pgid)); } else { - *p++ = htonl((u32) XIDINO_UID(NULL, cred->uc_uid, cred->uc_xid)); - *p++ = htonl((u32) XIDINO_GID(NULL, cred->uc_gid, cred->uc_xid)); + *p++ = htonl((u32) (tagxid ? + XIDINO_UID(NULL, cred->uc_uid, cred->uc_xid) + :cred->uc_puid)); + *p++ = htonl((u32) (tagxid ? + XIDINO_GID(NULL, cred->uc_gid, cred->uc_xid) + :cred->uc_pgid)); } hold = p++; for (i = 0; i < 16 && cred->uc_gids[i] != (gid_t) NOGROUP; i++)