Btrfs: don't use crc items bigger than 4KB
authorChris Mason <chris.mason@oracle.com>
Wed, 1 Feb 2012 01:19:02 +0000 (20:19 -0500)
committerChris Mason <chris.mason@oracle.com>
Thu, 29 Mar 2012 00:34:10 +0000 (20:34 -0400)
With the big metadata blocks, we can have crc items
that are much bigger than a page.  There are a few
places that we try to kmalloc memory to hold the
items during a split.

Items bigger than 4KB don't really have a huge benefit
in efficiency, but they do trigger larger order allocations.
This commits changes the csums to make sure they stay under
4KB.  This is not a format change, just a #define to limit
huge items.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/file-item.c

index a14dbca5974ecd77c56c2b5f133d5dc8df72e7a6..cab0ffb5ef3baa6d84228037263e5eb3c57caae3 100644 (file)
 #include "transaction.h"
 #include "print-tree.h"
 
-#define MAX_CSUM_ITEMS(r, size) ((((BTRFS_LEAF_DATA_SIZE(r) - \
+#define __MAX_CSUM_ITEMS(r, size) ((((BTRFS_LEAF_DATA_SIZE(r) - \
                                   sizeof(struct btrfs_item) * 2) / \
                                  size) - 1))
 
+#define MAX_CSUM_ITEMS(r, size) (min(__MAX_CSUM_ITEMS(r, size), PAGE_CACHE_SIZE))
+
 #define MAX_ORDERED_SUM_BYTES(r) ((PAGE_SIZE - \
                                   sizeof(struct btrfs_ordered_sum)) / \
                                   sizeof(struct btrfs_sector_sum) * \