]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
btrfs: also use kthread_associate_blkcg for uncompressible ranges
authorChristoph Hellwig <hch@lst.de>
Mon, 27 Mar 2023 00:49:49 +0000 (09:49 +0900)
committerDavid Sterba <dsterba@suse.com>
Mon, 17 Apr 2023 16:01:22 +0000 (18:01 +0200)
submit_one_async_extent needs to use submit_one_async_extent no matter
if the range it handles ends up beeing compressed or not as the deadlock
risk due to cgroup thottling is the same.  Call kthread_associate_blkcg
earlier to cover submit_uncompressed_range case as well.

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/inode.c

index 5db8b6cffb2428012ab873a1f6fc83db388147cb..5c216cab2076cf62829cb32bd90edb3382c5af15 100644 (file)
@@ -983,6 +983,9 @@ static int submit_one_async_extent(struct btrfs_inode *inode,
        u64 start = async_extent->start;
        u64 end = async_extent->start + async_extent->ram_size - 1;
 
+       if (async_chunk->blkcg_css)
+               kthread_associate_blkcg(async_chunk->blkcg_css);
+
        /*
         * If async_chunk->locked_page is in the async_extent range, we need to
         * handle it.
@@ -1053,8 +1056,6 @@ static int submit_one_async_extent(struct btrfs_inode *inode,
                        NULL, EXTENT_LOCKED | EXTENT_DELALLOC,
                        PAGE_UNLOCK | PAGE_START_WRITEBACK);
 
-       if (async_chunk->blkcg_css)
-               kthread_associate_blkcg(async_chunk->blkcg_css);
        btrfs_submit_compressed_write(inode, start,     /* file_offset */
                            async_extent->ram_size,     /* num_bytes */
                            ins.objectid,               /* disk_bytenr */
@@ -1062,10 +1063,10 @@ static int submit_one_async_extent(struct btrfs_inode *inode,
                            async_extent->pages,        /* compressed_pages */
                            async_extent->nr_pages,
                            async_chunk->write_flags, true);
-       if (async_chunk->blkcg_css)
-               kthread_associate_blkcg(NULL);
        *alloc_hint = ins.objectid + ins.offset;
 done:
+       if (async_chunk->blkcg_css)
+               kthread_associate_blkcg(NULL);
        kfree(async_extent);
        return ret;