mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 14:12:06 +00:00
for-5.15-rc2-tag
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEE8rQSAMVO+zA4DBdWxWXV+ddtWDsFAmFM79wACgkQxWXV+ddt WDtdZQ/+K7NNEutg4JEH7n2KiXxwj8P23NwVK66a+XwH6/ZBe9xz5TQpnTJQ+D13 +3mhthTJG7Wbcv+FlUVbfTSp5q8m2IH7CKox43o4JCZEEGtFfRPHrBGHLlGKMk3P ap2TZ3rvo0Sb21rx978HCQY824wdJvhv0SmWSScmvWzlTQEKaJHz1OFJgFxhUsMp Cy9y7mtIy+Ei4qJglU88iFNXhNL6YvwqXxDFY5LwN9rlCaV+rLk476aPfIBvvyf8 4f34FHJOe1w9Jlk3KfydIwWefRBbq2dm0zNqNrMHNjl8zXbvfn8+ETOvf54HbjIz GGgKiZlBgNh2Na+p0SLoloEvBUdD5lSUCXis8099oUWZ+MporIwsyy4jAvtAeWR/ QxBkZyxvTNFlXLamSo6oS58K9BNuxFYO7nLGSXQFEoYvb8/fu18rRt/A/rmNS8TU 2vxpYacNKbggoULiGDzB74JY7MHdHRcMcAhmfDeG1bvNESPHfyLnpHfWamBVoUO6 0eQOr78f1UpBlqJAGAGtfBefN1kMDnORyX0npGkGLFrKYiZbMgsxdjkNhiHnsufl 9gsNVJ6baCeB1d5qS2vpZXeOLw0ln5iYZa5Yqz0eh/yc/9Wlj/YCsKRuAbaPMR1i i2ppHo3/na4K6L0EgSi6SU3xaUT+4LLzEEcBlJJuWZEwUTeYwiM= =VJFC -----END PGP SIGNATURE----- Merge tag 'for-5.15-rc2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux Pull btrfs fixes from David Sterba: - regression fix for leak of transaction handle after verity rollback failure - properly reset device last error between mounts - improve one error handling case when checksumming bios - fixup confusing displayed size of space info free space * tag 'for-5.15-rc2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: btrfs: prevent __btrfs_dump_space_info() to underflow its free space btrfs: fix mount failure due to past and transient device flush error btrfs: fix transaction handle leak after verity rollback failure btrfs: replace BUG_ON() in btrfs_csum_one_bio() with proper error handling
This commit is contained in:
commit
f9e36107ec
@ -665,7 +665,18 @@ blk_status_t btrfs_csum_one_bio(struct btrfs_inode *inode, struct bio *bio,
|
||||
|
||||
if (!ordered) {
|
||||
ordered = btrfs_lookup_ordered_extent(inode, offset);
|
||||
BUG_ON(!ordered); /* Logic error */
|
||||
/*
|
||||
* The bio range is not covered by any ordered extent,
|
||||
* must be a code logic error.
|
||||
*/
|
||||
if (unlikely(!ordered)) {
|
||||
WARN(1, KERN_WARNING
|
||||
"no ordered extent for root %llu ino %llu offset %llu\n",
|
||||
inode->root->root_key.objectid,
|
||||
btrfs_ino(inode), offset);
|
||||
kvfree(sums);
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
}
|
||||
|
||||
nr_sectors = BTRFS_BYTES_TO_BLKS(fs_info,
|
||||
|
@ -414,9 +414,10 @@ static void __btrfs_dump_space_info(struct btrfs_fs_info *fs_info,
|
||||
{
|
||||
lockdep_assert_held(&info->lock);
|
||||
|
||||
btrfs_info(fs_info, "space_info %llu has %llu free, is %sfull",
|
||||
/* The free space could be negative in case of overcommit */
|
||||
btrfs_info(fs_info, "space_info %llu has %lld free, is %sfull",
|
||||
info->flags,
|
||||
info->total_bytes - btrfs_space_info_used(info, true),
|
||||
(s64)(info->total_bytes - btrfs_space_info_used(info, true)),
|
||||
info->full ? "" : "not ");
|
||||
btrfs_info(fs_info,
|
||||
"space_info total=%llu, used=%llu, pinned=%llu, reserved=%llu, may_use=%llu, readonly=%llu zone_unusable=%llu",
|
||||
|
@ -451,7 +451,7 @@ static int del_orphan(struct btrfs_trans_handle *trans, struct btrfs_inode *inod
|
||||
*/
|
||||
static int rollback_verity(struct btrfs_inode *inode)
|
||||
{
|
||||
struct btrfs_trans_handle *trans;
|
||||
struct btrfs_trans_handle *trans = NULL;
|
||||
struct btrfs_root *root = inode->root;
|
||||
int ret;
|
||||
|
||||
@ -473,6 +473,7 @@ static int rollback_verity(struct btrfs_inode *inode)
|
||||
trans = btrfs_start_transaction(root, 2);
|
||||
if (IS_ERR(trans)) {
|
||||
ret = PTR_ERR(trans);
|
||||
trans = NULL;
|
||||
btrfs_handle_fs_error(root->fs_info, ret,
|
||||
"failed to start transaction in verity rollback %llu",
|
||||
(u64)inode->vfs_inode.i_ino);
|
||||
@ -490,8 +491,9 @@ static int rollback_verity(struct btrfs_inode *inode)
|
||||
btrfs_abort_transaction(trans, ret);
|
||||
goto out;
|
||||
}
|
||||
btrfs_end_transaction(trans);
|
||||
out:
|
||||
if (trans)
|
||||
btrfs_end_transaction(trans);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1137,6 +1137,19 @@ static void btrfs_close_one_device(struct btrfs_device *device)
|
||||
atomic_set(&device->dev_stats_ccnt, 0);
|
||||
extent_io_tree_release(&device->alloc_state);
|
||||
|
||||
/*
|
||||
* Reset the flush error record. We might have a transient flush error
|
||||
* in this mount, and if so we aborted the current transaction and set
|
||||
* the fs to an error state, guaranteeing no super blocks can be further
|
||||
* committed. However that error might be transient and if we unmount the
|
||||
* filesystem and mount it again, we should allow the mount to succeed
|
||||
* (btrfs_check_rw_degradable() should not fail) - if after mounting the
|
||||
* filesystem again we still get flush errors, then we will again abort
|
||||
* any transaction and set the error state, guaranteeing no commits of
|
||||
* unsafe super blocks.
|
||||
*/
|
||||
device->last_flush_error = 0;
|
||||
|
||||
/* Verify the device is back in a pristine state */
|
||||
ASSERT(!test_bit(BTRFS_DEV_STATE_FLUSH_SENT, &device->dev_state));
|
||||
ASSERT(!test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state));
|
||||
|
Loading…
Reference in New Issue
Block a user