diff options
| -rw-r--r-- | drivers/staging/erofs/unzip_vle.c | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/drivers/staging/erofs/unzip_vle.c b/drivers/staging/erofs/unzip_vle.c index c7b3b21123c1..31eef8395774 100644 --- a/drivers/staging/erofs/unzip_vle.c +++ b/drivers/staging/erofs/unzip_vle.c | |||
| @@ -972,6 +972,7 @@ repeat: | |||
| 972 | overlapped = false; | 972 | overlapped = false; |
| 973 | compressed_pages = grp->compressed_pages; | 973 | compressed_pages = grp->compressed_pages; |
| 974 | 974 | ||
| 975 | err = 0; | ||
| 975 | for (i = 0; i < clusterpages; ++i) { | 976 | for (i = 0; i < clusterpages; ++i) { |
| 976 | unsigned int pagenr; | 977 | unsigned int pagenr; |
| 977 | 978 | ||
| @@ -981,26 +982,39 @@ repeat: | |||
| 981 | DBG_BUGON(!page); | 982 | DBG_BUGON(!page); |
| 982 | DBG_BUGON(!page->mapping); | 983 | DBG_BUGON(!page->mapping); |
| 983 | 984 | ||
| 984 | if (z_erofs_is_stagingpage(page)) | 985 | if (!z_erofs_is_stagingpage(page)) { |
| 985 | continue; | ||
| 986 | #ifdef EROFS_FS_HAS_MANAGED_CACHE | 986 | #ifdef EROFS_FS_HAS_MANAGED_CACHE |
| 987 | if (page->mapping == MNGD_MAPPING(sbi)) { | 987 | if (page->mapping == MNGD_MAPPING(sbi)) { |
| 988 | DBG_BUGON(!PageUptodate(page)); | 988 | if (unlikely(!PageUptodate(page))) |
| 989 | continue; | 989 | err = -EIO; |
| 990 | } | 990 | continue; |
| 991 | } | ||
| 991 | #endif | 992 | #endif |
| 992 | 993 | ||
| 993 | /* only non-head page could be reused as a compressed page */ | 994 | /* |
| 994 | pagenr = z_erofs_onlinepage_index(page); | 995 | * only if non-head page can be selected |
| 996 | * for inplace decompression | ||
| 997 | */ | ||
| 998 | pagenr = z_erofs_onlinepage_index(page); | ||
| 995 | 999 | ||
| 996 | DBG_BUGON(pagenr >= nr_pages); | 1000 | DBG_BUGON(pagenr >= nr_pages); |
| 997 | DBG_BUGON(pages[pagenr]); | 1001 | DBG_BUGON(pages[pagenr]); |
| 998 | ++sparsemem_pages; | 1002 | ++sparsemem_pages; |
| 999 | pages[pagenr] = page; | 1003 | pages[pagenr] = page; |
| 1004 | |||
| 1005 | overlapped = true; | ||
| 1006 | } | ||
| 1000 | 1007 | ||
| 1001 | overlapped = true; | 1008 | /* PG_error needs checking for inplaced and staging pages */ |
| 1009 | if (unlikely(PageError(page))) { | ||
| 1010 | DBG_BUGON(PageUptodate(page)); | ||
| 1011 | err = -EIO; | ||
| 1012 | } | ||
| 1002 | } | 1013 | } |
| 1003 | 1014 | ||
| 1015 | if (unlikely(err)) | ||
| 1016 | goto out; | ||
| 1017 | |||
| 1004 | llen = (nr_pages << PAGE_SHIFT) - work->pageofs; | 1018 | llen = (nr_pages << PAGE_SHIFT) - work->pageofs; |
| 1005 | 1019 | ||
| 1006 | if (z_erofs_vle_workgrp_fmt(grp) == Z_EROFS_VLE_WORKGRP_FMT_PLAIN) { | 1020 | if (z_erofs_vle_workgrp_fmt(grp) == Z_EROFS_VLE_WORKGRP_FMT_PLAIN) { |
| @@ -1198,6 +1212,7 @@ repeat: | |||
| 1198 | if (page->mapping == mc) { | 1212 | if (page->mapping == mc) { |
| 1199 | WRITE_ONCE(grp->compressed_pages[nr], page); | 1213 | WRITE_ONCE(grp->compressed_pages[nr], page); |
| 1200 | 1214 | ||
| 1215 | ClearPageError(page); | ||
| 1201 | if (!PagePrivate(page)) { | 1216 | if (!PagePrivate(page)) { |
| 1202 | /* | 1217 | /* |
| 1203 | * impossible to be !PagePrivate(page) for | 1218 | * impossible to be !PagePrivate(page) for |
