Commit 082d5bb9 authored by Qu Wenruo's avatar Qu Wenruo Committed by David Sterba

btrfs: migrate extent_buffer::pages[] to folio

For now extent_buffer::pages[] are still only accepting single page
pointer, thus we can migrate to folios pretty easily.

As for single page, page and folio are 1:1 mapped, including their page
flags.

This patch would just do the conversion from struct page to struct
folio, providing the first step to higher order folio in the future.

This conversion is pretty simple:

- extent_buffer::pages[] -> extent_buffer::folios[]

- page_address(eb->pages[i]) -> folio_address(eb->pages[i])

- eb->pages[i] -> folio_page(eb->folios[i], 0)

There would be more specific cleanups preparing for the incoming higher
order folio support.
Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 09e6cef1
...@@ -27,7 +27,7 @@ static bool check_setget_bounds(const struct extent_buffer *eb, ...@@ -27,7 +27,7 @@ static bool check_setget_bounds(const struct extent_buffer *eb,
void btrfs_init_map_token(struct btrfs_map_token *token, struct extent_buffer *eb) void btrfs_init_map_token(struct btrfs_map_token *token, struct extent_buffer *eb)
{ {
token->eb = eb; token->eb = eb;
token->kaddr = page_address(eb->pages[0]); token->kaddr = folio_address(eb->folios[0]);
token->offset = 0; token->offset = 0;
} }
...@@ -50,7 +50,7 @@ void btrfs_init_map_token(struct btrfs_map_token *token, struct extent_buffer *e ...@@ -50,7 +50,7 @@ void btrfs_init_map_token(struct btrfs_map_token *token, struct extent_buffer *e
* an offset into the extent buffer page array, cast to a specific type. This * an offset into the extent buffer page array, cast to a specific type. This
* gives us all the type checking. * gives us all the type checking.
* *
* The extent buffer pages stored in the array pages do not form a contiguous * The extent buffer pages stored in the array folios may not form a contiguous
* phyusical range, but the API functions assume the linear offset to the range * phyusical range, but the API functions assume the linear offset to the range
* from 0 to metadata node size. * from 0 to metadata node size.
*/ */
...@@ -74,13 +74,13 @@ u##bits btrfs_get_token_##bits(struct btrfs_map_token *token, \ ...@@ -74,13 +74,13 @@ u##bits btrfs_get_token_##bits(struct btrfs_map_token *token, \
member_offset + size <= token->offset + PAGE_SIZE) { \ member_offset + size <= token->offset + PAGE_SIZE) { \
return get_unaligned_le##bits(token->kaddr + oip); \ return get_unaligned_le##bits(token->kaddr + oip); \
} \ } \
token->kaddr = page_address(token->eb->pages[idx]); \ token->kaddr = folio_address(token->eb->folios[idx]); \
token->offset = idx << PAGE_SHIFT; \ token->offset = idx << PAGE_SHIFT; \
if (INLINE_EXTENT_BUFFER_PAGES == 1 || oip + size <= PAGE_SIZE ) \ if (INLINE_EXTENT_BUFFER_PAGES == 1 || oip + size <= PAGE_SIZE ) \
return get_unaligned_le##bits(token->kaddr + oip); \ return get_unaligned_le##bits(token->kaddr + oip); \
\ \
memcpy(lebytes, token->kaddr + oip, part); \ memcpy(lebytes, token->kaddr + oip, part); \
token->kaddr = page_address(token->eb->pages[idx + 1]); \ token->kaddr = folio_address(token->eb->folios[idx + 1]); \
token->offset = (idx + 1) << PAGE_SHIFT; \ token->offset = (idx + 1) << PAGE_SHIFT; \
memcpy(lebytes + part, token->kaddr, size - part); \ memcpy(lebytes + part, token->kaddr, size - part); \
return get_unaligned_le##bits(lebytes); \ return get_unaligned_le##bits(lebytes); \
...@@ -91,7 +91,7 @@ u##bits btrfs_get_##bits(const struct extent_buffer *eb, \ ...@@ -91,7 +91,7 @@ u##bits btrfs_get_##bits(const struct extent_buffer *eb, \
const unsigned long member_offset = (unsigned long)ptr + off; \ const unsigned long member_offset = (unsigned long)ptr + off; \
const unsigned long oip = get_eb_offset_in_page(eb, member_offset); \ const unsigned long oip = get_eb_offset_in_page(eb, member_offset); \
const unsigned long idx = get_eb_page_index(member_offset); \ const unsigned long idx = get_eb_page_index(member_offset); \
char *kaddr = page_address(eb->pages[idx]); \ char *kaddr = folio_address(eb->folios[idx]); \
const int size = sizeof(u##bits); \ const int size = sizeof(u##bits); \
const int part = PAGE_SIZE - oip; \ const int part = PAGE_SIZE - oip; \
u8 lebytes[sizeof(u##bits)]; \ u8 lebytes[sizeof(u##bits)]; \
...@@ -101,7 +101,7 @@ u##bits btrfs_get_##bits(const struct extent_buffer *eb, \ ...@@ -101,7 +101,7 @@ u##bits btrfs_get_##bits(const struct extent_buffer *eb, \
return get_unaligned_le##bits(kaddr + oip); \ return get_unaligned_le##bits(kaddr + oip); \
\ \
memcpy(lebytes, kaddr + oip, part); \ memcpy(lebytes, kaddr + oip, part); \
kaddr = page_address(eb->pages[idx + 1]); \ kaddr = folio_address(eb->folios[idx + 1]); \
memcpy(lebytes + part, kaddr, size - part); \ memcpy(lebytes + part, kaddr, size - part); \
return get_unaligned_le##bits(lebytes); \ return get_unaligned_le##bits(lebytes); \
} \ } \
...@@ -125,7 +125,7 @@ void btrfs_set_token_##bits(struct btrfs_map_token *token, \ ...@@ -125,7 +125,7 @@ void btrfs_set_token_##bits(struct btrfs_map_token *token, \
put_unaligned_le##bits(val, token->kaddr + oip); \ put_unaligned_le##bits(val, token->kaddr + oip); \
return; \ return; \
} \ } \
token->kaddr = page_address(token->eb->pages[idx]); \ token->kaddr = folio_address(token->eb->folios[idx]); \
token->offset = idx << PAGE_SHIFT; \ token->offset = idx << PAGE_SHIFT; \
if (INLINE_EXTENT_BUFFER_PAGES == 1 || oip + size <= PAGE_SIZE) { \ if (INLINE_EXTENT_BUFFER_PAGES == 1 || oip + size <= PAGE_SIZE) { \
put_unaligned_le##bits(val, token->kaddr + oip); \ put_unaligned_le##bits(val, token->kaddr + oip); \
...@@ -133,7 +133,7 @@ void btrfs_set_token_##bits(struct btrfs_map_token *token, \ ...@@ -133,7 +133,7 @@ void btrfs_set_token_##bits(struct btrfs_map_token *token, \
} \ } \
put_unaligned_le##bits(val, lebytes); \ put_unaligned_le##bits(val, lebytes); \
memcpy(token->kaddr + oip, lebytes, part); \ memcpy(token->kaddr + oip, lebytes, part); \
token->kaddr = page_address(token->eb->pages[idx + 1]); \ token->kaddr = folio_address(token->eb->folios[idx + 1]); \
token->offset = (idx + 1) << PAGE_SHIFT; \ token->offset = (idx + 1) << PAGE_SHIFT; \
memcpy(token->kaddr, lebytes + part, size - part); \ memcpy(token->kaddr, lebytes + part, size - part); \
} \ } \
...@@ -143,7 +143,7 @@ void btrfs_set_##bits(const struct extent_buffer *eb, void *ptr, \ ...@@ -143,7 +143,7 @@ void btrfs_set_##bits(const struct extent_buffer *eb, void *ptr, \
const unsigned long member_offset = (unsigned long)ptr + off; \ const unsigned long member_offset = (unsigned long)ptr + off; \
const unsigned long oip = get_eb_offset_in_page(eb, member_offset); \ const unsigned long oip = get_eb_offset_in_page(eb, member_offset); \
const unsigned long idx = get_eb_page_index(member_offset); \ const unsigned long idx = get_eb_page_index(member_offset); \
char *kaddr = page_address(eb->pages[idx]); \ char *kaddr = folio_address(eb->folios[idx]); \
const int size = sizeof(u##bits); \ const int size = sizeof(u##bits); \
const int part = PAGE_SIZE - oip; \ const int part = PAGE_SIZE - oip; \
u8 lebytes[sizeof(u##bits)]; \ u8 lebytes[sizeof(u##bits)]; \
...@@ -156,7 +156,7 @@ void btrfs_set_##bits(const struct extent_buffer *eb, void *ptr, \ ...@@ -156,7 +156,7 @@ void btrfs_set_##bits(const struct extent_buffer *eb, void *ptr, \
\ \
put_unaligned_le##bits(val, lebytes); \ put_unaligned_le##bits(val, lebytes); \
memcpy(kaddr + oip, lebytes, part); \ memcpy(kaddr + oip, lebytes, part); \
kaddr = page_address(eb->pages[idx + 1]); \ kaddr = folio_address(eb->folios[idx + 1]); \
memcpy(kaddr, lebytes + part, size - part); \ memcpy(kaddr, lebytes + part, size - part); \
} }
......
...@@ -90,14 +90,14 @@ static inline void btrfs_set_token_##name(struct btrfs_map_token *token,\ ...@@ -90,14 +90,14 @@ static inline void btrfs_set_token_##name(struct btrfs_map_token *token,\
#define BTRFS_SETGET_HEADER_FUNCS(name, type, member, bits) \ #define BTRFS_SETGET_HEADER_FUNCS(name, type, member, bits) \
static inline u##bits btrfs_##name(const struct extent_buffer *eb) \ static inline u##bits btrfs_##name(const struct extent_buffer *eb) \
{ \ { \
const type *p = page_address(eb->pages[0]) + \ const type *p = folio_address(eb->folios[0]) + \
offset_in_page(eb->start); \ offset_in_page(eb->start); \
return get_unaligned_le##bits(&p->member); \ return get_unaligned_le##bits(&p->member); \
} \ } \
static inline void btrfs_set_##name(const struct extent_buffer *eb, \ static inline void btrfs_set_##name(const struct extent_buffer *eb, \
u##bits val) \ u##bits val) \
{ \ { \
type *p = page_address(eb->pages[0]) + offset_in_page(eb->start); \ type *p = folio_address(eb->folios[0]) + offset_in_page(eb->start); \
put_unaligned_le##bits(val, &p->member); \ put_unaligned_le##bits(val, &p->member); \
} }
......
...@@ -832,7 +832,7 @@ int btrfs_bin_search(struct extent_buffer *eb, int first_slot, ...@@ -832,7 +832,7 @@ int btrfs_bin_search(struct extent_buffer *eb, int first_slot,
if (oip + key_size <= PAGE_SIZE) { if (oip + key_size <= PAGE_SIZE) {
const unsigned long idx = get_eb_page_index(offset); const unsigned long idx = get_eb_page_index(offset);
char *kaddr = page_address(eb->pages[idx]); char *kaddr = folio_address(eb->folios[idx]);
oip = get_eb_offset_in_page(eb, offset); oip = get_eb_offset_in_page(eb, offset);
tmp = (struct btrfs_disk_key *)(kaddr + oip); tmp = (struct btrfs_disk_key *)(kaddr + oip);
......
...@@ -89,7 +89,7 @@ static void csum_tree_block(struct extent_buffer *buf, u8 *result) ...@@ -89,7 +89,7 @@ static void csum_tree_block(struct extent_buffer *buf, u8 *result)
first_page_part = fs_info->nodesize; first_page_part = fs_info->nodesize;
num_pages = 1; num_pages = 1;
} else { } else {
kaddr = page_address(buf->pages[0]); kaddr = folio_address(buf->folios[0]);
first_page_part = min_t(u32, PAGE_SIZE, fs_info->nodesize); first_page_part = min_t(u32, PAGE_SIZE, fs_info->nodesize);
num_pages = num_extent_pages(buf); num_pages = num_extent_pages(buf);
} }
...@@ -98,7 +98,7 @@ static void csum_tree_block(struct extent_buffer *buf, u8 *result) ...@@ -98,7 +98,7 @@ static void csum_tree_block(struct extent_buffer *buf, u8 *result)
first_page_part - BTRFS_CSUM_SIZE); first_page_part - BTRFS_CSUM_SIZE);
for (i = 1; i < num_pages && INLINE_EXTENT_BUFFER_PAGES > 1; i++) { for (i = 1; i < num_pages && INLINE_EXTENT_BUFFER_PAGES > 1; i++) {
kaddr = page_address(buf->pages[i]); kaddr = folio_address(buf->folios[i]);
crypto_shash_update(shash, kaddr, PAGE_SIZE); crypto_shash_update(shash, kaddr, PAGE_SIZE);
} }
memset(result, 0, BTRFS_CSUM_SIZE); memset(result, 0, BTRFS_CSUM_SIZE);
...@@ -184,13 +184,14 @@ static int btrfs_repair_eb_io_failure(const struct extent_buffer *eb, ...@@ -184,13 +184,14 @@ static int btrfs_repair_eb_io_failure(const struct extent_buffer *eb,
return -EROFS; return -EROFS;
for (i = 0; i < num_pages; i++) { for (i = 0; i < num_pages; i++) {
struct page *p = eb->pages[i]; u64 start = max_t(u64, eb->start, folio_pos(eb->folios[i]));
u64 start = max_t(u64, eb->start, page_offset(p)); u64 end = min_t(u64, eb->start + eb->len,
u64 end = min_t(u64, eb->start + eb->len, page_offset(p) + PAGE_SIZE); folio_pos(eb->folios[i]) + PAGE_SIZE);
u32 len = end - start; u32 len = end - start;
ret = btrfs_repair_io_failure(fs_info, 0, start, len, ret = btrfs_repair_io_failure(fs_info, 0, start, len,
start, p, offset_in_page(start), mirror_num); start, folio_page(eb->folios[i], 0),
offset_in_page(start), mirror_num);
if (ret) if (ret)
break; break;
} }
...@@ -277,8 +278,8 @@ blk_status_t btree_csum_one_bio(struct btrfs_bio *bbio) ...@@ -277,8 +278,8 @@ blk_status_t btree_csum_one_bio(struct btrfs_bio *bbio)
if (WARN_ON_ONCE(found_start != eb->start)) if (WARN_ON_ONCE(found_start != eb->start))
return BLK_STS_IOERR; return BLK_STS_IOERR;
if (WARN_ON(!btrfs_page_test_uptodate(fs_info, eb->pages[0], eb->start, if (WARN_ON(!btrfs_page_test_uptodate(fs_info, folio_page(eb->folios[0], 0),
eb->len))) eb->start, eb->len)))
return BLK_STS_IOERR; return BLK_STS_IOERR;
ASSERT(memcmp_extent_buffer(eb, fs_info->fs_devices->metadata_uuid, ASSERT(memcmp_extent_buffer(eb, fs_info->fs_devices->metadata_uuid,
...@@ -387,7 +388,7 @@ int btrfs_validate_extent_buffer(struct extent_buffer *eb, ...@@ -387,7 +388,7 @@ int btrfs_validate_extent_buffer(struct extent_buffer *eb,
} }
csum_tree_block(eb, result); csum_tree_block(eb, result);
header_csum = page_address(eb->pages[0]) + header_csum = folio_address(eb->folios[0]) +
get_eb_offset_in_page(eb, offsetof(struct btrfs_header, csum)); get_eb_offset_in_page(eb, offsetof(struct btrfs_header, csum));
if (memcmp(result, header_csum, csum_size) != 0) { if (memcmp(result, header_csum, csum_size) != 0) {
......
This diff is collapsed.
...@@ -94,7 +94,12 @@ struct extent_buffer { ...@@ -94,7 +94,12 @@ struct extent_buffer {
struct rw_semaphore lock; struct rw_semaphore lock;
struct page *pages[INLINE_EXTENT_BUFFER_PAGES]; /*
* Pointers to all the folios of the extent buffer.
*
* For now the folio is always order 0 (aka, a single page).
*/
struct folio *folios[INLINE_EXTENT_BUFFER_PAGES];
#ifdef CONFIG_BTRFS_DEBUG #ifdef CONFIG_BTRFS_DEBUG
struct list_head leak_list; struct list_head leak_list;
pid_t lock_owner; pid_t lock_owner;
......
...@@ -652,7 +652,7 @@ static void dump_eb_and_memory_contents(struct extent_buffer *eb, void *memory, ...@@ -652,7 +652,7 @@ static void dump_eb_and_memory_contents(struct extent_buffer *eb, void *memory,
const char *test_name) const char *test_name)
{ {
for (int i = 0; i < eb->len; i++) { for (int i = 0; i < eb->len; i++) {
struct page *page = eb->pages[i >> PAGE_SHIFT]; struct page *page = folio_page(eb->folios[i >> PAGE_SHIFT], 0);
void *addr = page_address(page) + offset_in_page(i); void *addr = page_address(page) + offset_in_page(i);
if (memcmp(addr, memory + i, 1) != 0) { if (memcmp(addr, memory + i, 1) != 0) {
...@@ -668,7 +668,7 @@ static int verify_eb_and_memory(struct extent_buffer *eb, void *memory, ...@@ -668,7 +668,7 @@ static int verify_eb_and_memory(struct extent_buffer *eb, void *memory,
const char *test_name) const char *test_name)
{ {
for (int i = 0; i < (eb->len >> PAGE_SHIFT); i++) { for (int i = 0; i < (eb->len >> PAGE_SHIFT); i++) {
void *eb_addr = page_address(eb->pages[i]); void *eb_addr = folio_address(eb->folios[i]);
if (memcmp(memory + (i << PAGE_SHIFT), eb_addr, PAGE_SIZE) != 0) { if (memcmp(memory + (i << PAGE_SHIFT), eb_addr, PAGE_SIZE) != 0) {
dump_eb_and_memory_contents(eb, memory, test_name); dump_eb_and_memory_contents(eb, memory, test_name);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment