]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: reduce the size of compressed_bio
authorQu Wenruo <wqu@suse.com>
Fri, 20 Feb 2026 03:41:51 +0000 (14:11 +1030)
committerDavid Sterba <dsterba@suse.com>
Tue, 7 Apr 2026 16:55:59 +0000 (18:55 +0200)
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>
fs/btrfs/compression.c
fs/btrfs/compression.h
fs/btrfs/lzo.c
fs/btrfs/zlib.c
fs/btrfs/zstd.c

index 3a5701f68172e61c5b689f807b4244c1d1e185ce..e897342bece1f697fa5748ec1ed7e7e61c71da79 100644 (file)
@@ -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;
index 65b8bc4bbe0bfb9edd4fd916210fc735ec742e44..84600b284e1e28bd2419fc21ea558b431f38b176 100644 (file)
@@ -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;
 
index 79642e02181b93121ad47aa7c7af3db0202c06f7..0c90937707395f73224193e7f74f433ee0c12ce0 100644 (file)
@@ -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;
        }
 
index c676e715b4f80f58330e65c59fba8688dfc73a9d..147c92a4dd04cadf91386938e26a552fc287567d 100644 (file)
@@ -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);
index 3e847b91dae3fb675fa264aa94d4ff5b7ebdf256..41547ff187f659cad8c5af0c995804b96973b8bf 100644 (file)
@@ -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;