@@ -1048,6 +1048,27 @@ int btrfs_decompress_buf2page(const char *buf, unsigned long buf_start,
return 1;
}
+static inline int byte_set_size(const struct heuristic_bucket_item *bucket)
+{
+ int a = 0;
+ int byte_set_size = 0;
+
+ for (; a < BTRFS_HEURISTIC_BYTE_SET_THRESHOLD; a++) {
+ if (bucket[a].count > 0)
+ byte_set_size++;
+ }
+
+ for (; a < BTRFS_HEURISTIC_BUCKET_SIZE; a++) {
+ if (bucket[a].count > 0) {
+ byte_set_size++;
+ if (byte_set_size > BTRFS_HEURISTIC_BYTE_SET_THRESHOLD)
+ return byte_set_size;
+ }
+ }
+
+ return byte_set_size;
+}
+
/*
* Compression heuristic.
*
@@ -1096,6 +1117,12 @@ int btrfs_compress_heuristic(struct inode *inode, u64 start, u64 end)
index++;
}
+ a = byte_set_size(bucket);
+ if (a > BTRFS_HEURISTIC_BYTE_SET_THRESHOLD) {
+ ret = 1;
+ goto out;
+ }
+
out:
kfree(bucket);
return ret;
@@ -138,6 +138,7 @@ struct heuristic_bucket_item {
#define BTRFS_HEURISTIC_READ_SIZE 16
#define BTRFS_HEURISTIC_ITER_OFFSET 256
#define BTRFS_HEURISTIC_BUCKET_SIZE 256
+#define BTRFS_HEURISTIC_BYTE_SET_THRESHOLD 64
int btrfs_compress_heuristic(struct inode *inode, u64 start, u64 end);
Calculate byte set size for data sample: Calculate how many unique bytes has been in sample By count all bytes in bucket with count > 0 If byte set low (~25%), data are easily compressible Signed-off-by: Timofey Titovets <nefelim4ag@gmail.com> --- fs/btrfs/compression.c | 27 +++++++++++++++++++++++++++ fs/btrfs/compression.h | 1 + 2 files changed, 28 insertions(+) -- 2.13.3 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html