diff mbox series

[2/5] btrfs: Introduce helper functions for compression.

Message ID 1642322953-1856-1-git-send-email-zhanglikernel@gmail.com (mailing list archive)
State New, archived
Headers show
Series btrfs: Cleanup BTRFS_INODE_NOCOMPRESS usage and extend | expand

Commit Message

Li Zhang Jan. 16, 2022, 8:49 a.m. UTC
1. Introduce the compression type and compression level
combination function. Use the lowest 4 bits of unsigned
int to record the compression type and 5 - 8 bits to record
the compression level.

2. Introduce functions to parse compression description strings
into filesystem flags and vice versa.

Signed-off-by: Li Zhang <zhanglikernel@gmail.com>
---
 fs/btrfs/compression.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++
 fs/btrfs/compression.h | 14 ++++++++++++++
 2 files changed, 65 insertions(+)
diff mbox series

Patch

diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index 71e5b2e..019ed2d 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -49,6 +49,38 @@  const char* btrfs_compress_type2str(enum btrfs_compression_type type)
 	return NULL;
 }
 
+/*
+ * convert str to combination of compression type and level
+ * ret: combination of compression type and compress level
+ * return type and level separately if caller specify type and level pointer
+ */
+unsigned int btrfs_compress_str2type_level(const char *str, unsigned int *type, unsigned int *level){
+    int i;
+    unsigned int result_type, result_level;
+    size_t len = strlen(str);
+    result_type = BTRFS_COMPRESS_NONE;
+    result_level = 0;
+    for(i = 1; i < ARRAY_SIZE(btrfs_compress_types); i ++){
+        size_t comp_len = strlen(btrfs_compress_types[i]);
+        if(len < comp_len){
+            continue;
+        }
+        if(!strncmp(btrfs_compress_types[i], str, comp_len)){
+            result_type = BTRFS_COMPRESS_NONE + i;
+            result_level = btrfs_compress_str2level(result_type, str + comp_len);
+            break;
+        }
+    }
+    if(type != NULL){
+        *type = result_type;
+    }
+    if(level != NULL){
+        *level = result_level;
+    }
+    return btrfs_compress_combine_type_level(result_type, result_level);
+}
+
+
 bool btrfs_compress_is_valid_type(const char *str, size_t len)
 {
 	int i;
@@ -1888,3 +1920,22 @@  unsigned int btrfs_compress_str2level(unsigned int type, const char *str)
 
 	return level;
 }
+
+
+/*
+ * convert combination of compression type and level to meaningful string
+ * the caller should specify buffer and buffer size
+ */
+char *btrfs_compress_type_level2str(unsigned type, unsigned level, char *out, size_t out_len){
+	switch (type) {
+	case BTRFS_COMPRESS_ZLIB:
+	case BTRFS_COMPRESS_LZO:
+	case BTRFS_COMPRESS_ZSTD:
+	case BTRFS_COMPRESS_NONE:
+        snprintf(out, out_len, "%s:%d", btrfs_compress_types[type], btrfs_compress_set_level(type, level));
+        return out;
+	default:
+		break;
+	}
+    return NULL;
+}
diff --git a/fs/btrfs/compression.h b/fs/btrfs/compression.h
index 56eef08..b76473c 100644
--- a/fs/btrfs/compression.h
+++ b/fs/btrfs/compression.h
@@ -76,6 +76,16 @@  static inline unsigned int btrfs_compress_level(unsigned int type_level)
 	return ((type_level & 0xF0) >> 4);
 }
 
+/*
+ * helper function combine compression type and level
+ * combine compression type and level in one byte
+ * the lower 4bit represent compression type
+ * the upper 4bit represent compression level 
+ */
+static inline unsigned int btrfs_compress_combine_type_level(unsigned int type, unsigned level){
+    return (level << 4) | type;
+}
+
 void __init btrfs_init_compress(void);
 void __cold btrfs_exit_compress(void);
 
@@ -101,6 +111,10 @@  blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
 
 unsigned int btrfs_compress_str2level(unsigned int type, const char *str);
 
+unsigned int btrfs_compress_str2type_level(const char *str, unsigned int * type, unsigned int *level);
+
+char *btrfs_compress_type_level2str(unsigned type, unsigned level, char *out, size_t out_len);
+
 enum btrfs_compression_type {
 	BTRFS_COMPRESS_NONE  = 0,
 	BTRFS_COMPRESS_ZLIB  = 1,