Btrfs: extent_write_locked_range() should attach inode->i_wb
authorChris Mason <clm@fb.com>
Wed, 10 Jul 2019 19:28:18 +0000 (12:28 -0700)
committerDavid Sterba <dsterba@suse.com>
Mon, 18 Nov 2019 11:46:53 +0000 (12:46 +0100)
extent_write_locked_range() is used when we're falling back to buffered
IO from inside of compression.  It allocates its own wbc and should
associate it with the inode's i_wb to make sure the IO goes down from
the correct cgroup.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Chris Mason <clm@fb.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent_io.c

index 16b5d8e02e77427b94521636db823bb8706367be..e88625beb2c03d8148bbb40a3606af578818e941 100644 (file)
@@ -4255,6 +4255,7 @@ int extent_write_locked_range(struct inode *inode, u64 start, u64 end,
                .no_cgroup_owner = 1,
        };
 
+       wbc_attach_fdatawrite_inode(&wbc_writepages, inode);
        while (start <= end) {
                page = find_get_page(mapping, start >> PAGE_SHIFT);
                if (clear_page_dirty_for_io(page))
@@ -4269,11 +4270,12 @@ int extent_write_locked_range(struct inode *inode, u64 start, u64 end,
        }
 
        ASSERT(ret <= 0);
-       if (ret < 0) {
+       if (ret == 0)
+               ret = flush_write_bio(&epd);
+       else
                end_write_bio(&epd, ret);
-               return ret;
-       }
-       ret = flush_write_bio(&epd);
+
+       wbc_detach_inode(&wbc_writepages);
        return ret;
 }