Skip to content

Commit

Permalink
staging: erofs: move stagingpage operations to compress.h
Browse files Browse the repository at this point in the history
stagingpages are behaved as bounce pages for temporary use.
Move to compress.h since the upcoming decompressor will
allocate stagingpages as well.

Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Gao Xiang <gaoxiang25@huawei.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Gao Xiang authored and Greg Kroah-Hartman committed Jun 26, 2019
1 parent fa61a33 commit 2748123
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 25 deletions.
40 changes: 40 additions & 0 deletions drivers/staging/erofs/compress.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* linux/drivers/staging/erofs/compress.h
*
* Copyright (C) 2019 HUAWEI, Inc.
* http://www.huawei.com/
* Created by Gao Xiang <gaoxiang25@huawei.com>
*/
#ifndef __EROFS_FS_COMPRESS_H
#define __EROFS_FS_COMPRESS_H

/*
* - 0x5A110C8D ('sallocated', Z_EROFS_MAPPING_STAGING) -
* used to mark temporary allocated pages from other
* file/cached pages and NULL mapping pages.
*/
#define Z_EROFS_MAPPING_STAGING ((void *)0x5A110C8D)

/* check if a page is marked as staging */
static inline bool z_erofs_page_is_staging(struct page *page)
{
return page->mapping == Z_EROFS_MAPPING_STAGING;
}

static inline bool z_erofs_put_stagingpage(struct list_head *pagepool,
struct page *page)
{
if (!z_erofs_page_is_staging(page))
return false;

/* staging pages should not be used by others at the same time */
if (page_ref_count(page) > 1)
put_page(page);
else
list_add(&page->lru, pagepool);
return true;
}

#endif

11 changes: 6 additions & 5 deletions drivers/staging/erofs/unzip_vle.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
* distribution for more details.
*/
#include "unzip_vle.h"
#include "compress.h"
#include <linux/prefetch.h>

#include <trace/events/erofs.h>
Expand Down Expand Up @@ -855,7 +856,7 @@ static inline void z_erofs_vle_read_endio(struct bio *bio)
DBG_BUGON(PageUptodate(page));
DBG_BUGON(!page->mapping);

if (unlikely(!sbi && !z_erofs_is_stagingpage(page))) {
if (unlikely(!sbi && !z_erofs_page_is_staging(page))) {
sbi = EROFS_SB(page->mapping->host->i_sb);

if (time_to_inject(sbi, FAULT_READ_IO)) {
Expand Down Expand Up @@ -947,7 +948,7 @@ static int z_erofs_vle_unzip(struct super_block *sb,
DBG_BUGON(!page);
DBG_BUGON(!page->mapping);

if (z_erofs_gather_if_stagingpage(page_pool, page))
if (z_erofs_put_stagingpage(page_pool, page))
continue;

if (page_type == Z_EROFS_VLE_PAGE_TYPE_HEAD)
Expand Down Expand Up @@ -977,7 +978,7 @@ static int z_erofs_vle_unzip(struct super_block *sb,
DBG_BUGON(!page);
DBG_BUGON(!page->mapping);

if (!z_erofs_is_stagingpage(page)) {
if (!z_erofs_page_is_staging(page)) {
if (erofs_page_is_managed(sbi, page)) {
if (unlikely(!PageUptodate(page)))
err = -EIO;
Expand Down Expand Up @@ -1055,7 +1056,7 @@ static int z_erofs_vle_unzip(struct super_block *sb,
continue;

/* recycle all individual staging pages */
(void)z_erofs_gather_if_stagingpage(page_pool, page);
(void)z_erofs_put_stagingpage(page_pool, page);

WRITE_ONCE(compressed_pages[i], NULL);
}
Expand All @@ -1068,7 +1069,7 @@ static int z_erofs_vle_unzip(struct super_block *sb,
DBG_BUGON(!page->mapping);

/* recycle all individual staging pages */
if (z_erofs_gather_if_stagingpage(page_pool, page))
if (z_erofs_put_stagingpage(page_pool, page))
continue;

if (unlikely(err < 0))
Expand Down
20 changes: 0 additions & 20 deletions drivers/staging/erofs/unzip_vle.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,26 +16,6 @@
#include "internal.h"
#include "unzip_pagevec.h"

/*
* - 0x5A110C8D ('sallocated', Z_EROFS_MAPPING_STAGING) -
* used for temporary allocated pages (via erofs_allocpage),
* in order to seperate those from NULL mapping (eg. truncated pages)
*/
#define Z_EROFS_MAPPING_STAGING ((void *)0x5A110C8D)

#define z_erofs_is_stagingpage(page) \
((page)->mapping == Z_EROFS_MAPPING_STAGING)

static inline bool z_erofs_gather_if_stagingpage(struct list_head *page_pool,
struct page *page)
{
if (z_erofs_is_stagingpage(page)) {
list_add(&page->lru, page_pool);
return true;
}
return false;
}

/*
* Structure fields follow one of the following exclusion rules.
*
Expand Down

0 comments on commit 2748123

Please sign in to comment.