Skip to content

Commit f94cf22

Browse files
Matthew Wilcox (Oracle)tytso
authored andcommitted
buffer: Make bh_offset() work for compound pages
If the buffer pointed to by the buffer_head is part of a compound page, bh_offset() assumes that b_page is the precise page that contains the data. A recent change to jbd2 inadvertently violated that assumption. By using page_size(), we support both b_page being set to the head page (as page_size() will return the size of the entire folio) and the precise page (as it will return PAGE_SIZE for a tail page). Fixes: 8147c4c ("jbd2: use a folio in jbd2_journal_write_metadata_buffer()") Reported-by: Zorro Lang <zlang@kernel.org> Tested-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
1 parent 768d612 commit f94cf22

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

include/linux/buffer_head.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,10 @@ static __always_inline int buffer_uptodate(const struct buffer_head *bh)
173173
return test_bit_acquire(BH_Uptodate, &bh->b_state);
174174
}
175175

176-
#define bh_offset(bh) ((unsigned long)(bh)->b_data & ~PAGE_MASK)
176+
static inline unsigned long bh_offset(const struct buffer_head *bh)
177+
{
178+
return (unsigned long)(bh)->b_data & (page_size(bh->b_page) - 1);
179+
}
177180

178181
/* If we *know* page->private refers to buffer_heads */
179182
#define page_buffers(page) \

0 commit comments

Comments
 (0)