mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-01 10:42:11 +00:00
for-6.9-rc4-tag
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEE8rQSAMVO+zA4DBdWxWXV+ddtWDsFAmYgXDMACgkQxWXV+ddt WDsPpg//RzpLGyfFVFx+AdqIPScBvDSr6RIQAug++4OmDbIRMxzOpxKOAWThhivf 78KIms2fj9R/zLJEdUGCLQTcy8a1eWBnoeSzXoeTta2pip5cKrc9v3hJId53l0F6 BfltbVjpAKt6XHqeI0V2myrL/KHx5bApz5oNn/oEQCwiA2HBkasrYTRLEA7xMem2 hRUIXrTuIdwiyWugi84xjp9D0BxEdbTBfH6SR6RG4ESy+73gdEt4BAeDI6DzWN+D eKUv/CthhrP7xuO8Aq9XGkwznP7lIeIwBCiV5XURLR0HztFm64vXgbPQHhwqvI43 5uhA7wifc/VE8nOysubfET6MwVEeyOptW6+25ih/9Da9VLxRK1y/Hm94JW8t6Sxi VPgT5gz4YuE5/QaojETDLYgkkjKj7Lpe/Bs225J3QBCHu3fs/tp9kHKbUNJrcAeM b56tiRMccLVpeoslbK4ahvQqCH4/LKBMdAqfWK5/p24JkYT/ubVP3CdLS2MOeRpV UqDpQExuWsVJZKH8znSXXrHf2ZMYHmlA/1gRqdEmcvPF8A2vCc9aMMZHTP7v57EC /80NJv9HQuxcUFQCl0h4WBlB+gGQtAszz+0q1X9aedauC6Hd/7LeICLCPRczJC3g rD3J+EXiTg2MxqZWyXJXQ1Q9cQWNkQjG6o/rEhl5r5c3OGWgssk= =ZKAP -----END PGP SIGNATURE----- Merge tag 'for-6.9-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux Pull btrfs fixes from David Sterba: - fixup in zoned mode for out-of-order writes of metadata that are no longer necessary, this used to be tracked in a separate list but now the old locaion needs to be zeroed out, also add assertions - fix bulk page allocation retry, this may stall after first failure for compression read/write * tag 'for-6.9-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: btrfs: do not wait for short bulk allocation btrfs: zoned: add ASSERT and WARN for EXTENT_BUFFER_ZONED_ZEROOUT handling btrfs: zoned: do not flag ZEROOUT on non-dirty extent buffer
This commit is contained in:
commit
8cd26fd90c
@ -3464,6 +3464,14 @@ void btrfs_free_tree_block(struct btrfs_trans_handle *trans,
|
||||
if (root_id != BTRFS_TREE_LOG_OBJECTID) {
|
||||
struct btrfs_ref generic_ref = { 0 };
|
||||
|
||||
/*
|
||||
* Assert that the extent buffer is not cleared due to
|
||||
* EXTENT_BUFFER_ZONED_ZEROOUT. Please refer
|
||||
* btrfs_clear_buffer_dirty() and btree_csum_one_bio() for
|
||||
* detail.
|
||||
*/
|
||||
ASSERT(btrfs_header_bytenr(buf) != 0);
|
||||
|
||||
btrfs_init_generic_ref(&generic_ref, BTRFS_DROP_DELAYED_REF,
|
||||
buf->start, buf->len, parent,
|
||||
btrfs_header_owner(buf));
|
||||
|
@ -681,31 +681,21 @@ static void end_bbio_data_read(struct btrfs_bio *bbio)
|
||||
int btrfs_alloc_page_array(unsigned int nr_pages, struct page **page_array,
|
||||
gfp_t extra_gfp)
|
||||
{
|
||||
const gfp_t gfp = GFP_NOFS | extra_gfp;
|
||||
unsigned int allocated;
|
||||
|
||||
for (allocated = 0; allocated < nr_pages;) {
|
||||
unsigned int last = allocated;
|
||||
|
||||
allocated = alloc_pages_bulk_array(GFP_NOFS | extra_gfp,
|
||||
nr_pages, page_array);
|
||||
|
||||
if (allocated == nr_pages)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* During this iteration, no page could be allocated, even
|
||||
* though alloc_pages_bulk_array() falls back to alloc_page()
|
||||
* if it could not bulk-allocate. So we must be out of memory.
|
||||
*/
|
||||
if (allocated == last) {
|
||||
allocated = alloc_pages_bulk_array(gfp, nr_pages, page_array);
|
||||
if (unlikely(allocated == last)) {
|
||||
/* No progress, fail and do cleanup. */
|
||||
for (int i = 0; i < allocated; i++) {
|
||||
__free_page(page_array[i]);
|
||||
page_array[i] = NULL;
|
||||
}
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
memalloc_retry_wait(GFP_NOFS);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -4154,7 +4144,7 @@ void btrfs_clear_buffer_dirty(struct btrfs_trans_handle *trans,
|
||||
* The actual zeroout of the buffer will happen later in
|
||||
* btree_csum_one_bio.
|
||||
*/
|
||||
if (btrfs_is_zoned(fs_info)) {
|
||||
if (btrfs_is_zoned(fs_info) && test_bit(EXTENT_BUFFER_DIRTY, &eb->bflags)) {
|
||||
set_bit(EXTENT_BUFFER_ZONED_ZEROOUT, &eb->bflags);
|
||||
return;
|
||||
}
|
||||
@ -4193,6 +4183,7 @@ void set_extent_buffer_dirty(struct extent_buffer *eb)
|
||||
num_folios = num_extent_folios(eb);
|
||||
WARN_ON(atomic_read(&eb->refs) == 0);
|
||||
WARN_ON(!test_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags));
|
||||
WARN_ON(test_bit(EXTENT_BUFFER_ZONED_ZEROOUT, &eb->bflags));
|
||||
|
||||
if (!was_dirty) {
|
||||
bool subpage = eb->fs_info->nodesize < PAGE_SIZE;
|
||||
|
Loading…
Reference in New Issue
Block a user