summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQu Wenruo <wqu@suse.com>2026-02-20 06:41:51 +0300
committerDavid Sterba <dsterba@suse.com>2026-04-07 19:55:59 +0300
commitb05342fe47b9828d004baf2b24cccd0479de54a5 (patch)
tree73d8183510426ed3746e8449eb29eb0f5f73e9ce
parentc4bc2dd32c63a70ed948ed9927ea2c46f7c5b454 (diff)
downloadlinux-b05342fe47b9828d004baf2b24cccd0479de54a5.tar.xz
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>
-rw-r--r--fs/btrfs/compression.c2
-rw-r--r--fs/btrfs/compression.h3
-rw-r--r--fs/btrfs/lzo.c7
-rw-r--r--fs/btrfs/zlib.c2
-rw-r--r--fs/btrfs/zstd.c2
5 files changed, 6 insertions, 10 deletions
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index 3a5701f68172..e897342bece1 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -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;
diff --git a/fs/btrfs/compression.h b/fs/btrfs/compression.h
index 65b8bc4bbe0b..84600b284e1e 100644
--- a/fs/btrfs/compression.h
+++ b/fs/btrfs/compression.h
@@ -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;
diff --git a/fs/btrfs/lzo.c b/fs/btrfs/lzo.c
index 79642e02181b..0c9093770739 100644
--- a/fs/btrfs/lzo.c
+++ b/fs/btrfs/lzo.c
@@ -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;
}
diff --git a/fs/btrfs/zlib.c b/fs/btrfs/zlib.c
index c676e715b4f8..147c92a4dd04 100644
--- a/fs/btrfs/zlib.c
+++ b/fs/btrfs/zlib.c
@@ -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);
diff --git a/fs/btrfs/zstd.c b/fs/btrfs/zstd.c
index 3e847b91dae3..41547ff187f6 100644
--- a/fs/btrfs/zstd.c
+++ b/fs/btrfs/zstd.c
@@ -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;