/* * Encode CREATE arguments */ static int nfs3_xdr_createargs(struct rpc_rqst *req, __be32 *p, struct nfs3_createargs *args) { p = xdr_encode_fhandle(p, args->fh); p = xdr_encode_array(p, args->name, args->len); *p++ = htonl(args->createmode); if (args->createmode == NFS3_CREATE_EXCLUSIVE) { *p++ = args->verifier[0]; *p++ = args->verifier[1]; } else p = xdr_encode_sattr(p, args->sattr); req->rq_slen = xdr_adjust_iovec(req->rq_svec, p); return 0; }
int nfssvc_encode_entry(void *ccdv, const char *name, int namlen, loff_t offset, u64 ino, unsigned int d_type) { struct readdir_cd *ccd = ccdv; struct nfsd_readdirres *cd = container_of(ccd, struct nfsd_readdirres, common); __be32 *p = cd->buffer; int buflen, slen; /* dprintk("nfsd: entry(%.*s off %ld ino %ld)\n", namlen, name, offset, ino); */ if (offset > ~((u32) 0)) { cd->common.err = nfserr_fbig; return -EINVAL; } if (cd->offset) *cd->offset = htonl(offset); /* truncate filename */ namlen = min(namlen, NFS2_MAXNAMLEN); slen = XDR_QUADLEN(namlen); if ((buflen = cd->buflen - slen - 4) < 0) { cd->common.err = nfserr_toosmall; return -EINVAL; } if (ino > ~((u32) 0)) { cd->common.err = nfserr_fbig; return -EINVAL; } *p++ = xdr_one; /* mark entry present */ *p++ = htonl((u32) ino); /* file id */ p = xdr_encode_array(p, name, namlen);/* name length & name */ cd->offset = p; /* remember pointer */ *p++ = htonl(~0U); /* offset of next entry */ cd->buflen = buflen; cd->buffer = p; cd->common.err = nfs_ok; return 0; }
int nfssvc_encode_entry(void *ccdv, const char *name, int namlen, loff_t offset, u64 ino, unsigned int d_type) { struct readdir_cd *ccd = ccdv; struct nfsd_readdirres *cd = container_of(ccd, struct nfsd_readdirres, common); __be32 *p = cd->buffer; int buflen, slen; if (offset > ~((u32) 0)) { cd->common.err = nfserr_fbig; return -EINVAL; } if (cd->offset) *cd->offset = htonl(offset); if (namlen > NFS2_MAXNAMLEN) namlen = NFS2_MAXNAMLEN; slen = XDR_QUADLEN(namlen); if ((buflen = cd->buflen - slen - 4) < 0) { cd->common.err = nfserr_toosmall; return -EINVAL; } if (ino > ~((u32) 0)) { cd->common.err = nfserr_fbig; return -EINVAL; } *p++ = xdr_one; *p++ = htonl((u32) ino); p = xdr_encode_array(p, name, namlen); cd->offset = p; *p++ = htonl(~0U); cd->buflen = buflen; cd->buffer = p; cd->common.err = nfs_ok; return 0; }
static int encode_entry(struct readdir_cd *cd, const char *name, int namlen, off_t offset, ino_t ino, unsigned int d_type, int plus) { u32 *p = cd->buffer; int buflen, slen, elen; if (cd->offset) xdr_encode_hyper(cd->offset, (u64) offset); /* nfsd_readdir calls us with name == 0 when it wants us to * set the last offset entry. */ if (name == 0) return 0; /* dprintk("encode_entry(%.*s @%ld%s)\n", namlen, name, (long) offset, plus? " plus" : ""); */ /* truncate filename if too long */ if (namlen > NFS3_MAXNAMLEN) namlen = NFS3_MAXNAMLEN; slen = XDR_QUADLEN(namlen); elen = slen + NFS3_ENTRY_BAGGAGE + (plus? NFS3_ENTRYPLUS_BAGGAGE : 0); if ((buflen = cd->buflen - elen) < 0) { cd->eob = 1; return -EINVAL; } *p++ = xdr_one; /* mark entry present */ p = xdr_encode_hyper(p, ino); /* file id */ p = xdr_encode_array(p, name, namlen);/* name length & name */ cd->offset = p; /* remember pointer */ p = xdr_encode_hyper(p, NFS_OFFSET_MAX); /* offset of next entry */ /* throw in readdirplus baggage */ if (plus) { struct svc_fh fh; struct svc_export *exp; struct dentry *dparent, *dchild; dparent = cd->dirfh->fh_dentry; exp = cd->dirfh->fh_export; fh_init(&fh, NFS3_FHSIZE); if (isdotent(name, namlen)) { dchild = dparent; if (namlen == 2) dchild = dchild->d_parent; dchild = dget(dchild); } else dchild = lookup_one_len(name, dparent,namlen); if (IS_ERR(dchild)) goto noexec; if (fh_compose(&fh, exp, dchild, cd->dirfh) != 0 || !dchild->d_inode) goto noexec; p = encode_post_op_attr(cd->rqstp, p, &fh); *p++ = xdr_one; /* yes, a file handle follows */ p = encode_fh(p, &fh); fh_put(&fh); } out: cd->buflen = buflen; cd->buffer = p; return 0; noexec: *p++ = 0; *p++ = 0; goto out; }
/* * Common NFS XDR functions as inlines */ static inline __be32 * xdr_encode_fhandle(__be32 *p, const struct nfs_fh *fh) { return xdr_encode_array(p, fh->data, fh->size); }
/* * Common NFS XDR functions as inlines */ static inline u32 * xdr_encode_fhandle(u32 *p, struct nfs_fh *fh) { return xdr_encode_array(p, fh->data, fh->size); }
u32 * xdr_encode_string(u32 *p, const char *string) { return xdr_encode_array(p, string, strlen(string)); }