@@ -76,20 +76,47 @@ static struct list_head *heuristic_alloc_workspace(void)
static int heuristic(struct list_head *ws, struct inode *inode,
u64 start, u64 end)
{
+ struct workspace *workspace = list_entry(ws, struct workspace, list);
struct page *page;
u64 index, index_end;
- u8 *input_data;
+ u8 *in_data;
+ u32 a, b;
+ u8 byte;
+
+ /*
+ * Compression only handle first 128kb of input range
+ * And just shift over range in loop for compressing it.
+ * Let's do the same.
+ */
+ if (end - start > BTRFS_MAX_UNCOMPRESSED)
+ end = start + BTRFS_MAX_UNCOMPRESSED;
index = start >> PAGE_SHIFT;
index_end = end >> PAGE_SHIFT;
+ b = 0;
for (; index <= index_end; index++) {
page = find_get_page(inode->i_mapping, index);
- input_data = kmap(page);
+ in_data = kmap(page);
+ a = 0;
+ while (a < PAGE_SIZE-READ_SIZE && b < MAX_SAMPLE_SIZE) {
+ memcpy(&workspace->sample[b], &in_data[a], READ_SIZE);
+ a += ITER_SHIFT;
+ b += READ_SIZE;
+ }
kunmap(page);
put_page(page);
}
+ workspace->sample_size = b;
+
+ memset(workspace->bucket, 0, sizeof(*workspace->bucket)*BUCKET_SIZE);
+
+ for (a = 0; a < workspace->sample_size; a++) {
+ byte = workspace->sample[a];
+ workspace->bucket[byte].count++;
+ }
+
return 1;
}
Copy sample data from input data range to sample buffer then calculate byte type count for that sample into bucket. Signed-off-by: Timofey Titovets <nefelim4ag@gmail.com> --- fs/btrfs/heuristic.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) -- 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