]> git.baikalelectronics.ru Git - kernel.git/commit
btrfs: use async_chunk::async_cow to replace the confusing pending pointer
authorQu Wenruo <wqu@suse.com>
Mon, 27 Sep 2021 07:21:45 +0000 (15:21 +0800)
committerDavid Sterba <dsterba@suse.com>
Tue, 26 Oct 2021 17:08:03 +0000 (19:08 +0200)
commit7c61b5267afd823d62b5dbb5f13a5bffab19d9b7
treee2c2a9ff916d7c1b9db891e751b84e012bcf94fd
parentd8e145be8d5e8c01f9c9c63c5e0888bf75867722
btrfs: use async_chunk::async_cow to replace the confusing pending pointer

For structure async_chunk, we use a very strange member layout to grab
structure async_cow who owns this async_chunk.

At initialization, it goes like this:

async_chunk[i].pending = &ctx->num_chunks;

Then at async_cow_free() we do a super weird freeing:

/*
 * Since the pointer to 'pending' is at the beginning of the array of
 * async_chunk's, freeing it ensures the whole array has been freed.
 */
if (atomic_dec_and_test(async_chunk->pending))
kvfree(async_chunk->pending);

This is absolutely an abuse of kvfree().

Replace async_chunk::pending with async_chunk::async_cow, so that we can
grab the async_cow structure directly, without this strange dancing.

And with this change, there is no requirement for any specific member
location.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/inode.c