Lines Matching refs:rq

25 	int (*prepare_destpages)(struct z_erofs_decompress_req *rq,
27 int (*decompress)(struct z_erofs_decompress_req *rq, u8 *out);
31 static int z_erofs_lz4_prepare_destpages(struct z_erofs_decompress_req *rq,
35 PAGE_ALIGN(rq->pageofs_out + rq->outputsize) >> PAGE_SHIFT;
44 struct page *const page = rq->out[i];
54 availables[top++] = rq->out[i - LZ4_MAX_DISTANCE_PAGES];
85 rq->out[i] = victim;
90 static void *generic_copy_inplace_data(struct z_erofs_decompress_req *rq,
97 struct page **in = rq->in;
100 unsigned int inlen = rq->inputsize - pageofs_in;
117 static int z_erofs_lz4_decompress(struct z_erofs_decompress_req *rq, u8 *out)
124 if (rq->inputsize > PAGE_SIZE)
127 src = kmap_atomic(*rq->in);
132 if (EROFS_SB(rq->sb)->feature_incompat &
140 if (inputmargin >= rq->inputsize) {
147 inlen = rq->inputsize - inputmargin;
148 if (rq->inplace_io) {
149 const uint oend = (rq->pageofs_out +
150 rq->outputsize) & ~PAGE_MASK;
151 const uint nr = PAGE_ALIGN(rq->pageofs_out +
152 rq->outputsize) >> PAGE_SHIFT;
154 if (rq->partial_decoding || !support_0padding ||
155 rq->out[nr - 1] != rq->in[0] ||
156 rq->inputsize - oend <
158 src = generic_copy_inplace_data(rq, src, inputmargin);
165 if (rq->partial_decoding || !support_0padding)
167 inlen, rq->outputsize,
168 rq->outputsize);
171 inlen, rq->outputsize);
173 if (ret != rq->outputsize) {
174 erofs_err(rq->sb, "failed to decompress %d in[%u, %u] out[%u]",
175 ret, inlen, inputmargin, rq->outputsize);
180 16, 1, out, rq->outputsize, true);
183 memset(out + ret, 0, rq->outputsize - ret);
232 static int z_erofs_decompress_generic(struct z_erofs_decompress_req *rq,
236 PAGE_ALIGN(rq->pageofs_out + rq->outputsize) >> PAGE_SHIFT;
237 const struct z_erofs_decompressor *alg = decompressors + rq->alg;
242 if (nrpages_out == 1 && !rq->inplace_io) {
243 DBG_BUGON(!*rq->out);
244 dst = kmap_atomic(*rq->out);
254 if (rq->outputsize <= PAGE_SIZE * 7 / 8) {
259 rq->inplace_io = false;
260 ret = alg->decompress(rq, dst);
262 copy_from_pcpubuf(rq->out, dst, rq->pageofs_out,
263 rq->outputsize);
269 ret = alg->prepare_destpages(rq, pagepool);
273 dst = page_address(*rq->out);
280 dst = vm_map_ram(rq->out, nrpages_out, -1);
294 ret = alg->decompress(rq, dst + rq->pageofs_out);
303 static int z_erofs_shifted_transform(const struct z_erofs_decompress_req *rq,
307 PAGE_ALIGN(rq->pageofs_out + rq->outputsize) >> PAGE_SHIFT;
308 const unsigned int righthalf = PAGE_SIZE - rq->pageofs_out;
316 if (rq->out[0] == *rq->in) {
321 src = kmap_atomic(*rq->in);
322 if (rq->out[0]) {
323 dst = kmap_atomic(rq->out[0]);
324 memcpy(dst + rq->pageofs_out, src, righthalf);
329 DBG_BUGON(!rq->out[1]);
330 if (rq->out[1] == *rq->in) {
331 memmove(src, src + righthalf, rq->pageofs_out);
333 dst = kmap_atomic(rq->out[1]);
334 memcpy(dst, src + righthalf, rq->pageofs_out);
342 int z_erofs_decompress(struct z_erofs_decompress_req *rq,
345 if (rq->alg == Z_EROFS_COMPRESSION_SHIFTED)
346 return z_erofs_shifted_transform(rq, pagepool);
347 return z_erofs_decompress_generic(rq, pagepool);