Skip to content

Commit affc5af

Browse files
committed
Merge tag 'for-6.8-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux
Pull btrfs updates from David Sterba: "There are no exciting changes for users, it's been mostly API conversions and some fixes or refactoring. The mount API conversion is a base for future improvements that would come with VFS. Metadata processing has been converted to folios, not yet enabling the large folios but it's one patch away once everything gets tested enough. Core changes: - convert extent buffers to folios: - direct API conversion where possible - performance can drop by a few percent on metadata heavy workloads, the folio sizes are not constant and the calculations add up in the item helpers - both regular and subpage modes - data cannot be converted yet, we need to port that to iomap and there are some other generic changes required - convert mount to the new API, should not be user visible: - options deprecated long time ago have been removed: inode_cache, recovery - the new logic that splits mount to two phases slightly changes timing of device scanning for multi-device filesystems - LSM options will now work (like for selinux) - convert delayed nodes radix tree to xarray, preserving the preload-like logic that still allows to allocate with GFP_NOFS - more validation of sysfs value of scrub_speed_max - refactor chunk map structure, reduce size and improve performance - extent map refactoring, smaller data structures, improved performance - reduce size of struct extent_io_tree, embedded in several structures - temporary pages used for compression are cached and attached to a shrinker, this may slightly improve performance - in zoned mode, remove redirty extent buffer tracking, zeros are written in case an out-of-order is detected and proper data are written to the actual write pointer - cleanups, refactoring, error message improvements, updated tests - verify and update branch name or tag - remove unwanted text" * tag 'for-6.8-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: (89 commits) btrfs: pass btrfs_io_geometry into btrfs_max_io_len btrfs: pass struct btrfs_io_geometry to set_io_stripe btrfs: open code set_io_stripe for RAID56 btrfs: change block mapping to switch/case in btrfs_map_block btrfs: factor out block mapping for single profiles btrfs: factor out block mapping for RAID5/6 btrfs: reduce scope of data_stripes in btrfs_map_block btrfs: factor out block mapping for RAID10 btrfs: factor out block mapping for DUP profiles btrfs: factor out RAID1 block mapping btrfs: factor out block-mapping for RAID0 btrfs: re-introduce struct btrfs_io_geometry btrfs: factor out helper for single device IO check btrfs: migrate btrfs_repair_io_failure() to folio interfaces btrfs: migrate eb_bitmap_offset() to folio interfaces btrfs: migrate various end io functions to folios btrfs: migrate subpage code to folio interfaces btrfs: migrate get_eb_page_index() and get_eb_offset_in_page() to folios btrfs: don't double put our subpage reference in alloc_extent_buffer btrfs: cleanup metadata page pointer usage ...
2 parents 12958e9 + e94dfb7 commit affc5af

61 files changed

Lines changed: 3883 additions & 3184 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

fs/btrfs/accessors.c

Lines changed: 54 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ static bool check_setget_bounds(const struct extent_buffer *eb,
2727
void btrfs_init_map_token(struct btrfs_map_token *token, struct extent_buffer *eb)
2828
{
2929
token->eb = eb;
30-
token->kaddr = page_address(eb->pages[0]);
30+
token->kaddr = folio_address(eb->folios[0]);
3131
token->offset = 0;
3232
}
3333

@@ -50,7 +50,7 @@ void btrfs_init_map_token(struct btrfs_map_token *token, struct extent_buffer *e
5050
* an offset into the extent buffer page array, cast to a specific type. This
5151
* gives us all the type checking.
5252
*
53-
* The extent buffer pages stored in the array pages do not form a contiguous
53+
* The extent buffer pages stored in the array folios may not form a contiguous
5454
* phyusical range, but the API functions assume the linear offset to the range
5555
* from 0 to metadata node size.
5656
*/
@@ -60,48 +60,52 @@ u##bits btrfs_get_token_##bits(struct btrfs_map_token *token, \
6060
const void *ptr, unsigned long off) \
6161
{ \
6262
const unsigned long member_offset = (unsigned long)ptr + off; \
63-
const unsigned long idx = get_eb_page_index(member_offset); \
64-
const unsigned long oip = get_eb_offset_in_page(token->eb, \
65-
member_offset); \
63+
const unsigned long idx = get_eb_folio_index(token->eb, member_offset); \
64+
const unsigned long oil = get_eb_offset_in_folio(token->eb, \
65+
member_offset);\
66+
const int unit_size = folio_size(token->eb->folios[0]); \
67+
const int unit_shift = folio_shift(token->eb->folios[0]); \
6668
const int size = sizeof(u##bits); \
6769
u8 lebytes[sizeof(u##bits)]; \
68-
const int part = PAGE_SIZE - oip; \
70+
const int part = unit_size - oil; \
6971
\
7072
ASSERT(token); \
7173
ASSERT(token->kaddr); \
7274
ASSERT(check_setget_bounds(token->eb, ptr, off, size)); \
7375
if (token->offset <= member_offset && \
74-
member_offset + size <= token->offset + PAGE_SIZE) { \
75-
return get_unaligned_le##bits(token->kaddr + oip); \
76+
member_offset + size <= token->offset + unit_size) { \
77+
return get_unaligned_le##bits(token->kaddr + oil); \
7678
} \
77-
token->kaddr = page_address(token->eb->pages[idx]); \
78-
token->offset = idx << PAGE_SHIFT; \
79-
if (INLINE_EXTENT_BUFFER_PAGES == 1 || oip + size <= PAGE_SIZE ) \
80-
return get_unaligned_le##bits(token->kaddr + oip); \
79+
token->kaddr = folio_address(token->eb->folios[idx]); \
80+
token->offset = idx << unit_shift; \
81+
if (INLINE_EXTENT_BUFFER_PAGES == 1 || oil + size <= unit_size) \
82+
return get_unaligned_le##bits(token->kaddr + oil); \
8183
\
82-
memcpy(lebytes, token->kaddr + oip, part); \
83-
token->kaddr = page_address(token->eb->pages[idx + 1]); \
84-
token->offset = (idx + 1) << PAGE_SHIFT; \
84+
memcpy(lebytes, token->kaddr + oil, part); \
85+
token->kaddr = folio_address(token->eb->folios[idx + 1]); \
86+
token->offset = (idx + 1) << unit_shift; \
8587
memcpy(lebytes + part, token->kaddr, size - part); \
8688
return get_unaligned_le##bits(lebytes); \
8789
} \
8890
u##bits btrfs_get_##bits(const struct extent_buffer *eb, \
8991
const void *ptr, unsigned long off) \
9092
{ \
9193
const unsigned long member_offset = (unsigned long)ptr + off; \
92-
const unsigned long oip = get_eb_offset_in_page(eb, member_offset); \
93-
const unsigned long idx = get_eb_page_index(member_offset); \
94-
char *kaddr = page_address(eb->pages[idx]); \
94+
const unsigned long idx = get_eb_folio_index(eb, member_offset);\
95+
const unsigned long oil = get_eb_offset_in_folio(eb, \
96+
member_offset);\
97+
const int unit_size = folio_size(eb->folios[0]); \
98+
char *kaddr = folio_address(eb->folios[idx]); \
9599
const int size = sizeof(u##bits); \
96-
const int part = PAGE_SIZE - oip; \
100+
const int part = unit_size - oil; \
97101
u8 lebytes[sizeof(u##bits)]; \
98102
\
99103
ASSERT(check_setget_bounds(eb, ptr, off, size)); \
100-
if (INLINE_EXTENT_BUFFER_PAGES == 1 || oip + size <= PAGE_SIZE) \
101-
return get_unaligned_le##bits(kaddr + oip); \
104+
if (INLINE_EXTENT_BUFFER_PAGES == 1 || oil + size <= unit_size) \
105+
return get_unaligned_le##bits(kaddr + oil); \
102106
\
103-
memcpy(lebytes, kaddr + oip, part); \
104-
kaddr = page_address(eb->pages[idx + 1]); \
107+
memcpy(lebytes, kaddr + oil, part); \
108+
kaddr = folio_address(eb->folios[idx + 1]); \
105109
memcpy(lebytes + part, kaddr, size - part); \
106110
return get_unaligned_le##bits(lebytes); \
107111
} \
@@ -110,53 +114,59 @@ void btrfs_set_token_##bits(struct btrfs_map_token *token, \
110114
u##bits val) \
111115
{ \
112116
const unsigned long member_offset = (unsigned long)ptr + off; \
113-
const unsigned long idx = get_eb_page_index(member_offset); \
114-
const unsigned long oip = get_eb_offset_in_page(token->eb, \
115-
member_offset); \
117+
const unsigned long idx = get_eb_folio_index(token->eb, member_offset); \
118+
const unsigned long oil = get_eb_offset_in_folio(token->eb, \
119+
member_offset);\
120+
const int unit_size = folio_size(token->eb->folios[0]); \
121+
const int unit_shift = folio_shift(token->eb->folios[0]); \
116122
const int size = sizeof(u##bits); \
117123
u8 lebytes[sizeof(u##bits)]; \
118-
const int part = PAGE_SIZE - oip; \
124+
const int part = unit_size - oil; \
119125
\
120126
ASSERT(token); \
121127
ASSERT(token->kaddr); \
122128
ASSERT(check_setget_bounds(token->eb, ptr, off, size)); \
123129
if (token->offset <= member_offset && \
124-
member_offset + size <= token->offset + PAGE_SIZE) { \
125-
put_unaligned_le##bits(val, token->kaddr + oip); \
130+
member_offset + size <= token->offset + unit_size) { \
131+
put_unaligned_le##bits(val, token->kaddr + oil); \
126132
return; \
127133
} \
128-
token->kaddr = page_address(token->eb->pages[idx]); \
129-
token->offset = idx << PAGE_SHIFT; \
130-
if (INLINE_EXTENT_BUFFER_PAGES == 1 || oip + size <= PAGE_SIZE) { \
131-
put_unaligned_le##bits(val, token->kaddr + oip); \
134+
token->kaddr = folio_address(token->eb->folios[idx]); \
135+
token->offset = idx << unit_shift; \
136+
if (INLINE_EXTENT_BUFFER_PAGES == 1 || \
137+
oil + size <= unit_size) { \
138+
put_unaligned_le##bits(val, token->kaddr + oil); \
132139
return; \
133140
} \
134141
put_unaligned_le##bits(val, lebytes); \
135-
memcpy(token->kaddr + oip, lebytes, part); \
136-
token->kaddr = page_address(token->eb->pages[idx + 1]); \
137-
token->offset = (idx + 1) << PAGE_SHIFT; \
142+
memcpy(token->kaddr + oil, lebytes, part); \
143+
token->kaddr = folio_address(token->eb->folios[idx + 1]); \
144+
token->offset = (idx + 1) << unit_shift; \
138145
memcpy(token->kaddr, lebytes + part, size - part); \
139146
} \
140147
void btrfs_set_##bits(const struct extent_buffer *eb, void *ptr, \
141148
unsigned long off, u##bits val) \
142149
{ \
143150
const unsigned long member_offset = (unsigned long)ptr + off; \
144-
const unsigned long oip = get_eb_offset_in_page(eb, member_offset); \
145-
const unsigned long idx = get_eb_page_index(member_offset); \
146-
char *kaddr = page_address(eb->pages[idx]); \
151+
const unsigned long idx = get_eb_folio_index(eb, member_offset);\
152+
const unsigned long oil = get_eb_offset_in_folio(eb, \
153+
member_offset);\
154+
const int unit_size = folio_size(eb->folios[0]); \
155+
char *kaddr = folio_address(eb->folios[idx]); \
147156
const int size = sizeof(u##bits); \
148-
const int part = PAGE_SIZE - oip; \
157+
const int part = unit_size - oil; \
149158
u8 lebytes[sizeof(u##bits)]; \
150159
\
151160
ASSERT(check_setget_bounds(eb, ptr, off, size)); \
152-
if (INLINE_EXTENT_BUFFER_PAGES == 1 || oip + size <= PAGE_SIZE) { \
153-
put_unaligned_le##bits(val, kaddr + oip); \
161+
if (INLINE_EXTENT_BUFFER_PAGES == 1 || \
162+
oil + size <= unit_size) { \
163+
put_unaligned_le##bits(val, kaddr + oil); \
154164
return; \
155165
} \
156166
\
157167
put_unaligned_le##bits(val, lebytes); \
158-
memcpy(kaddr + oip, lebytes, part); \
159-
kaddr = page_address(eb->pages[idx + 1]); \
168+
memcpy(kaddr + oil, lebytes, part); \
169+
kaddr = folio_address(eb->folios[idx + 1]); \
160170
memcpy(kaddr, lebytes + part, size - part); \
161171
}
162172

fs/btrfs/accessors.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,14 @@ static inline void btrfs_set_token_##name(struct btrfs_map_token *token,\
9090
#define BTRFS_SETGET_HEADER_FUNCS(name, type, member, bits) \
9191
static inline u##bits btrfs_##name(const struct extent_buffer *eb) \
9292
{ \
93-
const type *p = page_address(eb->pages[0]) + \
93+
const type *p = folio_address(eb->folios[0]) + \
9494
offset_in_page(eb->start); \
9595
return get_unaligned_le##bits(&p->member); \
9696
} \
9797
static inline void btrfs_set_##name(const struct extent_buffer *eb, \
9898
u##bits val) \
9999
{ \
100-
type *p = page_address(eb->pages[0]) + offset_in_page(eb->start); \
100+
type *p = folio_address(eb->folios[0]) + offset_in_page(eb->start); \
101101
put_unaligned_le##bits(val, &p->member); \
102102
}
103103

fs/btrfs/bio.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,12 @@ static void btrfs_end_repair_bio(struct btrfs_bio *repair_bbio,
194194
struct bio_vec *bv = bio_first_bvec_all(&repair_bbio->bio);
195195
int mirror = repair_bbio->mirror_num;
196196

197+
/*
198+
* We can only trigger this for data bio, which doesn't support larger
199+
* folios yet.
200+
*/
201+
ASSERT(folio_order(page_folio(bv->bv_page)) == 0);
202+
197203
if (repair_bbio->bio.bi_status ||
198204
!btrfs_data_csum_ok(repair_bbio, dev, 0, bv)) {
199205
bio_reset(&repair_bbio->bio, NULL, REQ_OP_READ);
@@ -215,7 +221,7 @@ static void btrfs_end_repair_bio(struct btrfs_bio *repair_bbio,
215221
btrfs_repair_io_failure(fs_info, btrfs_ino(inode),
216222
repair_bbio->file_offset, fs_info->sectorsize,
217223
repair_bbio->saved_iter.bi_sector << SECTOR_SHIFT,
218-
bv->bv_page, bv->bv_offset, mirror);
224+
page_folio(bv->bv_page), bv->bv_offset, mirror);
219225
} while (mirror != fbio->bbio->mirror_num);
220226

221227
done:
@@ -626,7 +632,7 @@ static bool should_async_write(struct btrfs_bio *bbio)
626632
/*
627633
* Submit bio to an async queue.
628634
*
629-
* Return true if the work has been succesfuly submitted, else false.
635+
* Return true if the work has been successfully submitted, else false.
630636
*/
631637
static bool btrfs_wq_submit_bio(struct btrfs_bio *bbio,
632638
struct btrfs_io_context *bioc,
@@ -767,8 +773,8 @@ void btrfs_submit_bio(struct btrfs_bio *bbio, int mirror_num)
767773
* freeing the bio.
768774
*/
769775
int btrfs_repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start,
770-
u64 length, u64 logical, struct page *page,
771-
unsigned int pg_offset, int mirror_num)
776+
u64 length, u64 logical, struct folio *folio,
777+
unsigned int folio_offset, int mirror_num)
772778
{
773779
struct btrfs_io_stripe smap = { 0 };
774780
struct bio_vec bvec;
@@ -799,7 +805,8 @@ int btrfs_repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start,
799805

800806
bio_init(&bio, smap.dev->bdev, &bvec, 1, REQ_OP_WRITE | REQ_SYNC);
801807
bio.bi_iter.bi_sector = smap.physical >> SECTOR_SHIFT;
802-
__bio_add_page(&bio, page, length, pg_offset);
808+
ret = bio_add_folio(&bio, folio, length, folio_offset);
809+
ASSERT(ret);
803810
ret = submit_bio_wait(&bio);
804811
if (ret) {
805812
/* try to remap that extent elsewhere? */

fs/btrfs/bio.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ void btrfs_bio_end_io(struct btrfs_bio *bbio, blk_status_t status);
105105
void btrfs_submit_bio(struct btrfs_bio *bbio, int mirror_num);
106106
void btrfs_submit_repair_write(struct btrfs_bio *bbio, int mirror_num, bool dev_replace);
107107
int btrfs_repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start,
108-
u64 length, u64 logical, struct page *page,
109-
unsigned int pg_offset, int mirror_num);
108+
u64 length, u64 logical, struct folio *folio,
109+
unsigned int folio_offset, int mirror_num);
110110

111111
#endif

0 commit comments

Comments
 (0)