for-6.9-rc5-tag
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEE8rQSAMVO+zA4DBdWxWXV+ddtWDsFAmYnyRwACgkQxWXV+ddt WDtnlA/9GWPYrQFBBzPZeXZHldr7grn8t8oDVVvMhSxRslrk2XYGqRVEVfZT5+Wp wsbqdfmDXShstWkU43jxXcJAg4QxQNBBSVaKVMO5rXkM5ZHLdn78EJs5htSuy+67 n0zFqqxVr0F9LvrHqs/JJp70fr3WQtGINAkxda0JHKaMEj2nSnGjzKf6GAPomAs+ 7BWQlV4cc8tQAox2MxCFx1eXTISepa9pi0ojm0R+siZGgMkmzpjJTy9WZ3EtIWQN 4LU5FMCQMsKkqUETxsEs5Va0QkEvN3SuiNsoUIJZFSArws3cwYz+u10+8Rpc/U1o 8P3H8fGxvbYpRt6QjG1GGYy0LxhyYeyGp+fNfeBF4pl2MAn2e8qeiPpPlC+Q6/U2 /Nn8+x9/FgWQKNmu76DQ1BM4WoD18mEUQrB6OYLO/9FBttLAevaEO3vxECxosBIj wGyfXJ/r4Y2Vva+pkjreBpc7m/VwwOPGdRHkKk8mzFGqoQzSwvs/pm3ldF9dV7ud smZ0H8vvaEDigOd4oFR2vC2wpETaCL89oS9x/NzMvqlqQaGJoD6t591c3yRwmvro hJYT5lG6KR+ZeDgv+2ZZA2s5/2l7193pkS3toj7v1xSOkpjADPaTBg+2P5o27YyJ UvXbEpdcCV6xWxT3Ak/bkfS1dDGfxAtwV7c/sPGvY5KtmbvjOBE= =riVJ -----END PGP SIGNATURE----- Merge tag 'for-6.9-rc5-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux Pull btrfs fixes from David Sterba: - fix information leak by the buffer returned from LOGICAL_INO ioctl - fix flipped condition in scrub when tracking sectors in zoned mode - fix calculation when dropping extent range - reinstate fallback to write uncompressed data in case of fragmented space that could not store the entire compressed chunk - minor fix to message formatting style to make it conforming to the commonly used style * tag 'for-6.9-rc5-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: btrfs: fix wrong block_start calculation for btrfs_drop_extent_map_range() btrfs: fix information leak in btrfs_ioctl_logical_to_ino() btrfs: fallback if compressed IO fails for ENOSPC btrfs: scrub: run relocation repair when/only needed btrfs: remove colon from messages with state
This commit is contained in:
commit
e88c4cfcb7
@ -2776,20 +2776,14 @@ struct btrfs_data_container *init_data_container(u32 total_bytes)
|
||||
size_t alloc_bytes;
|
||||
|
||||
alloc_bytes = max_t(size_t, total_bytes, sizeof(*data));
|
||||
data = kvmalloc(alloc_bytes, GFP_KERNEL);
|
||||
data = kvzalloc(alloc_bytes, GFP_KERNEL);
|
||||
if (!data)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
if (total_bytes >= sizeof(*data)) {
|
||||
if (total_bytes >= sizeof(*data))
|
||||
data->bytes_left = total_bytes - sizeof(*data);
|
||||
data->bytes_missing = 0;
|
||||
} else {
|
||||
else
|
||||
data->bytes_missing = sizeof(*data) - total_bytes;
|
||||
data->bytes_left = 0;
|
||||
}
|
||||
|
||||
data->elem_cnt = 0;
|
||||
data->elem_missed = 0;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
@ -817,7 +817,7 @@ void btrfs_drop_extent_map_range(struct btrfs_inode *inode, u64 start, u64 end,
|
||||
split->block_len = em->block_len;
|
||||
split->orig_start = em->orig_start;
|
||||
} else {
|
||||
const u64 diff = start + len - em->start;
|
||||
const u64 diff = end - em->start;
|
||||
|
||||
split->block_len = split->len;
|
||||
split->block_start += diff;
|
||||
|
@ -1145,13 +1145,13 @@ static void submit_one_async_extent(struct async_chunk *async_chunk,
|
||||
0, *alloc_hint, &ins, 1, 1);
|
||||
if (ret) {
|
||||
/*
|
||||
* Here we used to try again by going back to non-compressed
|
||||
* path for ENOSPC. But we can't reserve space even for
|
||||
* compressed size, how could it work for uncompressed size
|
||||
* which requires larger size? So here we directly go error
|
||||
* path.
|
||||
* We can't reserve contiguous space for the compressed size.
|
||||
* Unlikely, but it's possible that we could have enough
|
||||
* non-contiguous space for the uncompressed size instead. So
|
||||
* fall back to uncompressed.
|
||||
*/
|
||||
goto out_free;
|
||||
submit_uncompressed_range(inode, async_extent, locked_page);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Here we're doing allocation and writeback of the compressed pages */
|
||||
@ -1203,7 +1203,6 @@ done:
|
||||
out_free_reserve:
|
||||
btrfs_dec_block_group_reservations(fs_info, ins.objectid);
|
||||
btrfs_free_reserved_extent(fs_info, ins.objectid, ins.offset, 1);
|
||||
out_free:
|
||||
mapping_set_error(inode->vfs_inode.i_mapping, -EIO);
|
||||
extent_clear_unlock_delalloc(inode, start, end,
|
||||
NULL, EXTENT_LOCKED | EXTENT_DELALLOC |
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
|
||||
#define STATE_STRING_PREFACE ": state "
|
||||
#define STATE_STRING_PREFACE " state "
|
||||
#define STATE_STRING_BUF_LEN (sizeof(STATE_STRING_PREFACE) + BTRFS_FS_STATE_COUNT + 1)
|
||||
|
||||
/*
|
||||
|
@ -1012,6 +1012,7 @@ static void scrub_stripe_read_repair_worker(struct work_struct *work)
|
||||
struct btrfs_fs_info *fs_info = sctx->fs_info;
|
||||
int num_copies = btrfs_num_copies(fs_info, stripe->bg->start,
|
||||
stripe->bg->length);
|
||||
unsigned long repaired;
|
||||
int mirror;
|
||||
int i;
|
||||
|
||||
@ -1078,17 +1079,16 @@ out:
|
||||
* Submit the repaired sectors. For zoned case, we cannot do repair
|
||||
* in-place, but queue the bg to be relocated.
|
||||
*/
|
||||
bitmap_andnot(&repaired, &stripe->init_error_bitmap, &stripe->error_bitmap,
|
||||
stripe->nr_sectors);
|
||||
if (!sctx->readonly && !bitmap_empty(&repaired, stripe->nr_sectors)) {
|
||||
if (btrfs_is_zoned(fs_info)) {
|
||||
if (!bitmap_empty(&stripe->error_bitmap, stripe->nr_sectors))
|
||||
btrfs_repair_one_zone(fs_info, sctx->stripes[0].bg->start);
|
||||
} else if (!sctx->readonly) {
|
||||
unsigned long repaired;
|
||||
|
||||
bitmap_andnot(&repaired, &stripe->init_error_bitmap,
|
||||
&stripe->error_bitmap, stripe->nr_sectors);
|
||||
} else {
|
||||
scrub_write_sectors(sctx, stripe, repaired, false);
|
||||
wait_scrub_stripe_io(stripe);
|
||||
}
|
||||
}
|
||||
|
||||
scrub_stripe_report_errors(sctx, stripe);
|
||||
set_bit(SCRUB_STRIPE_FLAG_REPAIR_DONE, &stripe->state);
|
||||
|
@ -847,6 +847,11 @@ static int test_case_7(struct btrfs_fs_info *fs_info)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (em->block_start != SZ_32K + SZ_4K) {
|
||||
test_err("em->block_start is %llu, expected 36K", em->block_start);
|
||||
goto out;
|
||||
}
|
||||
|
||||
free_extent_map(em);
|
||||
|
||||
read_lock(&em_tree->lock);
|
||||
|
Loading…
Reference in New Issue
Block a user