mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 08:19:28 +00:00
Btrfs: heuristic: add detection of repeated data patterns
Walk over data sample and use memcmp to detect repeated patterns, like zeros, but a bit more general. Signed-off-by: Timofey Titovets <nefelim4ag@gmail.com> Reviewed-by: David Sterba <dsterba@suse.com> [ minor coding style fixes ] Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
a440d48c7f
commit
1fe4f6fa5a
1 changed files with 14 additions and 1 deletions
|
@ -1222,6 +1222,14 @@ int btrfs_decompress_buf2page(const char *buf, unsigned long buf_start,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool sample_repeated_patterns(struct heuristic_ws *ws)
|
||||||
|
{
|
||||||
|
const u32 half_of_sample = ws->sample_size / 2;
|
||||||
|
const u8 *data = ws->sample;
|
||||||
|
|
||||||
|
return memcmp(&data[0], &data[half_of_sample], half_of_sample) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void heuristic_collect_sample(struct inode *inode, u64 start, u64 end,
|
static void heuristic_collect_sample(struct inode *inode, u64 start, u64 end,
|
||||||
struct heuristic_ws *ws)
|
struct heuristic_ws *ws)
|
||||||
{
|
{
|
||||||
|
@ -1301,6 +1309,11 @@ int btrfs_compress_heuristic(struct inode *inode, u64 start, u64 end)
|
||||||
|
|
||||||
heuristic_collect_sample(inode, start, end, ws);
|
heuristic_collect_sample(inode, start, end, ws);
|
||||||
|
|
||||||
|
if (sample_repeated_patterns(ws)) {
|
||||||
|
ret = 1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
memset(ws->bucket, 0, sizeof(*ws->bucket)*BUCKET_SIZE);
|
memset(ws->bucket, 0, sizeof(*ws->bucket)*BUCKET_SIZE);
|
||||||
|
|
||||||
for (i = 0; i < ws->sample_size; i++) {
|
for (i = 0; i < ws->sample_size; i++) {
|
||||||
|
@ -1308,8 +1321,8 @@ int btrfs_compress_heuristic(struct inode *inode, u64 start, u64 end)
|
||||||
ws->bucket[byte].count++;
|
ws->bucket[byte].count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
__free_workspace(0, ws_list, true);
|
__free_workspace(0, ws_list, true);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue