On 2022/4/15 14:28, Christoph Hellwig wrote:
Btw, btrfs_submit_compressed_write also seems to do some double cleanups, even if the pattern is slightly different as the bio is allocated inside btrfs_submit_compressed_write itself. Can someone who is more familiar with that code look into that?
I just checked the code, it's indeed causing problems.
If btrfs_csum_one_bio() or submit_compressed_bio() failed (either ENOMEM or failed some sanity checks), then we have one bio for writing the compressed data back to disk.
Finish_cb label will call endio on it, which will call: -> end_compressed_bio_write() -> finish_compressed_bio() (this needs the compressed write bio not be split)
Then finish_cb tag will also call finish_compressed_bio() directly. Double freeing cb, and double clearing writeback flags.
The only relief is, regular EIO won't trigger the bug for write path.
But this can not be said to btrfs_submit_compressed_read(), which has the same problem and can be triggered by EIO error easily.
Do you want to give it a try? Or mind to me fix it?
Thanks, Qu