Revert "Bluetooth: Store advertising handle so it can be re-enabled"
[platform/kernel/linux-rpi.git] / fs / fs-writeback.c
index c1af01b..1767493 100644 (file)
@@ -613,6 +613,24 @@ out_free:
        kfree(isw);
 }
 
+static bool isw_prepare_wbs_switch(struct inode_switch_wbs_context *isw,
+                                  struct list_head *list, int *nr)
+{
+       struct inode *inode;
+
+       list_for_each_entry(inode, list, i_io_list) {
+               if (!inode_prepare_wbs_switch(inode, isw->new_wb))
+                       continue;
+
+               isw->inodes[*nr] = inode;
+               (*nr)++;
+
+               if (*nr >= WB_MAX_INODES_PER_ISW - 1)
+                       return true;
+       }
+       return false;
+}
+
 /**
  * cleanup_offline_cgwb - detach associated inodes
  * @wb: target wb
@@ -625,7 +643,6 @@ bool cleanup_offline_cgwb(struct bdi_writeback *wb)
 {
        struct cgroup_subsys_state *memcg_css;
        struct inode_switch_wbs_context *isw;
-       struct inode *inode;
        int nr;
        bool restart = false;
 
@@ -647,17 +664,17 @@ bool cleanup_offline_cgwb(struct bdi_writeback *wb)
 
        nr = 0;
        spin_lock(&wb->list_lock);
-       list_for_each_entry(inode, &wb->b_attached, i_io_list) {
-               if (!inode_prepare_wbs_switch(inode, isw->new_wb))
-                       continue;
-
-               isw->inodes[nr++] = inode;
-
-               if (nr >= WB_MAX_INODES_PER_ISW - 1) {
-                       restart = true;
-                       break;
-               }
-       }
+       /*
+        * In addition to the inodes that have completed writeback, also switch
+        * cgwbs for those inodes only with dirty timestamps. Otherwise, those
+        * inodes won't be written back for a long time when lazytime is
+        * enabled, and thus pinning the dying cgwbs. It won't break the
+        * bandwidth restrictions, as writeback of inode metadata is not
+        * accounted for.
+        */
+       restart = isw_prepare_wbs_switch(isw, &wb->b_attached, &nr);
+       if (!restart)
+               restart = isw_prepare_wbs_switch(isw, &wb->b_dirty_time, &nr);
        spin_unlock(&wb->list_lock);
 
        /* no attached inodes? bail out */