*/
 static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
 {
-       struct page *pages[NFS4ACL_MAXPAGES + 1] = {NULL, };
+       struct page **pages;
        struct nfs_getaclargs args = {
                .fh = NFS_FH(inode),
-               .acl_pages = pages,
                .acl_len = buflen,
        };
        struct nfs_getaclres res = {
                .rpc_argp = &args,
                .rpc_resp = &res,
        };
-       unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE) + 1;
+       unsigned int npages;
        int ret = -ENOMEM, i;
+       struct nfs_server *server = NFS_SERVER(inode);
 
-       if (npages > ARRAY_SIZE(pages))
-               return -ERANGE;
+       if (buflen == 0)
+               buflen = server->rsize;
+
+       npages = DIV_ROUND_UP(buflen, PAGE_SIZE) + 1;
+       pages = kmalloc_array(npages, sizeof(struct page *), GFP_NOFS);
+       if (!pages)
+               return -ENOMEM;
+
+       args.acl_pages = pages;
 
        for (i = 0; i < npages; i++) {
                pages[i] = alloc_page(GFP_KERNEL);
                        __free_page(pages[i]);
        if (res.acl_scratch)
                __free_page(res.acl_scratch);
+       kfree(pages);
        return ret;
 }