Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 919eb288 authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

f2fs: clear PageError on the read path



When running fault injection test, I hit somewhat wrong behavior in f2fs_gc ->
gc_data_segment():

0. fault injection generated some PageError'ed pages

1. gc_data_segment
 -> f2fs_get_read_data_page(REQ_RAHEAD)

2. move_data_page
 -> f2fs_get_lock_data_page()
  -> f2f_get_read_data_page()
   -> f2fs_submit_page_read()
    -> submit_bio(READ)
  -> return EIO due to PageError
  -> fail to move data

Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 4d28ef1c
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -77,7 +77,8 @@ static void __read_end_io(struct bio *bio)
		/* PG_error was set if any post_read step failed */
		/* PG_error was set if any post_read step failed */
		if (bio->bi_status || PageError(page)) {
		if (bio->bi_status || PageError(page)) {
			ClearPageUptodate(page);
			ClearPageUptodate(page);
			SetPageError(page);
			/* will re-read again later */
			ClearPageError(page);
		} else {
		} else {
			SetPageUptodate(page);
			SetPageUptodate(page);
		}
		}
@@ -590,6 +591,7 @@ static int f2fs_submit_page_read(struct inode *inode, struct page *page,
		bio_put(bio);
		bio_put(bio);
		return -EFAULT;
		return -EFAULT;
	}
	}
	ClearPageError(page);
	__submit_bio(F2FS_I_SB(inode), bio, DATA);
	__submit_bio(F2FS_I_SB(inode), bio, DATA);
	return 0;
	return 0;
}
}
@@ -1578,6 +1580,7 @@ static int f2fs_mpage_readpages(struct address_space *mapping,
		if (bio_add_page(bio, page, blocksize, 0) < blocksize)
		if (bio_add_page(bio, page, blocksize, 0) < blocksize)
			goto submit_and_realloc;
			goto submit_and_realloc;


		ClearPageError(page);
		last_block_in_bio = block_nr;
		last_block_in_bio = block_nr;
		goto next_page;
		goto next_page;
set_error_page:
set_error_page: