writeback: do foreign inode detection iff cgroup writeback is enabled
authorTejun Heo <tj@kernel.org>
Tue, 16 Jun 2015 22:48:30 +0000 (18:48 -0400)
committerJens Axboe <axboe@fb.com>
Wed, 17 Jun 2015 18:47:37 +0000 (12:47 -0600)
Currently, even when a filesystem doesn't set the FS_CGROUP_WRITEBACK
flag, if the filesystem uses wbc_init_bio() and wbc_account_io(), the
foreign inode detection and migration logic still ends up activating
cgroup writeback which is unexpected.  This patch ensures that the
foreign inode detection logic stays disabled when inode_cgwb_enabled()
is false by not associating writeback_control's with bdi_writeback's.

This also avoids unnecessary operations in wbc_init_bio(),
wbc_account_io() and wbc_detach_inode() for filesystems which don't
support cgroup writeback.

Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jens Axboe <axboe@fb.com>
fs/fs-writeback.c

index f60de54..f0520bc 100644 (file)
@@ -513,6 +513,11 @@ out_free:
 void wbc_attach_and_unlock_inode(struct writeback_control *wbc,
                                 struct inode *inode)
 {
+       if (!inode_cgwb_enabled(inode)) {
+               spin_unlock(&inode->i_lock);
+               return;
+       }
+
        wbc->wb = inode_to_wb(inode);
        wbc->inode = inode;
 
@@ -575,11 +580,16 @@ void wbc_detach_inode(struct writeback_control *wbc)
 {
        struct bdi_writeback *wb = wbc->wb;
        struct inode *inode = wbc->inode;
-       u16 history = inode->i_wb_frn_history;
-       unsigned long avg_time = inode->i_wb_frn_avg_time;
-       unsigned long max_bytes, max_time;
+       unsigned long avg_time, max_bytes, max_time;
+       u16 history;
        int max_id;
 
+       if (!wb)
+               return;
+
+       history = inode->i_wb_frn_history;
+       avg_time = inode->i_wb_frn_avg_time;
+
        /* pick the winner of this round */
        if (wbc->wb_bytes >= wbc->wb_lcand_bytes &&
            wbc->wb_bytes >= wbc->wb_tcand_bytes) {