|
@@ -13,6 +13,7 @@
|
|
|
#include <linux/sched.h>
|
|
|
#include <linux/blkdev.h>
|
|
|
#include <linux/writeback.h>
|
|
|
+#include <linux/memcontrol.h>
|
|
|
#include <linux/blk-cgroup.h>
|
|
|
#include <linux/backing-dev-defs.h>
|
|
|
#include <linux/slab.h>
|
|
@@ -252,13 +253,19 @@ int inode_congested(struct inode *inode, int cong_bits);
|
|
|
* @inode: inode of interest
|
|
|
*
|
|
|
* cgroup writeback requires support from both the bdi and filesystem.
|
|
|
- * Test whether @inode has both.
|
|
|
+ * Also, both memcg and iocg have to be on the default hierarchy. Test
|
|
|
+ * whether all conditions are met.
|
|
|
+ *
|
|
|
+ * Note that the test result may change dynamically on the same inode
|
|
|
+ * depending on how memcg and iocg are configured.
|
|
|
*/
|
|
|
static inline bool inode_cgwb_enabled(struct inode *inode)
|
|
|
{
|
|
|
struct backing_dev_info *bdi = inode_to_bdi(inode);
|
|
|
|
|
|
- return bdi_cap_account_dirty(bdi) &&
|
|
|
+ return cgroup_on_dfl(mem_cgroup_root_css->cgroup) &&
|
|
|
+ cgroup_on_dfl(blkcg_root_css->cgroup) &&
|
|
|
+ bdi_cap_account_dirty(bdi) &&
|
|
|
(bdi->capabilities & BDI_CAP_CGROUP_WRITEBACK) &&
|
|
|
(inode->i_sb->s_iflags & SB_I_CGROUPWB);
|
|
|
}
|