btrfs: punt all bios created in btrfs_submit_compressed_write()
authorDennis Zhou <dennis@kernel.org>
Thu, 12 Dec 2019 00:07:06 +0000 (16:07 -0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 30 Dec 2019 15:07:16 +0000 (16:07 +0100)
Compressed writes happen in the background via kworkers. However, this
causes bios to be attributed to root bypassing any cgroup limits from
the actual writer. We tag the first bio with REQ_CGROUP_PUNT, which will
punt the bio to an appropriate cgroup specific workqueue and attribute
the IO properly. However, if btrfs_submit_compressed_write() creates a
new bio, we don't tag it the same way. Add the appropriate tagging for
subsequent bios.

Fixes: ec39f7696ccfa ("Btrfs: use REQ_CGROUP_PUNT for worker thread submitted bios")
Reviewed-by: Chris Mason <clm@fb.com>
Signed-off-by: Dennis Zhou <dennis@kernel.org>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/compression.c

index ee834ef7beb4a375884f91c260c69246412f012e..b08e16b8cebb11e75d7267dff38520e96265adf2 100644 (file)
@@ -491,6 +491,10 @@ blk_status_t btrfs_submit_compressed_write(struct inode *inode, u64 start,
                        bio->bi_opf = REQ_OP_WRITE | write_flags;
                        bio->bi_private = cb;
                        bio->bi_end_io = end_compressed_bio_write;
+                       if (blkcg_css) {
+                               bio->bi_opf |= REQ_CGROUP_PUNT;
+                               bio_associate_blkg_from_css(bio, blkcg_css);
+                       }
                        bio_add_page(bio, page, PAGE_SIZE, 0);
                }
                if (bytes_left < PAGE_SIZE) {