]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - fs/btrfs/file-item.c
Btrfs: Fix verify_parent_transid
[mv-sheeva.git] / fs / btrfs / file-item.c
index d9c69e16d368a845288c4c1c4575b6e4dd40eb31..afe42d00b5a61e341915130d25d87fbbf5d6639d 100644 (file)
@@ -152,7 +152,7 @@ int btrfs_csum_one_bio(struct btrfs_root *root, struct inode *inode,
        if (!sums)
                return -ENOMEM;
 
-       sector_sum = &sums->sums;
+       sector_sum = sums->sums;
        sums->file_offset = page_offset(bvec->bv_page) + bvec->bv_offset;
        sums->len = bio->bi_size;
        INIT_LIST_HEAD(&sums->list);
@@ -161,7 +161,8 @@ int btrfs_csum_one_bio(struct btrfs_root *root, struct inode *inode,
 
        while(bio_index < bio->bi_vcnt) {
                offset = page_offset(bvec->bv_page) + bvec->bv_offset;
-               if (offset >= ordered->file_offset + ordered->len) {
+               if (offset >= ordered->file_offset + ordered->len ||
+                   offset < ordered->file_offset) {
                        unsigned long bytes_left;
                        sums->len = this_sum_bytes;
                        this_sum_bytes = 0;
@@ -173,7 +174,7 @@ int btrfs_csum_one_bio(struct btrfs_root *root, struct inode *inode,
                        sums = kzalloc(btrfs_ordered_sum_size(root, bytes_left),
                                       GFP_NOFS);
                        BUG_ON(!sums);
-                       sector_sum = &sums->sums;
+                       sector_sum = sums->sums;
                        sums->len = bytes_left;
                        sums->file_offset = offset;
                        ordered = btrfs_lookup_ordered_extent(inode,
@@ -192,12 +193,14 @@ int btrfs_csum_one_bio(struct btrfs_root *root, struct inode *inode,
                                 (char *)&sector_sum->sum);
                sector_sum->offset = page_offset(bvec->bv_page) +
                        bvec->bv_offset;
+
                sector_sum++;
                bio_index++;
                total_bytes += bvec->bv_len;
                this_sum_bytes += bvec->bv_len;
                bvec++;
        }
+       this_sum_bytes = 0;
        btrfs_add_ordered_sum(inode, ordered, sums);
        btrfs_put_ordered_extent(ordered);
        return 0;
@@ -230,7 +233,7 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans,
 
        path = btrfs_alloc_path();
        BUG_ON(!path);
-       sector_sum = &sums->sums;
+       sector_sum = sums->sums;
 again:
        next_offset = (u64)-1;
        found_next = 0;