erofs: insert to managed cache after adding to pcl
authorGao Xiang <hsiangkao@redhat.com>
Tue, 8 Dec 2020 09:58:33 +0000 (17:58 +0800)
committerGao Xiang <hsiangkao@redhat.com>
Tue, 8 Dec 2020 10:08:21 +0000 (18:08 +0800)
Previously, it could be some concern to call add_to_page_cache_lru()
with page->mapping == Z_EROFS_MAPPING_STAGING (!= NULL).

In contrast, page->private is used instead now, so partially revert
commit 5ddcee1f3a1c ("erofs: get rid of __stagingpage_alloc helper")
with some adaption for simplicity.

Link: https://lore.kernel.org/r/20201208095834.3133565-2-hsiangkao@redhat.com
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Gao Xiang <hsiangkao@redhat.com>
fs/erofs/zdata.c

index cfb0d11f893b79fdf9bb0bb927d59e1716d39eef..37fee144f0e7daea6fa7383bdf5d1d890ef9a799 100644 (file)
@@ -1065,29 +1065,21 @@ repeat:
        put_page(page);
 out_allocpage:
        page = erofs_allocpage(pagepool, gfp | __GFP_NOFAIL);
-       if (!tocache || add_to_page_cache_lru(page, mc, index + nr, gfp)) {
-               /* turn into temporary page if fails */
-               set_page_private(page, Z_EROFS_SHORTLIVED_PAGE);
-               tocache = false;
-       }
-
        if (oldpage != cmpxchg(&pcl->compressed_pages[nr], oldpage, page)) {
-               if (tocache) {
-                       /* since it added to managed cache successfully */
-                       unlock_page(page);
-                       put_page(page);
-               } else {
-                       list_add(&page->lru, pagepool);
-               }
+               list_add(&page->lru, pagepool);
                cond_resched();
                goto repeat;
        }
 
-       if (tocache) {
-               attach_page_private(page, pcl);
-               /* drop a ref added by allocpage (then we have 2 refs here) */
-               put_page(page);
+       if (!tocache || add_to_page_cache_lru(page, mc, index + nr, gfp)) {
+               /* turn into temporary page if fails (1 ref) */
+               set_page_private(page, Z_EROFS_SHORTLIVED_PAGE);
+               goto out;
        }
+       attach_page_private(page, pcl);
+       /* drop a refcount added by allocpage (then we have 2 refs here) */
+       put_page(page);
+
 out:   /* the only exit (for tracing and debugging) */
        return page;
 }