]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - fs/btrfs/inode.c
Btrfs: Add mount -o nodatasum to turn of file data checksumming
[mv-sheeva.git] / fs / btrfs / inode.c
index 41b0c7de7a5916570183e8ed100177c58030e426..11885cb114e2186fe58de1d761e685227783202c 100644 (file)
@@ -116,10 +116,13 @@ int btrfs_writepage_io_hook(struct page *page, u64 start, u64 end)
        struct btrfs_root *root = BTRFS_I(inode)->root;
        struct btrfs_trans_handle *trans;
        char *kaddr;
-       int ret;
+       int ret = 0;
        u64 page_start = (u64)page->index << PAGE_CACHE_SHIFT;
        size_t offset = start - page_start;
 
+       if (btrfs_test_opt(root, NODATASUM))
+               return 0;
+
        mutex_lock(&root->fs_info->fs_mutex);
        trans = btrfs_start_transaction(root, 1);
        btrfs_set_trans_block_group(trans, inode);
@@ -143,6 +146,9 @@ int btrfs_readpage_io_hook(struct page *page, u64 start, u64 end)
        struct btrfs_path *path = NULL;
        u32 csum;
 
+       if (btrfs_test_opt(root, NODATASUM))
+               return 0;
+
        mutex_lock(&root->fs_info->fs_mutex);
        path = btrfs_alloc_path();
        item = btrfs_lookup_csum(NULL, root, path, inode->i_ino, start, 0);
@@ -176,6 +182,9 @@ int btrfs_readpage_end_io_hook(struct page *page, u64 start, u64 end)
        u32 csum = ~(u32)0;
        unsigned long flags;
 
+       if (btrfs_test_opt(root, NODATASUM))
+               return 0;
+
        ret = get_state_private(em_tree, start, &private);
        local_irq_save(flags);
        kaddr = kmap_atomic(page, KM_IRQ0);
@@ -1893,8 +1902,19 @@ static void btrfs_truncate(struct inode *inode)
 int btrfs_commit_write(struct file *file, struct page *page,
                       unsigned from, unsigned to)
 {
-       return extent_commit_write(&BTRFS_I(page->mapping->host)->extent_tree,
-                                  page->mapping->host, page, from, to);
+       loff_t pos = ((loff_t)page->index << PAGE_CACHE_SHIFT) + to;
+       struct inode *inode = page->mapping->host;
+
+       btrfs_cow_one_page(inode, page, PAGE_CACHE_SIZE);
+
+       set_page_extent_mapped(page);
+       set_page_dirty(page);
+
+       if (pos > inode->i_size) {
+               i_size_write(inode, pos);
+               mark_inode_dirty(inode);
+       }
+       return 0;
 }
 
 static int create_subvol(struct btrfs_root *root, char *name, int namelen)