encode_nfs_fh3(xdr, args->fh);
        encode_uint32(xdr, args->mask);
-       if (args->mask & (NFS_ACL | NFS_DFACL))
+       if (args->mask & (NFS_ACL | NFS_DFACL)) {
                prepare_reply_buffer(req, args->pages, 0,
                                        NFSACL_MAXPAGES << PAGE_SHIFT,
                                        ACL3_getaclres_sz);
+               req->rq_rcv_buf.flags |= XDRBUF_SPARSE_PAGES;
+       }
 }
 
 static void nfs3_xdr_enc_setacl3args(struct rpc_rqst *req,
 
                        flags;          /* Flags for data disposition */
 #define XDRBUF_READ            0x01            /* target of file read */
 #define XDRBUF_WRITE           0x02            /* source of file write */
+#define XDRBUF_SPARSE_PAGES    0x04            /* Page array is sparse */
 
        unsigned int    buflen,         /* Total length of storage buffer */
                        len;            /* Length of XDR encoded message */
 
        xdr_inline_pages(&req->rq_rcv_buf,
                PAGE_SIZE/2 /* pretty arbitrary */,
                arg->pages, 0 /* page base */, arg->npages * PAGE_SIZE);
+       req->rq_rcv_buf.flags |= XDRBUF_SPARSE_PAGES;
 done:
        if (err)
                dprintk("RPC:       gssx_enc_accept_sec_context: %d\n", err);
 
 
                /* ACL likes to be lazy in allocating pages - ACLs
                 * are small by default but can get huge. */
-               if (unlikely(*ppage == NULL)) {
+               if ((xdr->flags & XDRBUF_SPARSE_PAGES) && *ppage == NULL) {
                        *ppage = alloc_page(GFP_ATOMIC);
                        if (unlikely(*ppage == NULL)) {
                                if (copied == 0)