]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - include/linux/writeback.h
Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux.git] / include / linux / writeback.h
index 738a0c24874f0bfd308fad36057cae71401f71f0..8945aac313929ca1afa831a58a4ea0661a02fd11 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/flex_proportions.h>
 #include <linux/backing-dev-defs.h>
 #include <linux/blk_types.h>
+#include <linux/blk-cgroup.h>
 
 struct bio;
 
@@ -68,6 +69,17 @@ struct writeback_control {
        unsigned for_reclaim:1;         /* Invoked from the page allocator */
        unsigned range_cyclic:1;        /* range_start is cyclic */
        unsigned for_sync:1;            /* sync(2) WB_SYNC_ALL writeback */
+
+       /*
+        * When writeback IOs are bounced through async layers, only the
+        * initial synchronous phase should be accounted towards inode
+        * cgroup ownership arbitration to avoid confusion.  Later stages
+        * can set the following flag to disable the accounting.
+        */
+       unsigned no_cgroup_owner:1;
+
+       unsigned punt_to_cgroup:1;      /* cgrp punting, see __REQ_CGROUP_PUNT */
+
 #ifdef CONFIG_CGROUP_WRITEBACK
        struct bdi_writeback *wb;       /* wb this writeback is issued under */
        struct inode *inode;            /* inode being written out */
@@ -84,12 +96,27 @@ struct writeback_control {
 
 static inline int wbc_to_write_flags(struct writeback_control *wbc)
 {
+       int flags = 0;
+
+       if (wbc->punt_to_cgroup)
+               flags = REQ_CGROUP_PUNT;
+
        if (wbc->sync_mode == WB_SYNC_ALL)
-               return REQ_SYNC;
+               flags |= REQ_SYNC;
        else if (wbc->for_kupdate || wbc->for_background)
-               return REQ_BACKGROUND;
+               flags |= REQ_BACKGROUND;
 
-       return 0;
+       return flags;
+}
+
+static inline struct cgroup_subsys_state *
+wbc_blkcg_css(struct writeback_control *wbc)
+{
+#ifdef CONFIG_CGROUP_WRITEBACK
+       if (wbc->wb)
+               return wbc->wb->blkcg_css;
+#endif
+       return blkcg_root_css;
 }
 
 /*
@@ -188,8 +215,8 @@ void wbc_attach_and_unlock_inode(struct writeback_control *wbc,
                                 struct inode *inode)
        __releases(&inode->i_lock);
 void wbc_detach_inode(struct writeback_control *wbc);
-void wbc_account_io(struct writeback_control *wbc, struct page *page,
-                   size_t bytes);
+void wbc_account_cgroup_owner(struct writeback_control *wbc, struct page *page,
+                             size_t bytes);
 void cgroup_writeback_umount(void);
 
 /**
@@ -291,8 +318,8 @@ static inline void wbc_init_bio(struct writeback_control *wbc, struct bio *bio)
 {
 }
 
-static inline void wbc_account_io(struct writeback_control *wbc,
-                                 struct page *page, size_t bytes)
+static inline void wbc_account_cgroup_owner(struct writeback_control *wbc,
+                                           struct page *page, size_t bytes)
 {
 }