Skip to content

Commit

Permalink
Merge tag 'for-5.5-rc4-tag' of git://git.kernel.org/pub/scm/linux/ker…
Browse files Browse the repository at this point in the history
…nel/git/kdave/linux

Pull btrfs fixes from David Sterba:
 "A few fixes for btrfs:

   - blkcg accounting problem with compression that could stall writes

   - setting up blkcg bio for compression crashes due to NULL bdev
     pointer

   - fix possible infinite loop in writeback for nocow files (here
     possible means almost impossible, 13 things that need to happen to
     trigger it)"

* tag 'for-5.5-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux:
  Btrfs: fix infinite loop during nocow writeback due to race
  btrfs: fix compressed write bio blkcg attribution
  btrfs: punt all bios created in btrfs_submit_compressed_write()
  • Loading branch information
Linus Torvalds committed Jan 3, 2020
2 parents b6b4aaf + de7999a commit 3a562ae
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 4 deletions.
7 changes: 6 additions & 1 deletion fs/btrfs/compression.c
Original file line number Diff line number Diff line change
Expand Up @@ -447,7 +447,7 @@ blk_status_t btrfs_submit_compressed_write(struct inode *inode, u64 start,

if (blkcg_css) {
bio->bi_opf |= REQ_CGROUP_PUNT;
bio_associate_blkg_from_css(bio, blkcg_css);
kthread_associate_blkcg(blkcg_css);
}
refcount_set(&cb->pending_bios, 1);

Expand Down Expand Up @@ -491,6 +491,8 @@ blk_status_t btrfs_submit_compressed_write(struct inode *inode, u64 start,
bio->bi_opf = REQ_OP_WRITE | write_flags;
bio->bi_private = cb;
bio->bi_end_io = end_compressed_bio_write;
if (blkcg_css)
bio->bi_opf |= REQ_CGROUP_PUNT;
bio_add_page(bio, page, PAGE_SIZE, 0);
}
if (bytes_left < PAGE_SIZE) {
Expand All @@ -517,6 +519,9 @@ blk_status_t btrfs_submit_compressed_write(struct inode *inode, u64 start,
bio_endio(bio);
}

if (blkcg_css)
kthread_associate_blkcg(NULL);

return 0;
}

Expand Down
6 changes: 3 additions & 3 deletions fs/btrfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -1479,10 +1479,10 @@ static noinline int run_delalloc_nocow(struct inode *inode,
disk_num_bytes =
btrfs_file_extent_disk_num_bytes(leaf, fi);
/*
* If extent we got ends before our range starts, skip
* to next extent
* If the extent we got ends before our current offset,
* skip to the next extent.
*/
if (extent_end <= start) {
if (extent_end <= cur_offset) {
path->slots[0]++;
goto next_slot;
}
Expand Down

0 comments on commit 3a562ae

Please sign in to comment.