Merge tag 'arm-dt-6.0' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
[linux-2.6-microblaze.git] / fs / erofs / decompressor_lzma.c
index 5004551..5e59b3f 100644 (file)
@@ -143,6 +143,7 @@ again:
        DBG_BUGON(z_erofs_lzma_head);
        z_erofs_lzma_head = head;
        spin_unlock(&z_erofs_lzma_lock);
+       wake_up_all(&z_erofs_lzma_wq);
 
        z_erofs_lzma_max_dictsize = dict_size;
        mutex_unlock(&lzma_resize_mutex);
@@ -156,7 +157,7 @@ int z_erofs_lzma_decompress(struct z_erofs_decompress_req *rq,
                PAGE_ALIGN(rq->pageofs_out + rq->outputsize) >> PAGE_SHIFT;
        const unsigned int nrpages_in =
                PAGE_ALIGN(rq->inputsize) >> PAGE_SHIFT;
-       unsigned int inputmargin, inlen, outlen, pageofs;
+       unsigned int inlen, outlen, pageofs;
        struct z_erofs_lzma *strm;
        u8 *kin;
        bool bounced = false;
@@ -164,16 +165,13 @@ int z_erofs_lzma_decompress(struct z_erofs_decompress_req *rq,
 
        /* 1. get the exact LZMA compressed size */
        kin = kmap(*rq->in);
-       inputmargin = 0;
-       while (!kin[inputmargin & ~PAGE_MASK])
-               if (!(++inputmargin & ~PAGE_MASK))
-                       break;
-
-       if (inputmargin >= PAGE_SIZE) {
+       err = z_erofs_fixup_insize(rq, kin + rq->pageofs_in,
+                                  min_t(unsigned int, rq->inputsize,
+                                        EROFS_BLKSIZ - rq->pageofs_in));
+       if (err) {
                kunmap(*rq->in);
-               return -EFSCORRUPTED;
+               return err;
        }
-       rq->inputsize -= inputmargin;
 
        /* 2. get an available lzma context */
 again:
@@ -193,9 +191,9 @@ again:
        xz_dec_microlzma_reset(strm->state, inlen, outlen,
                               !rq->partial_decoding);
        pageofs = rq->pageofs_out;
-       strm->buf.in = kin + inputmargin;
+       strm->buf.in = kin + rq->pageofs_in;
        strm->buf.in_pos = 0;
-       strm->buf.in_size = min_t(u32, inlen, PAGE_SIZE - inputmargin);
+       strm->buf.in_size = min_t(u32, inlen, PAGE_SIZE - rq->pageofs_in);
        inlen -= strm->buf.in_size;
        strm->buf.out = NULL;
        strm->buf.out_pos = 0;