mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 09:04:39 +02:00
btrfs: reduce the size of compressed_bio
The member compressed_bio::compressed_len can be replaced by the bio
size, as we always submit the full compressed data without any partial
read/write.
Furthermore we already have enough ASSERT()s making sure the bio size
matches the ordered extent or the extent map.
This saves 8 bytes from compressed_bio:
Before:
struct compressed_bio {
u64 start; /* 0 8 */
unsigned int len; /* 8 4 */
unsigned int compressed_len; /* 12 4 */
u8 compress_type; /* 16 1 */
bool writeback; /* 17 1 */
/* XXX 6 bytes hole, try to pack */
struct btrfs_bio * orig_bbio; /* 24 8 */
struct btrfs_bio bbio __attribute__((__aligned__(8))); /* 32 304 */
/* XXX last struct has 1 bit hole */
/* size: 336, cachelines: 6, members: 7 */
/* sum members: 330, holes: 1, sum holes: 6 */
/* member types with bit holes: 1, total: 1 */
/* forced alignments: 1 */
/* last cacheline: 16 bytes */
} __attribute__((__aligned__(8)));
After:
struct compressed_bio {
u64 start; /* 0 8 */
unsigned int len; /* 8 4 */
u8 compress_type; /* 12 1 */
bool writeback; /* 13 1 */
/* XXX 2 bytes hole, try to pack */
struct btrfs_bio * orig_bbio; /* 16 8 */
struct btrfs_bio bbio __attribute__((__aligned__(8))); /* 24 304 */
/* XXX last struct has 1 bit hole */
/* size: 328, cachelines: 6, members: 6 */
/* sum members: 326, holes: 1, sum holes: 2 */
/* member types with bit holes: 1, total: 1 */
/* forced alignments: 1 */
/* last cacheline: 8 bytes */
} __attribute__((__aligned__(8)));
Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
c4bc2dd32c
commit
b05342fe47
|
|
@ -330,7 +330,6 @@ void btrfs_submit_compressed_write(struct btrfs_ordered_extent *ordered,
|
|||
cb->start = ordered->file_offset;
|
||||
cb->len = ordered->num_bytes;
|
||||
ASSERT(cb->bbio.bio.bi_iter.bi_size == ordered->disk_num_bytes);
|
||||
cb->compressed_len = ordered->disk_num_bytes;
|
||||
cb->bbio.bio.bi_iter.bi_sector = ordered->disk_bytenr >> SECTOR_SHIFT;
|
||||
cb->bbio.ordered = ordered;
|
||||
|
||||
|
|
@ -560,7 +559,6 @@ void btrfs_submit_compressed_read(struct btrfs_bio *bbio)
|
|||
em_start = em->start;
|
||||
|
||||
cb->len = bbio->bio.bi_iter.bi_size;
|
||||
cb->compressed_len = compressed_len;
|
||||
cb->compress_type = btrfs_extent_map_compression(em);
|
||||
cb->orig_bbio = bbio;
|
||||
cb->bbio.csum_search_commit_root = bbio->csum_search_commit_root;
|
||||
|
|
|
|||
|
|
@ -48,9 +48,6 @@ struct compressed_bio {
|
|||
/* Number of bytes in the inode we're working on */
|
||||
unsigned int len;
|
||||
|
||||
/* Number of bytes on disk */
|
||||
unsigned int compressed_len;
|
||||
|
||||
/* The compression algorithm for this bio */
|
||||
u8 compress_type;
|
||||
|
||||
|
|
|
|||
|
|
@ -431,6 +431,7 @@ int lzo_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
|
|||
struct workspace *workspace = list_entry(ws, struct workspace, list);
|
||||
struct btrfs_fs_info *fs_info = cb->bbio.inode->root->fs_info;
|
||||
const u32 sectorsize = fs_info->sectorsize;
|
||||
const u32 compressed_len = bio_get_size(&cb->bbio.bio);
|
||||
struct folio_iter fi;
|
||||
char *kaddr;
|
||||
int ret;
|
||||
|
|
@ -460,14 +461,14 @@ int lzo_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
|
|||
* and all sectors should be used.
|
||||
* If this happens, it means the compressed extent is corrupted.
|
||||
*/
|
||||
if (unlikely(len_in > min_t(size_t, BTRFS_MAX_COMPRESSED, cb->compressed_len) ||
|
||||
round_up(len_in, sectorsize) < cb->compressed_len)) {
|
||||
if (unlikely(len_in > min_t(size_t, BTRFS_MAX_COMPRESSED, compressed_len) ||
|
||||
round_up(len_in, sectorsize) < compressed_len)) {
|
||||
struct btrfs_inode *inode = cb->bbio.inode;
|
||||
|
||||
btrfs_err(fs_info,
|
||||
"lzo header invalid, root %llu inode %llu offset %llu lzo len %u compressed len %u",
|
||||
btrfs_root_id(inode->root), btrfs_ino(inode),
|
||||
cb->start, len_in, cb->compressed_len);
|
||||
cb->start, len_in, compressed_len);
|
||||
return -EUCLEAN;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -351,7 +351,7 @@ int zlib_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
|
|||
int wbits = MAX_WBITS;
|
||||
char *data_in;
|
||||
size_t total_out = 0;
|
||||
size_t srclen = cb->compressed_len;
|
||||
const size_t srclen = bio_get_size(&cb->bbio.bio);
|
||||
unsigned long buf_start;
|
||||
|
||||
bio_first_folio(&fi, &cb->bbio.bio, 0);
|
||||
|
|
|
|||
|
|
@ -587,7 +587,7 @@ int zstd_decompress_bio(struct list_head *ws, struct compressed_bio *cb)
|
|||
struct btrfs_fs_info *fs_info = cb_to_fs_info(cb);
|
||||
struct workspace *workspace = list_entry(ws, struct workspace, list);
|
||||
struct folio_iter fi;
|
||||
size_t srclen = cb->compressed_len;
|
||||
size_t srclen = bio_get_size(&cb->bbio.bio);
|
||||
zstd_dstream *stream;
|
||||
int ret = 0;
|
||||
const u32 blocksize = fs_info->sectorsize;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user