]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
btrfs: zero the buffer before marking it dirty in btrfs_redirty_list_add
authorChristoph Hellwig <hch@lst.de>
Mon, 8 May 2023 14:58:37 +0000 (07:58 -0700)
committerDavid Sterba <dsterba@suse.com>
Wed, 10 May 2023 12:50:29 +0000 (14:50 +0200)
btrfs_redirty_list_add zeroes the buffer data and sets the
EXTENT_BUFFER_NO_CHECK to make sure writeback is fine with a bogus
header.  But it does that after already marking the buffer dirty, which
means that writeback could already be looking at the buffer.

Switch the order of operations around so that the buffer is only marked
dirty when we're ready to write it.

Fixes: d3575156f662 ("btrfs: zoned: redirty released extent buffers")
CC: stable@vger.kernel.org # 5.15+
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/zoned.c

index 4243b0427a305c5590dd1482f8e7c464da99be36..39828af4a4e8ccc49611635688c9d8674ab430b1 100644 (file)
@@ -1609,11 +1609,11 @@ void btrfs_redirty_list_add(struct btrfs_transaction *trans,
            !list_empty(&eb->release_list))
                return;
 
+       memzero_extent_buffer(eb, 0, eb->len);
+       set_bit(EXTENT_BUFFER_NO_CHECK, &eb->bflags);
        set_extent_buffer_dirty(eb);
        set_extent_bits_nowait(&trans->dirty_pages, eb->start,
                               eb->start + eb->len - 1, EXTENT_DIRTY);
-       memzero_extent_buffer(eb, 0, eb->len);
-       set_bit(EXTENT_BUFFER_NO_CHECK, &eb->bflags);
 
        spin_lock(&trans->releasing_ebs_lock);
        list_add_tail(&eb->release_list, &trans->releasing_ebs);