*
* Kendrick Smith <kmsmith@umich.edu>
* Andy Adamson <andros@umich.edu>
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
#include <linux/nfs.h>
#include <linux/nfs4.h>
#include <linux/nfs_fs.h>
+#include <linux/nfs_idmap.h>
#define NFSDBG_FACILITY NFSDBG_XDR
return 0;
}
-/*
- * FIXME: The following dummy entries will be replaced once the userland
- * upcall gets in...
- */
-static int
-encode_uid(char *p, uid_t uid)
-{
- strcpy(p, "nobody");
- return 6;
-}
-
-/*
- * FIXME: The following dummy entries will be replaced once the userland
- * upcall gets in...
- */
-static int
-encode_gid(char *p, gid_t gid)
-{
- strcpy(p, "nobody");
- return 6;
-}
-
static int
-encode_attrs(struct xdr_stream *xdr, struct iattr *iap)
+encode_attrs(struct xdr_stream *xdr, struct iattr *iap,
+ struct nfs_server *server)
{
char owner_name[256];
char owner_group[256];
if (iap->ia_valid & ATTR_MODE)
len += 4;
if (iap->ia_valid & ATTR_UID) {
- status = owner_namelen = encode_uid(owner_name, iap->ia_uid);
+ status = nfs_idmap_name(server, IDMAP_TYPE_USER,
+ iap->ia_uid, owner_name, &owner_namelen);
if (status < 0) {
printk(KERN_WARNING "nfs: couldn't resolve uid %d to string\n",
iap->ia_uid);
- goto out;
+ /* XXX */
+ strcpy(owner_name, "nobody");
+ owner_namelen = sizeof("nobody") - 1;
+ /* goto out; */
}
len += 4 + (XDR_QUADLEN(owner_namelen) << 2);
}
if (iap->ia_valid & ATTR_GID) {
- status = owner_grouplen = encode_gid(owner_group, iap->ia_gid);
+ status = nfs_idmap_name(server, IDMAP_TYPE_GROUP,
+ iap->ia_gid, owner_group, &owner_grouplen);
if (status < 0) {
printk(KERN_WARNING "nfs4: couldn't resolve gid %d to string\n",
iap->ia_gid);
- goto out;
+ strcpy(owner_group, "nobody");
+ owner_grouplen = sizeof("nobody") - 1;
+ /* goto out; */
}
len += 4 + (XDR_QUADLEN(owner_grouplen) << 2);
}
}
static int
-encode_create(struct xdr_stream *xdr, struct nfs4_create *create)
+encode_create(struct xdr_stream *xdr, struct nfs4_create *create,
+ struct nfs_server *server)
{
uint32_t *p;
WRITE32(create->cr_namelen);
WRITEMEM(create->cr_name, create->cr_namelen);
- return encode_attrs(xdr, create->cr_attrs);
+ return encode_attrs(xdr, create->cr_attrs, server);
}
static int
else if (arg->u.attrs) {
RESERVE_SPACE(4);
WRITE32(arg->createmode);
- if ((status = encode_attrs(xdr, arg->u.attrs)))
+ if ((status = encode_attrs(xdr, arg->u.attrs, arg->server)))
return status;
}
else {
}
static int
-encode_setattr(struct xdr_stream *xdr, struct nfs_setattrargs *arg)
+encode_setattr(struct xdr_stream *xdr, struct nfs_setattrargs *arg,
+ struct nfs_server *server)
{
int status;
uint32_t *p;
WRITE32(OP_SETATTR);
WRITEMEM(arg->stateid, sizeof(nfs4_stateid));
- if ((status = encode_attrs(xdr, arg->iap)))
+ if ((status = encode_attrs(xdr, arg->iap, server)))
return status;
return 0;
status = encode_access(xdr, &cp->ops[i].u.access);
break;
case OP_CREATE:
- status = encode_create(xdr, &cp->ops[i].u.create);
+ status = encode_create(xdr, &cp->ops[i].u.create, cp->server);
break;
case OP_GETATTR:
status = encode_getattr(xdr, &cp->ops[i].u.getattr);
status = encode_savefh(&xdr);
if (status)
goto out;
- status = encode_open(&xdr,args);
+ status = encode_open(&xdr, args);
if (status)
goto out;
status = encode_getattr(&xdr, args->f_getattr);
*/
static int
nfs4_xdr_enc_setattr(struct rpc_rqst *req, uint32_t *p, struct nfs_setattrargs *args)
+
{
struct xdr_stream xdr;
struct compound_hdr hdr = {
status = encode_putfh(&xdr, args->fh);
if(status)
goto out;
- status = encode_setattr(&xdr, args);
+ status = encode_setattr(&xdr, args, args->server);
if(status)
goto out;
status = encode_getattr(&xdr, args->attr);
} \
} while (0)
-/*
- * FIXME: The following dummy entry will be replaced once the userland
- * upcall gets in...
- */
-static int
-decode_uid(char *p, uint32_t len, uid_t *uid)
-{
- *uid = -2;
- return 0;
-}
-
-/*
- * FIXME: The following dummy entry will be replaced once the userland
- * upcall gets in...
- */
-static int
-decode_gid(char *p, uint32_t len, gid_t *gid)
-{
- *gid = -2;
- return 0;
-}
-
static int
decode_compound_hdr(struct xdr_stream *xdr, struct compound_hdr *hdr)
{
extern uint32_t nfs4_pathconf_bitmap[2];
static int
-decode_getattr(struct xdr_stream *xdr, struct nfs4_getattr *getattr)
+decode_getattr(struct xdr_stream *xdr, struct nfs4_getattr *getattr,
+ struct nfs_server *server)
{
struct nfs_fattr *nfp = getattr->gt_attrs;
struct nfs_fsstat *fsstat = getattr->gt_fsstat;
}
if (bmval1 & FATTR4_WORD1_OWNER) {
READ_BUF(4);
- len += 4;
- READ32(dummy32); /* name length */
- if (dummy32 > XDR_MAX_NETOBJ) {
+ len += 4;
+ READ32(dummy32); /* name length */
+ if (dummy32 > XDR_MAX_NETOBJ) {
dprintk("read_attrs: name too long!\n");
- goto xdr_error;
- }
- READ_BUF(dummy32);
- len += (XDR_QUADLEN(dummy32) << 2);
- if ((status = decode_uid((char *)p, dummy32, &nfp->uid))) {
- dprintk("read_attrs: gss_get_num failed!\n");
- goto out;
- }
- dprintk("read_attrs: uid=%d\n", (int)nfp->uid);
+ goto xdr_error;
+ }
+ READ_BUF(dummy32);
+ len += (XDR_QUADLEN(dummy32) << 2);
+ if ((status = nfs_idmap_id(server, IDMAP_TYPE_USER,
+ (char *)p, len, &nfp->uid)) == -1) {
+ dprintk("read_attrs: gss_get_num failed!\n");
+ /* goto out; */
+ nfp->uid = -2;
+ }
+ dprintk("read_attrs: uid=%d\n", (int)nfp->uid);
}
if (bmval1 & FATTR4_WORD1_OWNER_GROUP) {
READ_BUF(4);
- len += 4;
- READ32(dummy32);
- if (dummy32 > XDR_MAX_NETOBJ) {
- dprintk("read_attrs: name too long!\n");
- goto xdr_error;
- }
- READ_BUF(dummy32);
- len += (XDR_QUADLEN(dummy32) << 2);
- if ((status = decode_gid((char *)p, dummy32, &nfp->gid))) {
- dprintk("read_attrs: gss_get_num failed!\n");
- goto out;
- }
- dprintk("read_attrs: gid=%d\n", (int)nfp->gid);
+ len += 4;
+ READ32(dummy32);
+ if (dummy32 > XDR_MAX_NETOBJ) {
+ dprintk("read_attrs: name too long!\n");
+ goto xdr_error;
+ }
+ READ_BUF(dummy32);
+ len += (XDR_QUADLEN(dummy32) << 2);
+ if ((status = nfs_idmap_id(server, IDMAP_TYPE_GROUP,
+ (char *)p, len, &nfp->gid)) == -1) {
+ dprintk("read_attrs: gss_get_num failed!\n");
+ nfp->gid = -2;
+ /* goto out; */
+ }
+ dprintk("read_attrs: gid=%d\n", (int)nfp->gid);
}
if (bmval1 & FATTR4_WORD1_RAWDEV) {
uint32_t major, minor;
status = decode_create(xdr, &op->u.create);
break;
case OP_GETATTR:
- status = decode_getattr(xdr, &op->u.getattr);
+ status = decode_getattr(xdr, &op->u.getattr, cp->server);
break;
case OP_GETFH:
status = decode_getfh(xdr, &op->u.getfh);
status = decode_open(&xdr, res);
if (status)
goto out;
- status = decode_getattr(&xdr, res->f_getattr);
+ status = decode_getattr(&xdr, res->f_getattr, res->server);
if (status)
goto out;
status = decode_getfh(&xdr, &gfh);
status = decode_restorefh(&xdr);
if (status)
goto out;
- status = decode_getattr(&xdr, res->d_getattr);
+ status = decode_getattr(&xdr, res->d_getattr, res->server);
if (status)
goto out;
out:
status = decode_setattr(&xdr, res);
if (status)
goto out;
- status = decode_getattr(&xdr, res->attr);
+ status = decode_getattr(&xdr, res->attr, res->server);
out:
return status;
}
#endif
#define PROC(proc, argtype, restype) \
-[NFSPROC4_CLNT_##proc] = { \
+[NFSPROC4_CLNT_##proc] = { \
.p_proc = NFSPROC4_COMPOUND, \
.p_encode = (kxdrproc_t) nfs4_xdr_##argtype, \
.p_decode = (kxdrproc_t) nfs4_xdr_##restype, \