Message ID | e33db7a6a4f56d0caedfe6a1aad131edca56b340.1605723568.git.osandov@fb.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | fs: interface for directly reading/writing compressed data | expand |
On Wed, Nov 18, 2020 at 11:18:12AM -0800, Omar Sandoval wrote: > From: Omar Sandoval <osandov@fb.com> > > 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: 1dae796aabf6 ("btrfs: inode: sink parameter start and len to check_data_csum()") This is part of the subpage preparatory patches still in misc-next , I can drop the part that removes the start parameter if you're going to use it.
On Mon, Nov 23, 2020 at 06:09:56PM +0100, David Sterba wrote: > On Wed, Nov 18, 2020 at 11:18:12AM -0800, Omar Sandoval wrote: > > From: Omar Sandoval <osandov@fb.com> > > > > 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: 1dae796aabf6 ("btrfs: inode: sink parameter start and len to check_data_csum()") > > This is part of the subpage preparatory patches still in misc-next , I > can drop the part that removes the start parameter if you're going to > use it. To be clear, the original patch is buggy. It causes check_data_csum() to print nonsense for checksum errors encountered during direct I/O. So, this should be probably be folded in to the original patch.
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index abc0fd162f6c..c5fa1bd3dfe7 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -2939,11 +2939,12 @@ void btrfs_writepage_endio_finish_ordered(struct page *page, u64 start, * @icsum: checksum index in the io_bio->csum array, size of csum_size * @page: page where is the data to be verified * @pgoff: offset inside the page + * @start: logical offset in the file * * The length of such check is always one sector size. */ static int check_data_csum(struct inode *inode, struct btrfs_io_bio *io_bio, - int icsum, struct page *page, int pgoff) + int icsum, struct page *page, int pgoff, u64 start) { struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); SHASH_DESC_ON_STACK(shash, fs_info->csum_shash); @@ -2968,8 +2969,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); @@ -3010,7 +3011,7 @@ int btrfs_verify_data_csum(struct btrfs_io_bio *io_bio, u64 phy_offset, } phy_offset >>= root->fs_info->sectorsize_bits; - return check_data_csum(inode, io_bio, phy_offset, page, offset); + return check_data_csum(inode, io_bio, phy_offset, page, offset, start); } /* @@ -7733,7 +7734,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, icsum, - bvec.bv_page, pgoff))) { + bvec.bv_page, pgoff, + start))) { clean_io_failure(fs_info, failure_tree, io_tree, start, bvec.bv_page, btrfs_ino(BTRFS_I(inode)),