]> err.no Git - linux-2.6/blobdiff - fs/nfs/nfs4xdr.c
[POWERPC] CPM: Rename commproc to cpm1 and cpm2_common.c to cpm2.c
[linux-2.6] / fs / nfs / nfs4xdr.c
index bec171a493a4069704e745a4d05d709ddb16e42f..51dd3804866f1575adc3ceeda8a47162796e1bbe 100644 (file)
@@ -376,10 +376,12 @@ static int nfs4_stat_to_errno(int);
                                decode_locku_maxsz)
 #define NFS4_enc_access_sz     (compound_encode_hdr_maxsz + \
                                encode_putfh_maxsz + \
-                               encode_access_maxsz)
+                               encode_access_maxsz + \
+                               encode_getattr_maxsz)
 #define NFS4_dec_access_sz     (compound_decode_hdr_maxsz + \
                                decode_putfh_maxsz + \
-                               decode_access_maxsz)
+                               decode_access_maxsz + \
+                               decode_getattr_maxsz)
 #define NFS4_enc_getattr_sz    (compound_encode_hdr_maxsz + \
                                encode_putfh_maxsz + \
                                encode_getattr_maxsz)
@@ -562,7 +564,6 @@ struct compound_hdr {
 
 #define RESERVE_SPACE(nbytes)  do {                            \
        p = xdr_reserve_space(xdr, nbytes);                     \
-       if (!p) printk("RESERVE_SPACE(%d) failed in function %s\n", (int) (nbytes), __FUNCTION__); \
        BUG_ON(!p);                                             \
 } while (0)
 
@@ -628,8 +629,8 @@ static int encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const s
        if (iap->ia_valid & ATTR_UID) {
                owner_namelen = nfs_map_uid_to_name(server->nfs_client, iap->ia_uid, owner_name);
                if (owner_namelen < 0) {
-                       printk(KERN_WARNING "nfs: couldn't resolve uid %d to string\n",
-                              iap->ia_uid);
+                       dprintk("nfs: couldn't resolve uid %d to string\n",
+                                       iap->ia_uid);
                        /* XXX */
                        strcpy(owner_name, "nobody");
                        owner_namelen = sizeof("nobody") - 1;
@@ -640,8 +641,8 @@ static int encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const s
        if (iap->ia_valid & ATTR_GID) {
                owner_grouplen = nfs_map_gid_to_group(server->nfs_client, iap->ia_gid, owner_group);
                if (owner_grouplen < 0) {
-                       printk(KERN_WARNING "nfs4: couldn't resolve gid %d to string\n",
-                              iap->ia_gid);
+                       dprintk("nfs: couldn't resolve gid %d to string\n",
+                                       iap->ia_gid);
                        strcpy(owner_group, "nobody");
                        owner_grouplen = sizeof("nobody") - 1;
                        /* goto out; */
@@ -711,7 +712,7 @@ static int encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const s
         * Now we backfill the bitmap and the attribute buffer length.
         */
        if (len != ((char *)p - (char *)q) + 4) {
-               printk ("encode_attr: Attr length calculation error! %u != %Zu\n",
+               printk(KERN_ERR "nfs: Attr length error, %u != %Zu\n",
                                len, ((char *)p - (char *)q) + 4);
                BUG();
        }
@@ -1201,21 +1202,11 @@ static int encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg
 
 static int encode_readlink(struct xdr_stream *xdr, const struct nfs4_readlink *readlink, struct rpc_rqst *req)
 {
-       struct rpc_auth *auth = req->rq_task->tk_msg.rpc_cred->cr_auth;
-       unsigned int replen;
        __be32 *p;
 
        RESERVE_SPACE(4);
        WRITE32(OP_READLINK);
 
-       /* set up reply kvec
-        *    toplevel_status + taglen + rescount + OP_PUTFH + status
-        *      + OP_READLINK + status + string length = 8
-        */
-       replen = (RPC_REPHDRSIZE + auth->au_rslack + 8) << 2;
-       xdr_inline_pages(&req->rq_rcv_buf, replen, readlink->pages,
-                       readlink->pgbase, readlink->pglen);
-       
        return 0;
 }
 
@@ -1386,14 +1377,20 @@ static int nfs4_xdr_enc_access(struct rpc_rqst *req, __be32 *p, const struct nfs
 {
        struct xdr_stream xdr;
        struct compound_hdr hdr = {
-               .nops = 2,
+               .nops = 3,
        };
        int status;
 
        xdr_init_encode(&xdr, &req->rq_snd_buf, p);
        encode_compound_hdr(&xdr, &hdr);
-       if ((status = encode_putfh(&xdr, args->fh)) == 0)
-               status = encode_access(&xdr, args->access);
+       status = encode_putfh(&xdr, args->fh);
+       if (status != 0)
+               goto out;
+       status = encode_access(&xdr, args->access);
+       if (status != 0)
+               goto out;
+       status = encode_getfattr(&xdr, args->bitmask);
+out:
        return status;
 }
 
@@ -1445,7 +1442,7 @@ out:
 /*
  * Encode REMOVE request
  */
-static int nfs4_xdr_enc_remove(struct rpc_rqst *req, __be32 *p, const struct nfs4_remove_arg *args)
+static int nfs4_xdr_enc_remove(struct rpc_rqst *req, __be32 *p, const struct nfs_removeargs *args)
 {
        struct xdr_stream xdr;
        struct compound_hdr hdr = {
@@ -1457,7 +1454,7 @@ static int nfs4_xdr_enc_remove(struct rpc_rqst *req, __be32 *p, const struct nfs
        encode_compound_hdr(&xdr, &hdr);
        if ((status = encode_putfh(&xdr, args->fh)) != 0)
                goto out;
-       if ((status = encode_remove(&xdr, args->name)) != 0)
+       if ((status = encode_remove(&xdr, &args->name)) != 0)
                goto out;
        status = encode_getfattr(&xdr, args->bitmask);
 out:
@@ -1781,6 +1778,8 @@ static int nfs4_xdr_enc_readlink(struct rpc_rqst *req, __be32 *p, const struct n
        struct compound_hdr hdr = {
                .nops = 2,
        };
+       struct rpc_auth *auth = req->rq_task->tk_msg.rpc_cred->cr_auth;
+       unsigned int replen;
        int status;
 
        xdr_init_encode(&xdr, &req->rq_snd_buf, p);
@@ -1789,6 +1788,15 @@ static int nfs4_xdr_enc_readlink(struct rpc_rqst *req, __be32 *p, const struct n
        if(status)
                goto out;
        status = encode_readlink(&xdr, args, req);
+
+       /* set up reply kvec
+        *    toplevel_status + taglen + rescount + OP_PUTFH + status
+        *      + OP_READLINK + status + string length = 8
+        */
+       replen = (RPC_REPHDRSIZE + auth->au_rslack + NFS4_dec_readlink_sz) << 2;
+       xdr_inline_pages(&req->rq_rcv_buf, replen, args->pages,
+                       args->pgbase, args->pglen);
+
 out:
        return status;
 }
@@ -1856,6 +1864,7 @@ static int nfs4_xdr_enc_read(struct rpc_rqst *req, __be32 *p, struct nfs_readarg
        replen = (RPC_REPHDRSIZE + auth->au_rslack + NFS4_dec_read_sz) << 2;
        xdr_inline_pages(&req->rq_rcv_buf, replen,
                         args->pages, args->pgbase, args->count);
+       req->rq_rcv_buf.flags |= XDRBUF_READ;
 out:
        return status;
 }
@@ -1932,6 +1941,7 @@ static int nfs4_xdr_enc_write(struct rpc_rqst *req, __be32 *p, struct nfs_writea
        status = encode_write(&xdr, args);
        if (status)
                goto out;
+       req->rq_snd_buf.flags |= XDRBUF_WRITE;
        status = encode_getfattr(&xdr, args->bitmask);
 out:
        return status;
@@ -2179,9 +2189,9 @@ out:
 #define READ_BUF(nbytes)  do { \
        p = xdr_inline_decode(xdr, nbytes); \
        if (unlikely(!p)) { \
-               printk(KERN_INFO "%s: prematurely hit end of receive" \
+               dprintk("nfs: %s: prematurely hit end of receive" \
                                " buffer\n", __FUNCTION__); \
-               printk(KERN_INFO "%s: xdr->p=%p, bytes=%u, xdr->end=%p\n", \
+               dprintk("nfs: %s: xdr->p=%p, bytes=%u, xdr->end=%p\n", \
                                __FUNCTION__, xdr->p, nbytes, xdr->end); \
                return -EIO; \
        } \
@@ -2222,9 +2232,8 @@ static int decode_op_hdr(struct xdr_stream *xdr, enum nfs_opnum4 expected)
        READ_BUF(8);
        READ32(opnum);
        if (opnum != expected) {
-               printk(KERN_NOTICE
-                               "nfs4_decode_op_hdr: Server returned operation"
-                               " %d but we issued a request for %d\n",
+               dprintk("nfs: Server returned operation"
+                       " %d but we issued a request for %d\n",
                                opnum, expected);
                return -EIO;
        }
@@ -2757,7 +2766,7 @@ static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, struct nf
                                dprintk("%s: nfs_map_name_to_uid failed!\n",
                                                __FUNCTION__);
                } else
-                       printk(KERN_WARNING "%s: name too long (%u)!\n",
+                       dprintk("%s: name too long (%u)!\n",
                                        __FUNCTION__, len);
                bitmap[1] &= ~FATTR4_WORD1_OWNER;
        }
@@ -2782,7 +2791,7 @@ static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap, struct nf
                                dprintk("%s: nfs_map_group_to_gid failed!\n",
                                                __FUNCTION__);
                } else
-                       printk(KERN_WARNING "%s: name too long (%u)!\n",
+                       dprintk("%s: name too long (%u)!\n",
                                        __FUNCTION__, len);
                bitmap[1] &= ~FATTR4_WORD1_OWNER_GROUP;
        }
@@ -2949,7 +2958,8 @@ static int verify_attr_len(struct xdr_stream *xdr, __be32 *savep, uint32_t attrl
        unsigned int nwords = xdr->p - savep;
 
        if (unlikely(attrwords != nwords)) {
-               printk(KERN_WARNING "%s: server returned incorrect attribute length: %u %c %u\n",
+               dprintk("%s: server returned incorrect attribute length: "
+                       "%u %c %u\n",
                                __FUNCTION__,
                                attrwords << 2,
                                (attrwords < nwords) ? '<' : '>',
@@ -3450,7 +3460,7 @@ static int decode_read(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs_
        hdrlen = (u8 *) p - (u8 *) iov->iov_base;
        recvd = req->rq_rcv_buf.len - hdrlen;
        if (count > recvd) {
-               printk(KERN_WARNING "NFS: server cheating in read reply: "
+               dprintk("NFS: server cheating in read reply: "
                                "count %u > recvd %u\n", count, recvd);
                count = recvd;
                eof = 0;
@@ -3499,7 +3509,8 @@ static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct n
                p += 2;                 /* cookie */
                len = ntohl(*p++);      /* filename length */
                if (len > NFS4_MAXNAMLEN) {
-                       printk(KERN_WARNING "NFS: giant filename in readdir (len 0x%x)\n", len);
+                       dprintk("NFS: giant filename in readdir (len 0x%x)\n",
+                                       len);
                        goto err_unmap;
                }
                xlen = XDR_QUADLEN(len);
@@ -3527,7 +3538,7 @@ short_pkt:
        entry[0] = entry[1] = 0;
        /* truncate listing ? */
        if (!nr) {
-               printk(KERN_NOTICE "NFS: readdir reply truncated!\n");
+               dprintk("NFS: readdir reply truncated!\n");
                entry[1] = 1;
        }
        goto out;
@@ -3553,13 +3564,13 @@ static int decode_readlink(struct xdr_stream *xdr, struct rpc_rqst *req)
        READ_BUF(4);
        READ32(len);
        if (len >= rcvbuf->page_len || len <= 0) {
-               dprintk(KERN_WARNING "nfs: server returned giant symlink!\n");
+               dprintk("nfs: server returned giant symlink!\n");
                return -ENAMETOOLONG;
        }
        hdrlen = (char *) xdr->p - (char *) iov->iov_base;
        recvd = req->rq_rcv_buf.len - hdrlen;
        if (recvd < len) {
-               printk(KERN_WARNING "NFS: server cheating in readlink reply: "
+               dprintk("NFS: server cheating in readlink reply: "
                                "count %u > recvd %u\n", len, recvd);
                return -EIO;
        }
@@ -3642,7 +3653,7 @@ static int decode_getacl(struct xdr_stream *xdr, struct rpc_rqst *req,
                hdrlen = (u8 *)xdr->p - (u8 *)iov->iov_base;
                recvd = req->rq_rcv_buf.len - hdrlen;
                if (attrlen > recvd) {
-                       printk(KERN_WARNING "NFS: server cheating in getattr"
+                       dprintk("NFS: server cheating in getattr"
                                        " acl reply: attrlen %u > recvd %u\n",
                                        attrlen, recvd);
                        return -EINVAL;
@@ -3687,8 +3698,7 @@ static int decode_setclientid(struct xdr_stream *xdr, struct nfs_client *clp)
        READ_BUF(8);
        READ32(opnum);
        if (opnum != OP_SETCLIENTID) {
-               printk(KERN_NOTICE
-                               "nfs4_decode_setclientid: Server returned operation"
+               dprintk("nfs: decode_setclientid: Server returned operation"
                                " %d\n", opnum);
                return -EIO;
        }
@@ -3782,8 +3792,13 @@ static int nfs4_xdr_dec_access(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_ac
        xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
        if ((status = decode_compound_hdr(&xdr, &hdr)) != 0)
                goto out;
-       if ((status = decode_putfh(&xdr)) == 0)
-               status = decode_access(&xdr, res);
+       status = decode_putfh(&xdr);
+       if (status != 0)
+               goto out;
+       status = decode_access(&xdr, res);
+       if (status != 0)
+               goto out;
+       decode_getfattr(&xdr, res->fattr, res->server);
 out:
        return status;
 }
@@ -3834,7 +3849,7 @@ out:
 /*
  * Decode REMOVE response
  */
-static int nfs4_xdr_dec_remove(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_remove_res *res)
+static int nfs4_xdr_dec_remove(struct rpc_rqst *rqstp, __be32 *p, struct nfs_removeres *res)
 {
        struct xdr_stream xdr;
        struct compound_hdr hdr;
@@ -3847,7 +3862,7 @@ static int nfs4_xdr_dec_remove(struct rpc_rqst *rqstp, __be32 *p, struct nfs4_re
                goto out;
        if ((status = decode_remove(&xdr, &res->cinfo)) != 0)
                goto out;
-       decode_getfattr(&xdr, res->dir_attr, res->server);
+       decode_getfattr(&xdr, &res->dir_attr, res->server);
 out:
        return status;
 }