for-5.13-rc2-tag
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEE8rQSAMVO+zA4DBdWxWXV+ddtWDsFAmCoEQkACgkQxWXV+ddt WDsn6Q//XXQVextL6g6Wjx0SR9b5C1ndSV841jNY+KQ0drBPSOBs+0SXI+nIWAK1 iTpmj3s2qrRElZZ6DT4fKP28KnbUJed9+CcirNnN3IMOeauI760CLobXZLsw1wGH o0HKKgcPhw/v9o9jqX22rSfzDZ2Rx2KhZ8iEb1ZXIG5iJNFcnXCCoFOqk4I+UEvH /5734KU8RI3sCRhziSf/vDCF50p+BIWr8VilQkmZUzi0oa6Y1wXm0qd9j0unhICR NxcBk1NYdOosAvVRhSqync1BNLhXSctg4rwhLlSI5SDvt/Ivz5tguNr9HcizOvmW zyb0g1c3Pq0p2wQJLybbs1zn67d0+7Q23UPWx1C+IKU3nmX5mGWzToxjVOQASYaZ 8UbzYAjUHtJpLDB4dp6+k5Pv/yfVGyhxXI+qLMWow77qRPPf7/vw5nEwTXmjcPRH 9st0TopZVXI4IEpZP+HeNFdNONuPL3CqV0t1+MnC73WMhmUfXR5E8Yq5H3MscuFl smkrWUq/g+cmkiOw5r4MyadFuN1MsXGw4rOdbYjY4JqVht6gPkOp3P73Hme5rD3H Txw/1WKEl+w3I6wS0Dl/NFcMGOyl8gEv4rATDyRWkxfmCue2mcTGS/3jjjWWguu4 +Q7e6p1390PLAvMV/rEDoYmFCoPSYp6trvupW+5fkZdOyei1SZM= =98LW -----END PGP SIGNATURE----- Merge tag 'for-5.13-rc2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux Pull btrfs fixes from David Sterba: "A few more fixes: - fix unaligned compressed writes in zoned mode - fix false positive lockdep warning when cloning inline extent - remove wrong BUG_ON in tree-log error handling" * tag 'for-5.13-rc2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: btrfs: zoned: fix parallel compressed writes btrfs: zoned: pass start block to btrfs_use_zone_append btrfs: do not BUG_ON in link_to_fixup_dir btrfs: release path before starting transaction when cloning inline extent
This commit is contained in:
commit
45af60e7ce
@ -28,6 +28,7 @@
|
||||
#include "compression.h"
|
||||
#include "extent_io.h"
|
||||
#include "extent_map.h"
|
||||
#include "zoned.h"
|
||||
|
||||
static const char* const btrfs_compress_types[] = { "", "zlib", "lzo", "zstd" };
|
||||
|
||||
@ -349,6 +350,7 @@ static void end_compressed_bio_write(struct bio *bio)
|
||||
*/
|
||||
inode = cb->inode;
|
||||
cb->compressed_pages[0]->mapping = cb->inode->i_mapping;
|
||||
btrfs_record_physical_zoned(inode, cb->start, bio);
|
||||
btrfs_writepage_endio_finish_ordered(cb->compressed_pages[0],
|
||||
cb->start, cb->start + cb->len - 1,
|
||||
bio->bi_status == BLK_STS_OK);
|
||||
@ -401,6 +403,8 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start,
|
||||
u64 first_byte = disk_start;
|
||||
blk_status_t ret;
|
||||
int skip_sum = inode->flags & BTRFS_INODE_NODATASUM;
|
||||
const bool use_append = btrfs_use_zone_append(inode, disk_start);
|
||||
const unsigned int bio_op = use_append ? REQ_OP_ZONE_APPEND : REQ_OP_WRITE;
|
||||
|
||||
WARN_ON(!PAGE_ALIGNED(start));
|
||||
cb = kmalloc(compressed_bio_size(fs_info, compressed_len), GFP_NOFS);
|
||||
@ -418,10 +422,31 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start,
|
||||
cb->nr_pages = nr_pages;
|
||||
|
||||
bio = btrfs_bio_alloc(first_byte);
|
||||
bio->bi_opf = REQ_OP_WRITE | write_flags;
|
||||
bio->bi_opf = bio_op | write_flags;
|
||||
bio->bi_private = cb;
|
||||
bio->bi_end_io = end_compressed_bio_write;
|
||||
|
||||
if (use_append) {
|
||||
struct extent_map *em;
|
||||
struct map_lookup *map;
|
||||
struct block_device *bdev;
|
||||
|
||||
em = btrfs_get_chunk_map(fs_info, disk_start, PAGE_SIZE);
|
||||
if (IS_ERR(em)) {
|
||||
kfree(cb);
|
||||
bio_put(bio);
|
||||
return BLK_STS_NOTSUPP;
|
||||
}
|
||||
|
||||
map = em->map_lookup;
|
||||
/* We only support single profile for now */
|
||||
ASSERT(map->num_stripes == 1);
|
||||
bdev = map->stripes[0].dev->bdev;
|
||||
|
||||
bio_set_dev(bio, bdev);
|
||||
free_extent_map(em);
|
||||
}
|
||||
|
||||
if (blkcg_css) {
|
||||
bio->bi_opf |= REQ_CGROUP_PUNT;
|
||||
kthread_associate_blkcg(blkcg_css);
|
||||
@ -432,6 +457,7 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start,
|
||||
bytes_left = compressed_len;
|
||||
for (pg_index = 0; pg_index < cb->nr_pages; pg_index++) {
|
||||
int submit = 0;
|
||||
int len;
|
||||
|
||||
page = compressed_pages[pg_index];
|
||||
page->mapping = inode->vfs_inode.i_mapping;
|
||||
@ -439,9 +465,13 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start,
|
||||
submit = btrfs_bio_fits_in_stripe(page, PAGE_SIZE, bio,
|
||||
0);
|
||||
|
||||
if (pg_index == 0 && use_append)
|
||||
len = bio_add_zone_append_page(bio, page, PAGE_SIZE, 0);
|
||||
else
|
||||
len = bio_add_page(bio, page, PAGE_SIZE, 0);
|
||||
|
||||
page->mapping = NULL;
|
||||
if (submit || bio_add_page(bio, page, PAGE_SIZE, 0) <
|
||||
PAGE_SIZE) {
|
||||
if (submit || len < PAGE_SIZE) {
|
||||
/*
|
||||
* inc the count before we submit the bio so
|
||||
* we know the end IO handler won't happen before
|
||||
@ -465,11 +495,15 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start,
|
||||
}
|
||||
|
||||
bio = btrfs_bio_alloc(first_byte);
|
||||
bio->bi_opf = REQ_OP_WRITE | write_flags;
|
||||
bio->bi_opf = bio_op | write_flags;
|
||||
bio->bi_private = cb;
|
||||
bio->bi_end_io = end_compressed_bio_write;
|
||||
if (blkcg_css)
|
||||
bio->bi_opf |= REQ_CGROUP_PUNT;
|
||||
/*
|
||||
* Use bio_add_page() to ensure the bio has at least one
|
||||
* page.
|
||||
*/
|
||||
bio_add_page(bio, page, PAGE_SIZE, 0);
|
||||
}
|
||||
if (bytes_left < PAGE_SIZE) {
|
||||
|
@ -3753,7 +3753,7 @@ static noinline_for_stack int __extent_writepage_io(struct btrfs_inode *inode,
|
||||
/* Note that em_end from extent_map_end() is exclusive */
|
||||
iosize = min(em_end, end + 1) - cur;
|
||||
|
||||
if (btrfs_use_zone_append(inode, em))
|
||||
if (btrfs_use_zone_append(inode, em->block_start))
|
||||
opf = REQ_OP_ZONE_APPEND;
|
||||
|
||||
free_extent_map(em);
|
||||
|
@ -7786,7 +7786,7 @@ static int btrfs_dio_iomap_begin(struct inode *inode, loff_t start,
|
||||
iomap->bdev = fs_info->fs_devices->latest_bdev;
|
||||
iomap->length = len;
|
||||
|
||||
if (write && btrfs_use_zone_append(BTRFS_I(inode), em))
|
||||
if (write && btrfs_use_zone_append(BTRFS_I(inode), em->block_start))
|
||||
iomap->flags |= IOMAP_F_ZONE_APPEND;
|
||||
|
||||
free_extent_map(em);
|
||||
|
@ -281,6 +281,11 @@ copy_inline_extent:
|
||||
ret = btrfs_inode_set_file_extent_range(BTRFS_I(dst), 0, aligned_end);
|
||||
out:
|
||||
if (!ret && !trans) {
|
||||
/*
|
||||
* Release path before starting a new transaction so we don't
|
||||
* hold locks that would confuse lockdep.
|
||||
*/
|
||||
btrfs_release_path(path);
|
||||
/*
|
||||
* No transaction here means we copied the inline extent into a
|
||||
* page of the destination inode.
|
||||
|
@ -1858,8 +1858,6 @@ static noinline int link_to_fixup_dir(struct btrfs_trans_handle *trans,
|
||||
ret = btrfs_update_inode(trans, root, BTRFS_I(inode));
|
||||
} else if (ret == -EEXIST) {
|
||||
ret = 0;
|
||||
} else {
|
||||
BUG(); /* Logic Error */
|
||||
}
|
||||
iput(inode);
|
||||
|
||||
|
@ -1278,7 +1278,7 @@ void btrfs_free_redirty_list(struct btrfs_transaction *trans)
|
||||
spin_unlock(&trans->releasing_ebs_lock);
|
||||
}
|
||||
|
||||
bool btrfs_use_zone_append(struct btrfs_inode *inode, struct extent_map *em)
|
||||
bool btrfs_use_zone_append(struct btrfs_inode *inode, u64 start)
|
||||
{
|
||||
struct btrfs_fs_info *fs_info = inode->root->fs_info;
|
||||
struct btrfs_block_group *cache;
|
||||
@ -1293,7 +1293,7 @@ bool btrfs_use_zone_append(struct btrfs_inode *inode, struct extent_map *em)
|
||||
if (!is_data_inode(&inode->vfs_inode))
|
||||
return false;
|
||||
|
||||
cache = btrfs_lookup_block_group(fs_info, em->block_start);
|
||||
cache = btrfs_lookup_block_group(fs_info, start);
|
||||
ASSERT(cache);
|
||||
if (!cache)
|
||||
return false;
|
||||
|
@ -53,7 +53,7 @@ void btrfs_calc_zone_unusable(struct btrfs_block_group *cache);
|
||||
void btrfs_redirty_list_add(struct btrfs_transaction *trans,
|
||||
struct extent_buffer *eb);
|
||||
void btrfs_free_redirty_list(struct btrfs_transaction *trans);
|
||||
bool btrfs_use_zone_append(struct btrfs_inode *inode, struct extent_map *em);
|
||||
bool btrfs_use_zone_append(struct btrfs_inode *inode, u64 start);
|
||||
void btrfs_record_physical_zoned(struct inode *inode, u64 file_offset,
|
||||
struct bio *bio);
|
||||
void btrfs_rewrite_logical_zoned(struct btrfs_ordered_extent *ordered);
|
||||
@ -152,8 +152,7 @@ static inline void btrfs_redirty_list_add(struct btrfs_transaction *trans,
|
||||
struct extent_buffer *eb) { }
|
||||
static inline void btrfs_free_redirty_list(struct btrfs_transaction *trans) { }
|
||||
|
||||
static inline bool btrfs_use_zone_append(struct btrfs_inode *inode,
|
||||
struct extent_map *em)
|
||||
static inline bool btrfs_use_zone_append(struct btrfs_inode *inode, u64 start)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user