for-4.15-rc3-tag
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEE8rQSAMVO+zA4DBdWxWXV+ddtWDsFAlosIf4ACgkQxWXV+ddt WDspsw//YPhztOkAM7L37Lcv6PuMIBm7AsZax+iUctx9GlE9Yb9dYX+yIGjk3N44 M6oHANP/Af70lGn3jaNlH+BeQre+RFD2KnT+Yyvp/0DV5+v+Bb6wqzrVqeYf9NIr lf6yc925gX10+DM6UXpYopTmdB8zXXO8xnqmFuT1jC/PrW/g+Hpxi7UtFFcoXwnE uucdih1LnNC/2pwp4ygQAxMkLnU2foWRsEP9lqsv83ecKDBfVxHUidzEZLTO7L+c ePc74AcyuPZ7DobuSDyDF4e0Ru5YtY5Zf+KR7RZHag5BNF2YLJE/XtN+hd3YhOQA 7VniaPzUEG74ukvkL3L2oqxrMEavE0IFJtmzT4CM8DlRsGsDnn5n45sGHfo5clr8 33XOq8aiGtbG1vwVbBJOuNQI2SWJxwe1OyAZoV/o1UVrltSCRf+dYL8Yf3IO2K0M DRnRNqEcZQGfqrVO5Iblw7VzVqY9LKiRESScS0Btvrys+DTVZAgC9CJDwN446E5v i56PrmT8OcC9MzP9wFIZtg27jiC0ndNwkqUhFrt1LBvC+BtvZvshAnFLhLfSRyZo 0gqp2GoP6CFaUd5Ok+osALWF2VG8cpMJ7urdX0O5zXEYKioLwiXUS9Z7sldfHsJr Uiy1uh70UIOM96ZcsXyjLr0LO5vmgkV2kyDNbR5DtrJhfFai4Gs= =YaZE -----END PGP SIGNATURE----- Merge tag 'for-4.15-rc3-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux Pull btrfs fixes from David Sterba: "This contains a few fixes (error handling, quota leak, FUA vs nobarrier mount option). There's one one worth mentioning separately - an off-by-one fix that leads to overwriting first byte of an adjacent page with 0, out of bounds of the memory allocated by an ioctl. This is under a privileged part of the ioctl, can be triggerd in some subvolume layouts" * tag 'for-4.15-rc3-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: btrfs: Fix possible off-by-one in btrfs_search_path_in_tree Btrfs: disable FUA if mounted with nobarrier btrfs: fix missing error return in btrfs_drop_snapshot btrfs: handle errors while updating refcounts in update_ref_for_cow btrfs: Fix quota reservation leak on preallocated files
This commit is contained in:
commit
51090c5d6d
|
@ -1032,14 +1032,17 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans,
|
|||
root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) &&
|
||||
!(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)) {
|
||||
ret = btrfs_inc_ref(trans, root, buf, 1);
|
||||
BUG_ON(ret); /* -ENOMEM */
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (root->root_key.objectid ==
|
||||
BTRFS_TREE_RELOC_OBJECTID) {
|
||||
ret = btrfs_dec_ref(trans, root, buf, 0);
|
||||
BUG_ON(ret); /* -ENOMEM */
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = btrfs_inc_ref(trans, root, cow, 1);
|
||||
BUG_ON(ret); /* -ENOMEM */
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
new_flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
|
||||
} else {
|
||||
|
@ -1049,7 +1052,8 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans,
|
|||
ret = btrfs_inc_ref(trans, root, cow, 1);
|
||||
else
|
||||
ret = btrfs_inc_ref(trans, root, cow, 0);
|
||||
BUG_ON(ret); /* -ENOMEM */
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
if (new_flags != 0) {
|
||||
int level = btrfs_header_level(buf);
|
||||
|
@ -1068,9 +1072,11 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans,
|
|||
ret = btrfs_inc_ref(trans, root, cow, 1);
|
||||
else
|
||||
ret = btrfs_inc_ref(trans, root, cow, 0);
|
||||
BUG_ON(ret); /* -ENOMEM */
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = btrfs_dec_ref(trans, root, buf, 1);
|
||||
BUG_ON(ret); /* -ENOMEM */
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
clean_tree_block(fs_info, buf);
|
||||
*last_ref = 1;
|
||||
|
|
|
@ -3231,6 +3231,7 @@ static int write_dev_supers(struct btrfs_device *device,
|
|||
int errors = 0;
|
||||
u32 crc;
|
||||
u64 bytenr;
|
||||
int op_flags;
|
||||
|
||||
if (max_mirrors == 0)
|
||||
max_mirrors = BTRFS_SUPER_MIRROR_MAX;
|
||||
|
@ -3273,13 +3274,10 @@ static int write_dev_supers(struct btrfs_device *device,
|
|||
* we fua the first super. The others we allow
|
||||
* to go down lazy.
|
||||
*/
|
||||
if (i == 0) {
|
||||
ret = btrfsic_submit_bh(REQ_OP_WRITE,
|
||||
REQ_SYNC | REQ_FUA | REQ_META | REQ_PRIO, bh);
|
||||
} else {
|
||||
ret = btrfsic_submit_bh(REQ_OP_WRITE,
|
||||
REQ_SYNC | REQ_META | REQ_PRIO, bh);
|
||||
}
|
||||
op_flags = REQ_SYNC | REQ_META | REQ_PRIO;
|
||||
if (i == 0 && !btrfs_test_opt(device->fs_info, NOBARRIER))
|
||||
op_flags |= REQ_FUA;
|
||||
ret = btrfsic_submit_bh(REQ_OP_WRITE, op_flags, bh);
|
||||
if (ret)
|
||||
errors++;
|
||||
}
|
||||
|
|
|
@ -9206,6 +9206,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root,
|
|||
ret = btrfs_del_root(trans, fs_info, &root->root_key);
|
||||
if (ret) {
|
||||
btrfs_abort_transaction(trans, ret);
|
||||
err = ret;
|
||||
goto out_end_trans;
|
||||
}
|
||||
|
||||
|
|
|
@ -3005,6 +3005,8 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent)
|
|||
compress_type = ordered_extent->compress_type;
|
||||
if (test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags)) {
|
||||
BUG_ON(compress_type);
|
||||
btrfs_qgroup_free_data(inode, NULL, ordered_extent->file_offset,
|
||||
ordered_extent->len);
|
||||
ret = btrfs_mark_extent_written(trans, BTRFS_I(inode),
|
||||
ordered_extent->file_offset,
|
||||
ordered_extent->file_offset +
|
||||
|
|
|
@ -2206,7 +2206,7 @@ static noinline int btrfs_search_path_in_tree(struct btrfs_fs_info *info,
|
|||
if (!path)
|
||||
return -ENOMEM;
|
||||
|
||||
ptr = &name[BTRFS_INO_LOOKUP_PATH_MAX];
|
||||
ptr = &name[BTRFS_INO_LOOKUP_PATH_MAX - 1];
|
||||
|
||||
key.objectid = tree_id;
|
||||
key.type = BTRFS_ROOT_ITEM_KEY;
|
||||
|
|
Loading…
Reference in New Issue