mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-25 05:34:00 +08:00
btrfs: fix check_data_csum() error message for direct I/O
Commit 1dae796aabf6 ("btrfs: inode: sink parameter start and len to
check_data_csum()") replaced the start parameter to check_data_csum()
with page_offset(), but page_offset() is not meaningful for direct I/O
pages. Bring back the start parameter.
Fixes: 265d4ac03f
("btrfs: sink parameter start and len to check_data_csum")
CC: stable@vger.kernel.org # 5.11+
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
0bb7883009
commit
c1d6abdac4
@ -3099,11 +3099,13 @@ void btrfs_writepage_endio_finish_ordered(struct page *page, u64 start,
|
|||||||
* @bio_offset: offset to the beginning of the bio (in bytes)
|
* @bio_offset: offset to the beginning of the bio (in bytes)
|
||||||
* @page: page where is the data to be verified
|
* @page: page where is the data to be verified
|
||||||
* @pgoff: offset inside the page
|
* @pgoff: offset inside the page
|
||||||
|
* @start: logical offset in the file
|
||||||
*
|
*
|
||||||
* The length of such check is always one sector size.
|
* The length of such check is always one sector size.
|
||||||
*/
|
*/
|
||||||
static int check_data_csum(struct inode *inode, struct btrfs_io_bio *io_bio,
|
static int check_data_csum(struct inode *inode, struct btrfs_io_bio *io_bio,
|
||||||
u32 bio_offset, struct page *page, u32 pgoff)
|
u32 bio_offset, struct page *page, u32 pgoff,
|
||||||
|
u64 start)
|
||||||
{
|
{
|
||||||
struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
|
struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
|
||||||
SHASH_DESC_ON_STACK(shash, fs_info->csum_shash);
|
SHASH_DESC_ON_STACK(shash, fs_info->csum_shash);
|
||||||
@ -3130,8 +3132,8 @@ static int check_data_csum(struct inode *inode, struct btrfs_io_bio *io_bio,
|
|||||||
kunmap_atomic(kaddr);
|
kunmap_atomic(kaddr);
|
||||||
return 0;
|
return 0;
|
||||||
zeroit:
|
zeroit:
|
||||||
btrfs_print_data_csum_error(BTRFS_I(inode), page_offset(page) + pgoff,
|
btrfs_print_data_csum_error(BTRFS_I(inode), start, csum, csum_expected,
|
||||||
csum, csum_expected, io_bio->mirror_num);
|
io_bio->mirror_num);
|
||||||
if (io_bio->device)
|
if (io_bio->device)
|
||||||
btrfs_dev_stat_inc_and_print(io_bio->device,
|
btrfs_dev_stat_inc_and_print(io_bio->device,
|
||||||
BTRFS_DEV_STAT_CORRUPTION_ERRS);
|
BTRFS_DEV_STAT_CORRUPTION_ERRS);
|
||||||
@ -3184,7 +3186,8 @@ int btrfs_verify_data_csum(struct btrfs_io_bio *io_bio, u32 bio_offset,
|
|||||||
pg_off += sectorsize, bio_offset += sectorsize) {
|
pg_off += sectorsize, bio_offset += sectorsize) {
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = check_data_csum(inode, io_bio, bio_offset, page, pg_off);
|
ret = check_data_csum(inode, io_bio, bio_offset, page, pg_off,
|
||||||
|
page_offset(page) + pg_off);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
@ -7907,7 +7910,8 @@ static blk_status_t btrfs_check_read_dio_bio(struct inode *inode,
|
|||||||
ASSERT(pgoff < PAGE_SIZE);
|
ASSERT(pgoff < PAGE_SIZE);
|
||||||
if (uptodate &&
|
if (uptodate &&
|
||||||
(!csum || !check_data_csum(inode, io_bio,
|
(!csum || !check_data_csum(inode, io_bio,
|
||||||
bio_offset, bvec.bv_page, pgoff))) {
|
bio_offset, bvec.bv_page,
|
||||||
|
pgoff, start))) {
|
||||||
clean_io_failure(fs_info, failure_tree, io_tree,
|
clean_io_failure(fs_info, failure_tree, io_tree,
|
||||||
start, bvec.bv_page,
|
start, bvec.bv_page,
|
||||||
btrfs_ino(BTRFS_I(inode)),
|
btrfs_ino(BTRFS_I(inode)),
|
||||||
|
Loading…
Reference in New Issue
Block a user