diff options
Diffstat (limited to 'fs/btrfs/accessors.c')
| -rw-r--r-- | fs/btrfs/accessors.c | 98 | 
1 files changed, 54 insertions, 44 deletions
diff --git a/fs/btrfs/accessors.c b/fs/btrfs/accessors.c index 206cf1612c1d..1925a0919ca6 100644 --- a/fs/btrfs/accessors.c +++ b/fs/btrfs/accessors.c @@ -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)  {  	token->eb = eb; -	token->kaddr = page_address(eb->pages[0]); +	token->kaddr = folio_address(eb->folios[0]);  	token->offset = 0;  } @@ -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   * 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   * from 0 to metadata node size.   */ @@ -60,28 +60,30 @@ u##bits btrfs_get_token_##bits(struct btrfs_map_token *token,		\  			       const void *ptr, unsigned long off)	\  {									\  	const unsigned long member_offset = (unsigned long)ptr + off;	\ -	const unsigned long idx = get_eb_page_index(member_offset);	\ -	const unsigned long oip = get_eb_offset_in_page(token->eb,	\ -							member_offset);	\ +	const unsigned long idx = get_eb_folio_index(token->eb, member_offset); \ +	const unsigned long oil = get_eb_offset_in_folio(token->eb,	\ +							 member_offset);\ +	const int unit_size = folio_size(token->eb->folios[0]);		\ +	const int unit_shift = folio_shift(token->eb->folios[0]);	\  	const int size = sizeof(u##bits);				\  	u8 lebytes[sizeof(u##bits)];					\ -	const int part = PAGE_SIZE - oip;				\ +	const int part = unit_size - oil;				\  									\  	ASSERT(token);							\  	ASSERT(token->kaddr);						\  	ASSERT(check_setget_bounds(token->eb, ptr, off, size));		\  	if (token->offset <= member_offset &&				\ -	    member_offset + size <= token->offset + PAGE_SIZE) {	\ -		return get_unaligned_le##bits(token->kaddr + oip);	\ +	    member_offset + size <= token->offset + unit_size) {	\ +		return get_unaligned_le##bits(token->kaddr + oil);	\  	}								\ -	token->kaddr = page_address(token->eb->pages[idx]);		\ -	token->offset = idx << PAGE_SHIFT;				\ -	if (INLINE_EXTENT_BUFFER_PAGES == 1 || oip + size <= PAGE_SIZE ) \ -		return get_unaligned_le##bits(token->kaddr + oip);	\ +	token->kaddr = folio_address(token->eb->folios[idx]);		\ +	token->offset = idx << unit_shift;				\ +	if (INLINE_EXTENT_BUFFER_PAGES == 1 || oil + size <= unit_size) \ +		return get_unaligned_le##bits(token->kaddr + oil);	\  									\ -	memcpy(lebytes, token->kaddr + oip, part);			\ -	token->kaddr = page_address(token->eb->pages[idx + 1]);		\ -	token->offset = (idx + 1) << PAGE_SHIFT;			\ +	memcpy(lebytes, token->kaddr + oil, part);			\ +	token->kaddr = folio_address(token->eb->folios[idx + 1]);	\ +	token->offset = (idx + 1) << unit_shift;			\  	memcpy(lebytes + part, token->kaddr, size - part);		\  	return get_unaligned_le##bits(lebytes);				\  }									\ @@ -89,19 +91,21 @@ u##bits btrfs_get_##bits(const struct extent_buffer *eb,		\  			 const void *ptr, unsigned long 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 idx = get_eb_page_index(member_offset);	\ -	char *kaddr = page_address(eb->pages[idx]);			\ +	const unsigned long idx = get_eb_folio_index(eb, member_offset);\ +	const unsigned long oil = get_eb_offset_in_folio(eb,		\ +							 member_offset);\ +	const int unit_size = folio_size(eb->folios[0]);		\ +	char *kaddr = folio_address(eb->folios[idx]);			\  	const int size = sizeof(u##bits);				\ -	const int part = PAGE_SIZE - oip;				\ +	const int part = unit_size - oil;				\  	u8 lebytes[sizeof(u##bits)];					\  									\  	ASSERT(check_setget_bounds(eb, ptr, off, size));		\ -	if (INLINE_EXTENT_BUFFER_PAGES == 1 || oip + size <= PAGE_SIZE)	\ -		return get_unaligned_le##bits(kaddr + oip);		\ +	if (INLINE_EXTENT_BUFFER_PAGES == 1 || oil + size <= unit_size)	\ +		return get_unaligned_le##bits(kaddr + oil);		\  									\ -	memcpy(lebytes, kaddr + oip, part);				\ -	kaddr = page_address(eb->pages[idx + 1]);			\ +	memcpy(lebytes, kaddr + oil, part);				\ +	kaddr = folio_address(eb->folios[idx + 1]);			\  	memcpy(lebytes + part, kaddr, size - part);			\  	return get_unaligned_le##bits(lebytes);				\  }									\ @@ -110,53 +114,59 @@ void btrfs_set_token_##bits(struct btrfs_map_token *token,		\  			    u##bits val)				\  {									\  	const unsigned long member_offset = (unsigned long)ptr + off;	\ -	const unsigned long idx = get_eb_page_index(member_offset);	\ -	const unsigned long oip = get_eb_offset_in_page(token->eb,	\ -							member_offset);	\ +	const unsigned long idx = get_eb_folio_index(token->eb, member_offset); \ +	const unsigned long oil = get_eb_offset_in_folio(token->eb,	\ +							 member_offset);\ +	const int unit_size = folio_size(token->eb->folios[0]);		\ +	const int unit_shift = folio_shift(token->eb->folios[0]);	\  	const int size = sizeof(u##bits);				\  	u8 lebytes[sizeof(u##bits)];					\ -	const int part = PAGE_SIZE - oip;				\ +	const int part = unit_size - oil;				\  									\  	ASSERT(token);							\  	ASSERT(token->kaddr);						\  	ASSERT(check_setget_bounds(token->eb, ptr, off, size));		\  	if (token->offset <= member_offset &&				\ -	    member_offset + size <= token->offset + PAGE_SIZE) {	\ -		put_unaligned_le##bits(val, token->kaddr + oip);	\ +	    member_offset + size <= token->offset + unit_size) {	\ +		put_unaligned_le##bits(val, token->kaddr + oil);	\  		return;							\  	}								\ -	token->kaddr = page_address(token->eb->pages[idx]);		\ -	token->offset = idx << PAGE_SHIFT;				\ -	if (INLINE_EXTENT_BUFFER_PAGES == 1 || oip + size <= PAGE_SIZE) { \ -		put_unaligned_le##bits(val, token->kaddr + oip);	\ +	token->kaddr = folio_address(token->eb->folios[idx]);		\ +	token->offset = idx << unit_shift;				\ +	if (INLINE_EXTENT_BUFFER_PAGES == 1 ||				\ +	    oil + size <= unit_size) {					\ +		put_unaligned_le##bits(val, token->kaddr + oil);	\  		return;							\  	}								\  	put_unaligned_le##bits(val, lebytes);				\ -	memcpy(token->kaddr + oip, lebytes, part);			\ -	token->kaddr = page_address(token->eb->pages[idx + 1]);		\ -	token->offset = (idx + 1) << PAGE_SHIFT;			\ +	memcpy(token->kaddr + oil, lebytes, part);			\ +	token->kaddr = folio_address(token->eb->folios[idx + 1]);	\ +	token->offset = (idx + 1) << unit_shift;			\  	memcpy(token->kaddr, lebytes + part, size - part);		\  }									\  void btrfs_set_##bits(const struct extent_buffer *eb, void *ptr,	\  		      unsigned long off, u##bits val)			\  {									\  	const unsigned long member_offset = (unsigned long)ptr + off;	\ -	const unsigned long oip = get_eb_offset_in_page(eb, member_offset); \ -	const unsigned long idx = get_eb_page_index(member_offset);	\ -	char *kaddr = page_address(eb->pages[idx]);			\ +	const unsigned long idx = get_eb_folio_index(eb, member_offset);\ +	const unsigned long oil = get_eb_offset_in_folio(eb,		\ +							 member_offset);\ +	const int unit_size = folio_size(eb->folios[0]);		\ +	char *kaddr = folio_address(eb->folios[idx]);			\  	const int size = sizeof(u##bits);				\ -	const int part = PAGE_SIZE - oip;				\ +	const int part = unit_size - oil;				\  	u8 lebytes[sizeof(u##bits)];					\  									\  	ASSERT(check_setget_bounds(eb, ptr, off, size));		\ -	if (INLINE_EXTENT_BUFFER_PAGES == 1 || oip + size <= PAGE_SIZE) { \ -		put_unaligned_le##bits(val, kaddr + oip);		\ +	if (INLINE_EXTENT_BUFFER_PAGES == 1 ||				\ +	    oil + size <= unit_size) {					\ +		put_unaligned_le##bits(val, kaddr + oil);		\  		return;							\  	}								\  									\  	put_unaligned_le##bits(val, lebytes);				\ -	memcpy(kaddr + oip, lebytes, part);				\ -	kaddr = page_address(eb->pages[idx + 1]);			\ +	memcpy(kaddr + oil, lebytes, part);				\ +	kaddr = folio_address(eb->folios[idx + 1]);			\  	memcpy(kaddr, lebytes + part, size - part);			\  }  |