Unverified Commit b9a9e98b authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!6882 f2fs: compress: fix to guarantee persisting compressed blocks by CP

parents 24d3440b 8fdeab05
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -1333,6 +1333,8 @@ void f2fs_compress_write_end_io(struct bio *bio, struct page *page)
	struct f2fs_sb_info *sbi = bio->bi_private;
	struct compress_io_ctx *cic =
			(struct compress_io_ctx *)page_private(page);
	enum count_type type = WB_DATA_TYPE(page,
				f2fs_is_compressed_page(page));
	int i;

	if (unlikely(bio->bi_status))
@@ -1340,7 +1342,7 @@ void f2fs_compress_write_end_io(struct bio *bio, struct page *page)

	f2fs_compress_free_page(page);

	dec_page_count(sbi, F2FS_WB_DATA);
	dec_page_count(sbi, type);

	if (atomic_dec_return(&cic->pending_pages))
		return;
+9 −9
Original line number Diff line number Diff line
@@ -71,7 +71,7 @@ struct bio *f2fs_bio_alloc(struct f2fs_sb_info *sbi, int npages, bool noio)
	return __f2fs_bio_alloc(GFP_KERNEL, npages);
}

static bool __is_cp_guaranteed(struct page *page)
bool f2fs_is_cp_guaranteed(struct page *page)
{
	struct address_space *mapping = page->mapping;
	struct inode *inode;
@@ -80,9 +80,6 @@ static bool __is_cp_guaranteed(struct page *page)
	if (!mapping)
		return false;

	if (f2fs_is_compressed_page(page))
		return false;

	inode = mapping->host;
	sbi = F2FS_I_SB(inode);

@@ -347,7 +344,7 @@ static void f2fs_write_end_io(struct bio *bio)

	bio_for_each_segment_all(bvec, bio, iter_all) {
		struct page *page = bvec->bv_page;
		enum count_type type = WB_DATA_TYPE(page);
		enum count_type type = WB_DATA_TYPE(page, false);

		if (IS_DUMMY_WRITTEN_PAGE(page)) {
			set_page_private(page, (unsigned long)NULL);
@@ -727,7 +724,7 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio)
	bio_set_op_attrs(bio, fio->op, fio->op_flags);

	inc_page_count(fio->sbi, is_read_io(fio->op) ?
			__read_io_type(page): WB_DATA_TYPE(fio->page));
			__read_io_type(page) : WB_DATA_TYPE(fio->page, false));

	__submit_bio(fio->sbi, bio, fio->type);
	return 0;
@@ -933,7 +930,7 @@ int f2fs_merge_page_bio(struct f2fs_io_info *fio)
	if (fio->io_wbc)
		wbc_account_cgroup_owner(fio->io_wbc, fio->page, PAGE_SIZE);

	inc_page_count(fio->sbi, WB_DATA_TYPE(page));
	inc_page_count(fio->sbi, WB_DATA_TYPE(page, false));

	*fio->last_block = fio->new_blkaddr;
	*fio->bio = bio;
@@ -947,6 +944,7 @@ void f2fs_submit_page_write(struct f2fs_io_info *fio)
	enum page_type btype = PAGE_TYPE_OF_BIO(fio->type);
	struct f2fs_bio_info *io = sbi->write_io[btype] + fio->temp;
	struct page *bio_page;
	enum count_type type;

	f2fs_bug_on(sbi, is_read_io(fio->op));

@@ -976,7 +974,8 @@ void f2fs_submit_page_write(struct f2fs_io_info *fio)
	/* set submitted = true as a return value */
	fio->submitted = true;

	inc_page_count(sbi, WB_DATA_TYPE(bio_page));
	type = WB_DATA_TYPE(bio_page, fio->compressed_page);
	inc_page_count(sbi, type);

	if (io->bio &&
	    (!io_is_mergeable(sbi, io->bio, io, fio, io->last_block_in_bio,
@@ -989,7 +988,8 @@ void f2fs_submit_page_write(struct f2fs_io_info *fio)
		if (F2FS_IO_ALIGNED(sbi) &&
				(fio->type == DATA || fio->type == NODE) &&
				fio->new_blkaddr & F2FS_IO_SIZE_MASK(sbi)) {
			dec_page_count(sbi, WB_DATA_TYPE(bio_page));
			dec_page_count(sbi, WB_DATA_TYPE(bio_page,
						fio->compressed_page));
			fio->retry = true;
			goto skip;
		}
+3 −1
Original line number Diff line number Diff line
@@ -994,7 +994,8 @@ struct f2fs_sm_info {
 * f2fs monitors the number of several block types such as on-writeback,
 * dirty dentry blocks, dirty node blocks, and dirty meta blocks.
 */
#define WB_DATA_TYPE(p)	(__is_cp_guaranteed(p) ? F2FS_WB_CP_DATA : F2FS_WB_DATA)
#define WB_DATA_TYPE(p, f)			\
	(f || f2fs_is_cp_guaranteed(p) ? F2FS_WB_CP_DATA : F2FS_WB_DATA)
enum count_type {
	F2FS_DIRTY_DENTS,
	F2FS_DIRTY_DATA,
@@ -3415,6 +3416,7 @@ void f2fs_destroy_checkpoint_caches(void);
 */
int __init f2fs_init_bioset(void);
void f2fs_destroy_bioset(void);
bool f2fs_is_cp_guaranteed(struct page *page);
struct bio *f2fs_bio_alloc(struct f2fs_sb_info *sbi, int npages, bool noio);
int f2fs_init_bio_entry_cache(void);
void f2fs_destroy_bio_entry_cache(void);