3 * Phillip Lougher <phillip@squashfs.org.uk>
5 * This work is licensed under the terms of the GNU GPL, version 2. See
6 * the COPYING file in the top-level directory.
10 #include <linux/vfs.h>
11 #include <linux/kernel.h>
12 #include <linux/slab.h>
13 #include <linux/string.h>
14 #include <linux/pagemap.h>
15 #include <linux/mutex.h>
17 #include "squashfs_fs.h"
18 #include "squashfs_fs_sb.h"
19 #include "squashfs_fs_i.h"
21 #include "page_actor.h"
23 static int squashfs_read_cache(struct page
*target_page
, u64 block
, int bsize
,
24 int pages
, struct page
**page
);
26 /* Read separately compressed datablock directly into page cache */
27 int squashfs_readpage_block(struct page
*target_page
, u64 block
, int bsize
)
30 struct inode
*inode
= target_page
->mapping
->host
;
31 struct squashfs_sb_info
*msblk
= inode
->i_sb
->s_fs_info
;
33 int file_end
= (i_size_read(inode
) - 1) >> PAGE_CACHE_SHIFT
;
34 int mask
= (1 << (msblk
->block_log
- PAGE_CACHE_SHIFT
)) - 1;
35 int start_index
= target_page
->index
& ~mask
;
36 int end_index
= start_index
| mask
;
37 int i
, n
, pages
, missing_pages
, bytes
, res
= -ENOMEM
;
39 struct squashfs_page_actor
*actor
;
42 if (end_index
> file_end
)
45 pages
= end_index
- start_index
+ 1;
47 page
= kmalloc_array(pages
, sizeof(void *), GFP_KERNEL
);
52 * Create a "page actor" which will kmap and kunmap the
53 * page cache pages appropriately within the decompressor
55 actor
= squashfs_page_actor_init_special(page
, pages
, 0);
59 /* Try to grab all the pages covered by the Squashfs block */
60 for (missing_pages
= 0, i
= 0, n
= start_index
; i
< pages
; i
++, n
++) {
61 page
[i
] = (n
== target_page
->index
) ? target_page
:
62 grab_cache_page_nowait(target_page
->mapping
, n
);
64 if (page
[i
] == NULL
) {
69 if (PageUptodate(page
[i
])) {
71 page_cache_release(page
[i
]);
79 * Couldn't get one or more pages, this page has either
80 * been VM reclaimed, but others are still in the page cache
81 * and uptodate, or we're racing with another thread in
82 * squashfs_readpage also trying to grab them. Fall back to
83 * using an intermediate buffer.
85 res
= squashfs_read_cache(target_page
, block
, bsize
, pages
,
93 /* Decompress directly into the page cache buffers */
94 res
= squashfs_read_data(inode
->i_sb
, block
, bsize
, NULL
, actor
);
98 /* Last page may have trailing bytes not filled */
99 bytes
= res
% PAGE_CACHE_SIZE
;
101 pageaddr
= kmap_atomic(page
[pages
- 1]);
102 memset(pageaddr
+ bytes
, 0, PAGE_CACHE_SIZE
- bytes
);
103 kunmap_atomic(pageaddr
);
106 /* Mark pages as uptodate, unlock and release */
107 for (i
= 0; i
< pages
; i
++) {
108 flush_dcache_page(page
[i
]);
109 SetPageUptodate(page
[i
]);
110 unlock_page(page
[i
]);
111 if (page
[i
] != target_page
)
112 page_cache_release(page
[i
]);
121 /* Decompression failed, mark pages as errored. Target_page is
122 * dealt with by the caller
124 for (i
= 0; i
< pages
; i
++) {
125 if (page
[i
] == NULL
|| page
[i
] == target_page
)
127 flush_dcache_page(page
[i
]);
128 SetPageError(page
[i
]);
129 unlock_page(page
[i
]);
130 page_cache_release(page
[i
]);
140 static int squashfs_read_cache(struct page
*target_page
, u64 block
, int bsize
,
141 int pages
, struct page
**page
)
143 struct inode
*i
= target_page
->mapping
->host
;
144 struct squashfs_cache_entry
*buffer
= squashfs_get_datablock(i
->i_sb
,
146 int bytes
= buffer
->length
, res
= buffer
->error
, n
, offset
= 0;
150 ERROR("Unable to read page, block %llx, size %x\n", block
,
155 for (n
= 0; n
< pages
&& bytes
> 0; n
++,
156 bytes
-= PAGE_CACHE_SIZE
, offset
+= PAGE_CACHE_SIZE
) {
157 int avail
= min_t(int, bytes
, PAGE_CACHE_SIZE
);
162 pageaddr
= kmap_atomic(page
[n
]);
163 squashfs_copy_data(pageaddr
, buffer
, offset
, avail
);
164 memset(pageaddr
+ avail
, 0, PAGE_CACHE_SIZE
- avail
);
165 kunmap_atomic(pageaddr
);
166 flush_dcache_page(page
[n
]);
167 SetPageUptodate(page
[n
]);
168 unlock_page(page
[n
]);
169 if (page
[n
] != target_page
)
170 page_cache_release(page
[n
]);
174 squashfs_cache_put(buffer
);