btrfs: fix two misuses of folio_shift()
[ Upstream commit 01af106a076352182b2916b143fc50272600bd81 ] It is meaningless to shift a byte count by folio_shift(). The folio index is in units of PAGE_SIZE, not folio_size(). We can use folio_contains() to make this work for arbitrary-order folios, so remove the assertion that the folios are of order 0. Reviewed-by: Qu Wenruo <wqu@suse.com> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
3ceaafa26f
commit
d5ca39d336
@@ -526,8 +526,6 @@ static void end_bbio_data_read(struct btrfs_bio *bbio)
|
||||
u64 end;
|
||||
u32 len;
|
||||
|
||||
/* For now only order 0 folios are supported for data. */
|
||||
ASSERT(folio_order(folio) == 0);
|
||||
btrfs_debug(fs_info,
|
||||
"%s: bi_sector=%llu, err=%d, mirror=%u",
|
||||
__func__, bio->bi_iter.bi_sector, bio->bi_status,
|
||||
@@ -555,7 +553,6 @@ static void end_bbio_data_read(struct btrfs_bio *bbio)
|
||||
|
||||
if (likely(uptodate)) {
|
||||
loff_t i_size = i_size_read(inode);
|
||||
pgoff_t end_index = i_size >> folio_shift(folio);
|
||||
|
||||
/*
|
||||
* Zero out the remaining part if this range straddles
|
||||
@@ -564,9 +561,11 @@ static void end_bbio_data_read(struct btrfs_bio *bbio)
|
||||
* Here we should only zero the range inside the folio,
|
||||
* not touch anything else.
|
||||
*
|
||||
* NOTE: i_size is exclusive while end is inclusive.
|
||||
* NOTE: i_size is exclusive while end is inclusive and
|
||||
* folio_contains() takes PAGE_SIZE units.
|
||||
*/
|
||||
if (folio_index(folio) == end_index && i_size <= end) {
|
||||
if (folio_contains(folio, i_size >> PAGE_SHIFT) &&
|
||||
i_size <= end) {
|
||||
u32 zero_start = max(offset_in_folio(folio, i_size),
|
||||
offset_in_folio(folio, start));
|
||||
u32 zero_len = offset_in_folio(folio, end) + 1 -
|
||||
@@ -960,7 +959,7 @@ static int btrfs_do_readpage(struct folio *folio, struct extent_map **em_cached,
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (folio->index == last_byte >> folio_shift(folio)) {
|
||||
if (folio_contains(folio, last_byte >> PAGE_SHIFT)) {
|
||||
size_t zero_offset = offset_in_folio(folio, last_byte);
|
||||
|
||||
if (zero_offset) {
|
||||
|
||||
Reference in New Issue
Block a user