On Fri, May 30, 2025 at 10:52:43PM +0800, George Hu wrote: > Eliminate redundant encode & decode function by using union for > bch_compression_opt, which reduces code complexity.
order of bitfield members is not fixed, to do this you need #ifdef __LITTLE_ENDIN_BITFIELD... > > Signed-off-by: George Hu <[email protected]> > --- > fs/bcachefs/compress.c | 17 +++++++++-------- > fs/bcachefs/compress.h | 32 +++++++------------------------- > fs/bcachefs/extents.c | 2 +- > 3 files changed, 17 insertions(+), 34 deletions(-) > > diff --git a/fs/bcachefs/compress.c b/fs/bcachefs/compress.c > index 1bca61d17092..10e88e14f5ed 100644 > --- a/fs/bcachefs/compress.c > +++ b/fs/bcachefs/compress.c > @@ -336,7 +336,7 @@ static int attempt_compress(struct bch_fs *c, > void *workspace, > void *dst, size_t dst_len, > void *src, size_t src_len, > - struct bch_compression_opt compression) > + union bch_compression_opt compression) > { > enum bch_compression_type compression_type = > __bch2_compression_opt_to_type[compression.type]; > @@ -426,7 +426,7 @@ static int attempt_compress(struct bch_fs *c, > static unsigned __bio_compress(struct bch_fs *c, > struct bio *dst, size_t *dst_len, > struct bio *src, size_t *src_len, > - struct bch_compression_opt compression) > + union bch_compression_opt compression) > { > struct bbuf src_data = { NULL }, dst_data = { NULL }; > void *workspace; > @@ -553,7 +553,7 @@ unsigned bch2_bio_compress(struct bch_fs *c, > > compression_type = > __bio_compress(c, dst, dst_len, src, src_len, > - bch2_compression_decode(compression_opt)); > + (union bch_compression_opt){ .value = > compression_opt }); > > dst->bi_iter.bi_size = orig_dst; > src->bi_iter.bi_size = orig_src; > @@ -602,7 +602,8 @@ static int __bch2_check_set_has_compressed_data(struct > bch_fs *c, u64 f) > int bch2_check_set_has_compressed_data(struct bch_fs *c, > unsigned compression_opt) > { > - unsigned compression_type = > bch2_compression_decode(compression_opt).type; > + unsigned int compression_type = ((union bch_compression_opt){ .value = > compression_opt }) > + .type; > > BUG_ON(compression_type >= ARRAY_SIZE(bch2_compression_opt_to_feature)); > > @@ -683,7 +684,7 @@ static int __bch2_fs_compress_init(struct bch_fs *c, u64 > features) > > static u64 compression_opt_to_feature(unsigned v) > { > - unsigned type = bch2_compression_decode(v).type; > + unsigned int type = ((union bch_compression_opt){ .value = v }).type; > > return BIT_ULL(bch2_compression_opt_to_feature[type]); > } > @@ -703,7 +704,7 @@ int bch2_opt_compression_parse(struct bch_fs *c, const > char *_val, u64 *res, > { > char *val = kstrdup(_val, GFP_KERNEL); > char *p = val, *type_str, *level_str; > - struct bch_compression_opt opt = { 0 }; > + union bch_compression_opt opt = { 0 }; > int ret; > > if (!val) > @@ -736,7 +737,7 @@ int bch2_opt_compression_parse(struct bch_fs *c, const > char *_val, u64 *res, > opt.level = level; > } > > - *res = bch2_compression_encode(opt); > + *res = opt.value; > err: > kfree(val); > return ret; > @@ -744,7 +745,7 @@ int bch2_opt_compression_parse(struct bch_fs *c, const > char *_val, u64 *res, > > void bch2_compression_opt_to_text(struct printbuf *out, u64 v) > { > - struct bch_compression_opt opt = bch2_compression_decode(v); > + union bch_compression_opt opt = { .value = v }; > > if (opt.type < BCH_COMPRESSION_OPT_NR) > prt_str(out, bch2_compression_opts[opt.type]); > diff --git a/fs/bcachefs/compress.h b/fs/bcachefs/compress.h > index bec2f05bfd52..8cded510b2ac 100644 > --- a/fs/bcachefs/compress.h > +++ b/fs/bcachefs/compress.h > @@ -10,41 +10,23 @@ static const unsigned __bch2_compression_opt_to_type[] = { > #undef x > }; > > -struct bch_compression_opt { > - u8 type:4, > - level:4; > -}; > - > -static inline struct bch_compression_opt __bch2_compression_decode(unsigned > v) > -{ > - return (struct bch_compression_opt) { > - .type = v & 15, > - .level = v >> 4, > +union bch_compression_opt { > + u8 value; > + struct { > + u8 type:4, level:4; > }; > -} > +}; > > static inline bool bch2_compression_opt_valid(unsigned v) > { > - struct bch_compression_opt opt = __bch2_compression_decode(v); > + union bch_compression_opt opt = { .value = v }; > > return opt.type < ARRAY_SIZE(__bch2_compression_opt_to_type) && > !(!opt.type && opt.level); > } > > -static inline struct bch_compression_opt bch2_compression_decode(unsigned v) > -{ > - return bch2_compression_opt_valid(v) > - ? __bch2_compression_decode(v) > - : (struct bch_compression_opt) { 0 }; > -} > - > -static inline unsigned bch2_compression_encode(struct bch_compression_opt > opt) > -{ > - return opt.type|(opt.level << 4); > -} > - > static inline enum bch_compression_type > bch2_compression_opt_to_type(unsigned v) > { > - return __bch2_compression_opt_to_type[bch2_compression_decode(v).type]; > + return __bch2_compression_opt_to_type[((union bch_compression_opt){ > .value = v }).type]; > } > > struct bch_write_op; > diff --git a/fs/bcachefs/extents.c b/fs/bcachefs/extents.c > index 677cf453b332..64419c028662 100644 > --- a/fs/bcachefs/extents.c > +++ b/fs/bcachefs/extents.c > @@ -1512,7 +1512,7 @@ int bch2_bkey_ptrs_validate(struct bch_fs *c, struct > bkey_s_c k, > const struct bch_extent_rebalance *r = > &entry->rebalance; > > if (!bch2_compression_opt_valid(r->compression)) { > - struct bch_compression_opt opt = > __bch2_compression_decode(r->compression); > + union bch_compression_opt opt = { .value = > r->compression }; > prt_printf(err, "invalid compression opt %u:%u", > opt.type, opt.level); > return -BCH_ERR_invalid_bkey; > -- > 2.49.0 >
