aboutsummaryrefslogtreecommitdiff
path: root/fs/btrfs
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2007-10-15 16:22:25 -0400
committerChris Mason <chris.mason@oracle.com>2008-09-25 11:03:57 -0400
commitff79f8190b6e955ff7a71faf804a3017d526e657 (patch)
treed3f56ae2822eb312eba760dcf4df1a058de5a699 /fs/btrfs
parentcf786e79e3f96f4bc037c69e1a7afb5fb85c6111 (diff)
Btrfs: Add back file data checksumming
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/disk-io.c1
-rw-r--r--fs/btrfs/disk-io.h2
-rw-r--r--fs/btrfs/extent_map.c3
-rw-r--r--fs/btrfs/file-item.c17
-rw-r--r--fs/btrfs/file.c1
-rw-r--r--fs/btrfs/inode.c21
6 files changed, 26 insertions, 19 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 3878772fcff..5accced2858 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -594,6 +594,7 @@ struct btrfs_root *open_ctree(struct super_block *sb)
tree_root->nodesize = nodesize;
tree_root->leafsize = leafsize;
tree_root->sectorsize = sectorsize;
+ sb_set_blocksize(sb, sectorsize);
i_size_write(fs_info->btree_inode,
btrfs_super_total_bytes(disk_super));
diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h
index 190b07bc642..33d2ccfd74d 100644
--- a/fs/btrfs/disk-io.h
+++ b/fs/btrfs/disk-io.h
@@ -58,4 +58,6 @@ int btrfs_buffer_defrag_done(struct extent_buffer *buf);
int btrfs_clear_buffer_defrag(struct extent_buffer *buf);
int btrfs_clear_buffer_defrag_done(struct extent_buffer *buf);
int btrfs_read_buffer(struct extent_buffer *buf);
+u32 btrfs_csum_data(struct btrfs_root *root, char *data, u32 seed, size_t len);
+void btrfs_csum_final(u32 crc, char *result);
#endif
diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c
index 2a8bc4bd43a..e87e476dca9 100644
--- a/fs/btrfs/extent_map.c
+++ b/fs/btrfs/extent_map.c
@@ -2031,6 +2031,7 @@ struct extent_buffer *alloc_extent_buffer(struct extent_map_tree *tree,
i = 1;
index++;
page_cache_get(page0);
+ mark_page_accessed(page0);
set_page_extent_mapped(page0);
set_page_private(page0, EXTENT_PAGE_PRIVATE_FIRST_PAGE |
len << 2);
@@ -2049,6 +2050,7 @@ struct extent_buffer *alloc_extent_buffer(struct extent_map_tree *tree,
goto fail;
}
set_page_extent_mapped(p);
+ mark_page_accessed(p);
if (i == 0) {
eb->first_page = p;
set_page_private(p, EXTENT_PAGE_PRIVATE_FIRST_PAGE |
@@ -2099,6 +2101,7 @@ struct extent_buffer *find_extent_buffer(struct extent_map_tree *tree,
goto fail;
}
set_page_extent_mapped(p);
+ mark_page_accessed(p);
if (i == 0) {
eb->first_page = p;
diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c
index 9a65e97a4e2..10a4c740860 100644
--- a/fs/btrfs/file-item.c
+++ b/fs/btrfs/file-item.c
@@ -136,27 +136,27 @@ int btrfs_csum_file_block(struct btrfs_trans_handle *trans,
u64 objectid, u64 offset,
char *data, size_t len)
{
- return 0;
-#if 0
int ret;
struct btrfs_key file_key;
struct btrfs_key found_key;
struct btrfs_path *path;
struct btrfs_csum_item *item;
- struct extent_buffer *leaf;
+ struct extent_buffer *leaf = NULL;
u64 csum_offset;
+ u32 csum_result = ~(u32)0;
path = btrfs_alloc_path();
BUG_ON(!path);
file_key.objectid = objectid;
file_key.offset = offset;
- file_key.flags = 0;
btrfs_set_key_type(&file_key, BTRFS_CSUM_ITEM_KEY);
item = btrfs_lookup_csum(trans, root, path, objectid, offset, 1);
- if (!IS_ERR(item))
+ if (!IS_ERR(item)) {
+ leaf = path->nodes[0];
goto found;
+ }
ret = PTR_ERR(item);
if (ret == -EFBIG) {
u32 item_size;
@@ -226,14 +226,15 @@ csum:
item = (struct btrfs_csum_item *)((unsigned char *)item +
csum_offset * BTRFS_CRC32_SIZE);
found:
- /* FIXME!!!!!!!!!!!! */
- ret = btrfs_csum_data(root, data, len, &item->csum);
+ csum_result = btrfs_csum_data(root, data, csum_result, len);
+ btrfs_csum_final(csum_result, (char *)&csum_result);
+ write_extent_buffer(leaf, &csum_result, (unsigned long)item,
+ BTRFS_CRC32_SIZE);
btrfs_mark_buffer_dirty(path->nodes[0]);
fail:
btrfs_release_path(root, path);
btrfs_free_path(path);
return ret;
-#endif
}
int btrfs_csum_truncate(struct btrfs_trans_handle *trans,
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index fe28404ae7f..1af2b6534da 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -289,6 +289,7 @@ static int dirty_and_release_pages(struct btrfs_trans_handle *trans,
*/
inline_size = end_pos;
if (isize >= BTRFS_MAX_INLINE_DATA_SIZE(root) ||
+ inline_size > 16384 ||
inline_size >= BTRFS_MAX_INLINE_DATA_SIZE(root)) {
u64 last_end;
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 80f84b48a70..ac69f6926af 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -135,7 +135,7 @@ int btrfs_readpage_io_hook(struct page *page, u64 start, u64 end)
struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
struct btrfs_csum_item *item;
struct btrfs_path *path = NULL;
- u64 private;
+ u32 csum;
mutex_lock(&root->fs_info->fs_mutex);
path = btrfs_alloc_path();
@@ -145,11 +145,12 @@ int btrfs_readpage_io_hook(struct page *page, u64 start, u64 end)
/* a csum that isn't present is a preallocated region. */
if (ret == -ENOENT || ret == -EFBIG)
ret = 0;
- private = 0;
+ csum = 0;
goto out;
}
- memcpy((char *)&private, &item->csum, BTRFS_CRC32_SIZE);
- set_state_private(em_tree, start, private);
+ read_extent_buffer(path->nodes[0], &csum, (unsigned long)item,
+ BTRFS_CRC32_SIZE);
+ set_state_private(em_tree, start, csum);
out:
if (path)
btrfs_free_path(path);
@@ -165,21 +166,19 @@ int btrfs_readpage_end_io_hook(struct page *page, u64 start, u64 end)
char *kaddr;
u64 private;
int ret;
+ struct btrfs_root *root = BTRFS_I(inode)->root;
+ u32 csum = ~(u32)0;
ret = get_state_private(em_tree, start, &private);
kaddr = kmap_atomic(page, KM_IRQ0);
if (ret) {
goto zeroit;
}
- /*
- struct btrfs_root *root = BTRFS_I(inode)->root;
- char csum[BTRFS_CRC32_SIZE];
- ret = btrfs_csum_data(root, kaddr + offset, end - start + 1, csum);
- BUG_ON(ret);
- if (memcmp(csum, &private, BTRFS_CRC32_SIZE)) {
+ csum = btrfs_csum_data(root, kaddr + offset, csum, end - start + 1);
+ btrfs_csum_final(csum, (char *)&csum);
+ if (csum != private) {
goto zeroit;
}
- */
kunmap_atomic(kaddr, KM_IRQ0);
return 0;