diff options
-rw-r--r-- | fs/btrfs/disk-io.c | 1 | ||||
-rw-r--r-- | fs/btrfs/extent_io.c | 16 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 6 | ||||
-rw-r--r-- | fs/btrfs/super.c | 1 | ||||
-rw-r--r-- | fs/btrfs/volumes.c | 8 |
5 files changed, 28 insertions, 4 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index f7536bcf7cee..230546b45474 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -1724,6 +1724,7 @@ static int setup_bdi(struct btrfs_fs_info *info, struct backing_dev_info *bdi) | |||
1724 | bdi->ra_pages = VM_MAX_READAHEAD * 1024 / PAGE_CACHE_SIZE; | 1724 | bdi->ra_pages = VM_MAX_READAHEAD * 1024 / PAGE_CACHE_SIZE; |
1725 | bdi->congested_fn = btrfs_congested_fn; | 1725 | bdi->congested_fn = btrfs_congested_fn; |
1726 | bdi->congested_data = info; | 1726 | bdi->congested_data = info; |
1727 | bdi->capabilities |= BDI_CAP_CGROUP_WRITEBACK; | ||
1727 | return 0; | 1728 | return 0; |
1728 | } | 1729 | } |
1729 | 1730 | ||
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 02d05817cbdf..b9755ce98218 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -2730,6 +2730,9 @@ struct bio *btrfs_bio_clone(struct bio *bio, gfp_t gfp_mask) | |||
2730 | btrfs_bio->csum = NULL; | 2730 | btrfs_bio->csum = NULL; |
2731 | btrfs_bio->csum_allocated = NULL; | 2731 | btrfs_bio->csum_allocated = NULL; |
2732 | btrfs_bio->end_io = NULL; | 2732 | btrfs_bio->end_io = NULL; |
2733 | /* FIXME, put this into bio_clone_bioset */ | ||
2734 | if (bio->bi_css) | ||
2735 | bio_associate_blkcg(new, bio->bi_css); | ||
2733 | } | 2736 | } |
2734 | return new; | 2737 | return new; |
2735 | } | 2738 | } |
@@ -2790,6 +2793,7 @@ static int merge_bio(int rw, struct extent_io_tree *tree, struct page *page, | |||
2790 | } | 2793 | } |
2791 | 2794 | ||
2792 | static int submit_extent_page(int rw, struct extent_io_tree *tree, | 2795 | static int submit_extent_page(int rw, struct extent_io_tree *tree, |
2796 | struct writeback_control *wbc, | ||
2793 | struct page *page, sector_t sector, | 2797 | struct page *page, sector_t sector, |
2794 | size_t size, unsigned long offset, | 2798 | size_t size, unsigned long offset, |
2795 | struct block_device *bdev, | 2799 | struct block_device *bdev, |
@@ -2826,6 +2830,8 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree, | |||
2826 | } | 2830 | } |
2827 | bio = NULL; | 2831 | bio = NULL; |
2828 | } else { | 2832 | } else { |
2833 | if (wbc) | ||
2834 | wbc_account_io(wbc, page, page_size); | ||
2829 | return 0; | 2835 | return 0; |
2830 | } | 2836 | } |
2831 | } | 2837 | } |
@@ -2841,6 +2847,10 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree, | |||
2841 | bio_add_page(bio, page, page_size, offset); | 2847 | bio_add_page(bio, page, page_size, offset); |
2842 | bio->bi_end_io = end_io_func; | 2848 | bio->bi_end_io = end_io_func; |
2843 | bio->bi_private = tree; | 2849 | bio->bi_private = tree; |
2850 | if (wbc) { | ||
2851 | wbc_init_bio(wbc, bio); | ||
2852 | wbc_account_io(wbc, page, page_size); | ||
2853 | } | ||
2844 | 2854 | ||
2845 | if (bio_ret) | 2855 | if (bio_ret) |
2846 | *bio_ret = bio; | 2856 | *bio_ret = bio; |
@@ -3051,7 +3061,7 @@ static int __do_readpage(struct extent_io_tree *tree, | |||
3051 | } | 3061 | } |
3052 | 3062 | ||
3053 | pnr -= page->index; | 3063 | pnr -= page->index; |
3054 | ret = submit_extent_page(rw, tree, page, | 3064 | ret = submit_extent_page(rw, tree, NULL, page, |
3055 | sector, disk_io_size, pg_offset, | 3065 | sector, disk_io_size, pg_offset, |
3056 | bdev, bio, pnr, | 3066 | bdev, bio, pnr, |
3057 | end_bio_extent_readpage, mirror_num, | 3067 | end_bio_extent_readpage, mirror_num, |
@@ -3446,7 +3456,7 @@ static noinline_for_stack int __extent_writepage_io(struct inode *inode, | |||
3446 | page->index, cur, end); | 3456 | page->index, cur, end); |
3447 | } | 3457 | } |
3448 | 3458 | ||
3449 | ret = submit_extent_page(write_flags, tree, page, | 3459 | ret = submit_extent_page(write_flags, tree, wbc, page, |
3450 | sector, iosize, pg_offset, | 3460 | sector, iosize, pg_offset, |
3451 | bdev, &epd->bio, max_nr, | 3461 | bdev, &epd->bio, max_nr, |
3452 | end_bio_extent_writepage, | 3462 | end_bio_extent_writepage, |
@@ -3749,7 +3759,7 @@ static noinline_for_stack int write_one_eb(struct extent_buffer *eb, | |||
3749 | 3759 | ||
3750 | clear_page_dirty_for_io(p); | 3760 | clear_page_dirty_for_io(p); |
3751 | set_page_writeback(p); | 3761 | set_page_writeback(p); |
3752 | ret = submit_extent_page(rw, tree, p, offset >> 9, | 3762 | ret = submit_extent_page(rw, tree, wbc, p, offset >> 9, |
3753 | PAGE_CACHE_SIZE, 0, bdev, &epd->bio, | 3763 | PAGE_CACHE_SIZE, 0, bdev, &epd->bio, |
3754 | -1, end_bio_extent_buffer_writepage, | 3764 | -1, end_bio_extent_buffer_writepage, |
3755 | 0, epd->bio_flags, bio_flags); | 3765 | 0, epd->bio_flags, bio_flags); |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 79a73645346e..bda3c41dc9d5 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -7987,7 +7987,11 @@ static struct bio *btrfs_dio_bio_alloc(struct block_device *bdev, | |||
7987 | u64 first_sector, gfp_t gfp_flags) | 7987 | u64 first_sector, gfp_t gfp_flags) |
7988 | { | 7988 | { |
7989 | int nr_vecs = bio_get_nr_vecs(bdev); | 7989 | int nr_vecs = bio_get_nr_vecs(bdev); |
7990 | return btrfs_bio_alloc(bdev, first_sector, nr_vecs, gfp_flags); | 7990 | struct bio *bio; |
7991 | bio = btrfs_bio_alloc(bdev, first_sector, nr_vecs, gfp_flags); | ||
7992 | if (bio) | ||
7993 | bio_associate_current(bio); | ||
7994 | return bio; | ||
7991 | } | 7995 | } |
7992 | 7996 | ||
7993 | static inline int btrfs_lookup_and_bind_dio_csum(struct btrfs_root *root, | 7997 | static inline int btrfs_lookup_and_bind_dio_csum(struct btrfs_root *root, |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index cd7ef34d2dce..d366dd4664d0 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -1033,6 +1033,7 @@ static int btrfs_fill_super(struct super_block *sb, | |||
1033 | sb->s_flags |= MS_POSIXACL; | 1033 | sb->s_flags |= MS_POSIXACL; |
1034 | #endif | 1034 | #endif |
1035 | sb->s_flags |= MS_I_VERSION; | 1035 | sb->s_flags |= MS_I_VERSION; |
1036 | sb->s_iflags |= SB_I_CGROUPWB; | ||
1036 | err = open_ctree(sb, fs_devices, (char *)data); | 1037 | err = open_ctree(sb, fs_devices, (char *)data); |
1037 | if (err) { | 1038 | if (err) { |
1038 | printk(KERN_ERR "BTRFS: open_ctree failed\n"); | 1039 | printk(KERN_ERR "BTRFS: open_ctree failed\n"); |
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index fb9abf1678d0..88e2fe931bde 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -5942,6 +5942,14 @@ again: | |||
5942 | if (!bio) | 5942 | if (!bio) |
5943 | return -ENOMEM; | 5943 | return -ENOMEM; |
5944 | 5944 | ||
5945 | if (first_bio->bi_ioc) { | ||
5946 | get_io_context_active(first_bio->bi_ioc); | ||
5947 | bio->bi_ioc = first_bio->bi_ioc; | ||
5948 | } | ||
5949 | if (first_bio->bi_css) { | ||
5950 | css_get(first_bio->bi_css); | ||
5951 | bio->bi_css = first_bio->bi_css; | ||
5952 | } | ||
5945 | while (bvec <= (first_bio->bi_io_vec + first_bio->bi_vcnt - 1)) { | 5953 | while (bvec <= (first_bio->bi_io_vec + first_bio->bi_vcnt - 1)) { |
5946 | if (bio_add_page(bio, bvec->bv_page, bvec->bv_len, | 5954 | if (bio_add_page(bio, bvec->bv_page, bvec->bv_len, |
5947 | bvec->bv_offset) < bvec->bv_len) { | 5955 | bvec->bv_offset) < bvec->bv_len) { |