return squashfs_block_size(size);
 }
 
+void squashfs_fill_page(struct page *page, struct squashfs_cache_entry *buffer, int offset, int avail)
+{
+       int copied;
+       void *pageaddr;
+
+       pageaddr = kmap_atomic(page);
+       copied = squashfs_copy_data(pageaddr, buffer, offset, avail);
+       memset(pageaddr + copied, 0, PAGE_SIZE - copied);
+       kunmap_atomic(pageaddr);
+
+       flush_dcache_page(page);
+       if (copied == avail)
+               SetPageUptodate(page);
+       else
+               SetPageError(page);
+}
+
 /* Copy data into page cache  */
 void squashfs_copy_cache(struct page *page, struct squashfs_cache_entry *buffer,
        int bytes, int offset)
 {
        struct inode *inode = page->mapping->host;
        struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-       void *pageaddr;
        int i, mask = (1 << (msblk->block_log - PAGE_SHIFT)) - 1;
        int start_index = page->index & ~mask, end_index = start_index | mask;
 
                if (PageUptodate(push_page))
                        goto skip_page;
 
-               pageaddr = kmap_atomic(push_page);
-               squashfs_copy_data(pageaddr, buffer, offset, avail);
-               memset(pageaddr + avail, 0, PAGE_SIZE - avail);
-               kunmap_atomic(pageaddr);
-               flush_dcache_page(push_page);
-               SetPageUptodate(push_page);
+               squashfs_fill_page(push_page, buffer, offset, avail);
 skip_page:
                unlock_page(push_page);
                if (i != page->index)
 
        struct squashfs_cache_entry *buffer = squashfs_get_datablock(i->i_sb,
                                                 block, bsize);
        int bytes = buffer->length, res = buffer->error, n, offset = 0;
-       void *pageaddr;
 
        if (res) {
                ERROR("Unable to read page, block %llx, size %x\n", block,
                if (page[n] == NULL)
                        continue;
 
-               pageaddr = kmap_atomic(page[n]);
-               squashfs_copy_data(pageaddr, buffer, offset, avail);
-               memset(pageaddr + avail, 0, PAGE_SIZE - avail);
-               kunmap_atomic(pageaddr);
-               flush_dcache_page(page[n]);
-               SetPageUptodate(page[n]);
+               squashfs_fill_page(page[n], buffer, offset, avail);
                unlock_page(page[n]);
                if (page[n] != target_page)
                        put_page(page[n]);