Merge branch 'for-4.2' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata
[deliverable/linux.git] / fs / fs-writeback.c
index 5eeb24a8082f94bfdb8b814c8d07d2ce2f0f744a..f0520bcf209442914eff0ed60d380fb3d2c66402 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;
 
@@ -525,6 +530,13 @@ void wbc_attach_and_unlock_inode(struct writeback_control *wbc,
 
        wb_get(wbc->wb);
        spin_unlock(&inode->i_lock);
+
+       /*
+        * A dying wb indicates that the memcg-blkcg mapping has changed
+        * and a new wb is already serving the memcg.  Switch immediately.
+        */
+       if (unlikely(wb_dying(wbc->wb)))
+               inode_switch_wbs(inode, wbc->wb_id);
 }
 
 /**
@@ -568,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) {
This page took 0.030328 seconds and 5 git commands to generate.