|
@@ -30,6 +30,7 @@
|
|
|
#include <linux/quotaops.h>
|
|
|
#include <linux/highmem.h>
|
|
|
#include <linux/export.h>
|
|
|
+#include <linux/backing-dev.h>
|
|
|
#include <linux/writeback.h>
|
|
|
#include <linux/hash.h>
|
|
|
#include <linux/suspend.h>
|
|
@@ -44,6 +45,9 @@
|
|
|
#include <trace/events/block.h>
|
|
|
|
|
|
static int fsync_buffers_list(spinlock_t *lock, struct list_head *list);
|
|
|
+static int submit_bh_blkcg(int rw, struct buffer_head *bh,
|
|
|
+ unsigned long bio_flags,
|
|
|
+ struct cgroup_subsys_state *blkcg_css);
|
|
|
|
|
|
#define BH_ENTRY(list) list_entry((list), struct buffer_head, b_assoc_buffers)
|
|
|
|
|
@@ -1704,8 +1708,8 @@ static int __block_write_full_page(struct inode *inode, struct page *page,
|
|
|
struct buffer_head *bh, *head;
|
|
|
unsigned int blocksize, bbits;
|
|
|
int nr_underway = 0;
|
|
|
- int write_op = (wbc->sync_mode == WB_SYNC_ALL ?
|
|
|
- WRITE_SYNC : WRITE);
|
|
|
+ int write_op = (wbc->sync_mode == WB_SYNC_ALL ? WRITE_SYNC : WRITE);
|
|
|
+ struct cgroup_subsys_state *blkcg_css = inode_to_wb_blkcg_css(inode);
|
|
|
|
|
|
head = create_page_buffers(page, inode,
|
|
|
(1 << BH_Dirty)|(1 << BH_Uptodate));
|
|
@@ -1794,7 +1798,7 @@ static int __block_write_full_page(struct inode *inode, struct page *page,
|
|
|
do {
|
|
|
struct buffer_head *next = bh->b_this_page;
|
|
|
if (buffer_async_write(bh)) {
|
|
|
- submit_bh(write_op, bh);
|
|
|
+ submit_bh_blkcg(write_op, bh, 0, blkcg_css);
|
|
|
nr_underway++;
|
|
|
}
|
|
|
bh = next;
|
|
@@ -1848,7 +1852,7 @@ recover:
|
|
|
struct buffer_head *next = bh->b_this_page;
|
|
|
if (buffer_async_write(bh)) {
|
|
|
clear_buffer_dirty(bh);
|
|
|
- submit_bh(write_op, bh);
|
|
|
+ submit_bh_blkcg(write_op, bh, 0, blkcg_css);
|
|
|
nr_underway++;
|
|
|
}
|
|
|
bh = next;
|
|
@@ -3013,7 +3017,9 @@ void guard_bio_eod(int rw, struct bio *bio)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-int _submit_bh(int rw, struct buffer_head *bh, unsigned long bio_flags)
|
|
|
+static int submit_bh_blkcg(int rw, struct buffer_head *bh,
|
|
|
+ unsigned long bio_flags,
|
|
|
+ struct cgroup_subsys_state *blkcg_css)
|
|
|
{
|
|
|
struct bio *bio;
|
|
|
|
|
@@ -3035,6 +3041,9 @@ int _submit_bh(int rw, struct buffer_head *bh, unsigned long bio_flags)
|
|
|
*/
|
|
|
bio = bio_alloc(GFP_NOIO, 1);
|
|
|
|
|
|
+ if (blkcg_css)
|
|
|
+ bio_associate_blkcg(bio, blkcg_css);
|
|
|
+
|
|
|
bio->bi_iter.bi_sector = bh->b_blocknr * (bh->b_size >> 9);
|
|
|
bio->bi_bdev = bh->b_bdev;
|
|
|
bio->bi_io_vec[0].bv_page = bh->b_page;
|
|
@@ -3059,11 +3068,16 @@ int _submit_bh(int rw, struct buffer_head *bh, unsigned long bio_flags)
|
|
|
submit_bio(rw, bio);
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+int _submit_bh(int rw, struct buffer_head *bh, unsigned long bio_flags)
|
|
|
+{
|
|
|
+ return submit_bh_blkcg(rw, bh, bio_flags, NULL);
|
|
|
+}
|
|
|
EXPORT_SYMBOL_GPL(_submit_bh);
|
|
|
|
|
|
int submit_bh(int rw, struct buffer_head *bh)
|
|
|
{
|
|
|
- return _submit_bh(rw, bh, 0);
|
|
|
+ return submit_bh_blkcg(rw, bh, 0, NULL);
|
|
|
}
|
|
|
EXPORT_SYMBOL(submit_bh);
|
|
|
|