@@ -31,6 +31,7 @@
*/
#define MAX_INPUT_PAGES ((BTRFS_MAX_UNCOMPRESSED >> PAGE_SHIFT)+1)
#define MAX_SAMPLE_SIZE (MAX_INPUT_PAGES*PAGE_SIZE*READ_SIZE/ITER_SHIFT)
+#define BYTE_SET_THRESHOLD 64
struct bucket_item {
u32 count;
@@ -73,6 +74,27 @@ static struct list_head *heuristic_alloc_workspace(void)
return ERR_PTR(-ENOMEM);
}
+static int byte_set_size(const struct workspace *workspace)
+{
+ int a = 0;
+ int byte_set_size = 0;
+
+ for (; a < BYTE_SET_THRESHOLD; a++) {
+ if (workspace->bucket[a].count > 0)
+ byte_set_size++;
+ }
+
+ for (; a < BUCKET_SIZE; a++) {
+ if (workspace->bucket[a].count > 0) {
+ byte_set_size++;
+ if (byte_set_size > BYTE_SET_THRESHOLD)
+ return byte_set_size;
+ }
+ }
+
+ return byte_set_size;
+}
+
static bool sample_zeroed(struct workspace *workspace)
{
u32 i;
@@ -135,6 +157,10 @@ static int heuristic(struct list_head *ws, struct inode *inode,
workspace->bucket[byte].count++;
}
+ a = byte_set_size(workspace);
+ if (a > BYTE_SET_THRESHOLD)
+ return 2;
+
return 1;
}
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/heuristic.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) -- 2.14.1 -- 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