Re: [PATCH v8 04/10] btrfs: fix check_data_csum() error message for direct I/O

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 2021/3/17 上午3:43, Omar Sandoval wrote:
From: Omar Sandoval <osandov@xxxxxx>

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.

So direct IO pages doesn't have page::index set at all?

Any reproducer? I'd like to try to reproduce it first.


Fixes: 265d4ac03fdf ("btrfs: sink parameter start and len to check_data_csum")
Signed-off-by: Omar Sandoval <osandov@xxxxxx>
---
  fs/btrfs/inode.c | 14 +++++++++-----
  1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index ef6cb7b620d0..d2ece8554416 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -2947,11 +2947,13 @@ void btrfs_writepage_endio_finish_ordered(struct page *page, u64 start,
   * @bio_offset:	offset to the beginning of the bio (in bytes)
   * @page:	page where is the data to be verified
   * @pgoff:	offset inside the page
+ * @start:	logical offset in the file

Please add some comment if only for direct IO we need that @start parameter.

Thanks,
Qu
   *
   * The length of such check is always one sector size.
   */
  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);
  	SHASH_DESC_ON_STACK(shash, fs_info->csum_shash);
@@ -2978,8 +2980,8 @@ static int check_data_csum(struct inode *inode, struct btrfs_io_bio *io_bio,
  	kunmap_atomic(kaddr);
  	return 0;
  zeroit:
-	btrfs_print_data_csum_error(BTRFS_I(inode), page_offset(page) + pgoff,
-				    csum, csum_expected, io_bio->mirror_num);
+	btrfs_print_data_csum_error(BTRFS_I(inode), start, csum, csum_expected,
+				    io_bio->mirror_num);
  	if (io_bio->device)
  		btrfs_dev_stat_inc_and_print(io_bio->device,
  					     BTRFS_DEV_STAT_CORRUPTION_ERRS);
@@ -3032,7 +3034,8 @@ int btrfs_verify_data_csum(struct btrfs_io_bio *io_bio, u32 bio_offset,
  	     pg_off += sectorsize, bio_offset += sectorsize) {
  		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)
  			return -EIO;
  	}
@@ -7742,7 +7745,8 @@ static blk_status_t btrfs_check_read_dio_bio(struct inode *inode,
  			ASSERT(pgoff < PAGE_SIZE);
  			if (uptodate &&
  			    (!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,
  						 start, bvec.bv_page,
  						 btrfs_ino(BTRFS_I(inode)),





[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux