Btrfs: Off by one fixes in extent_map.c
authorYan <yanzheng@21cn.com>
Thu, 25 Oct 2007 19:42:57 +0000 (15:42 -0400)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:03:57 +0000 (11:03 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/extent_map.c
fs/btrfs/inode.c

index a61379230dd276e53a0cb00895b81150220837f3..c44989a1e5201224b3afa1329789a98616ea7ae6 100644 (file)
@@ -2045,7 +2045,7 @@ struct extent_buffer *alloc_extent_buffer(struct extent_map_tree *tree,
        struct extent_buffer *eb;
        struct page *p;
        struct address_space *mapping = tree->mapping;
-       int uptodate = 0;
+       int uptodate = 1;
 
        eb = __alloc_extent_buffer(tree, start, len, mask);
        if (!eb || IS_ERR(eb))
@@ -2197,7 +2197,7 @@ int clear_extent_buffer_dirty(struct extent_map_tree *tree,
                 */
                if ((i == 0 && (eb->start & (PAGE_CACHE_SIZE - 1))) ||
                    ((i == num_pages - 1) &&
-                    ((eb->start + eb->len - 1) & (PAGE_CACHE_SIZE - 1)))) {
+                    ((eb->start + eb->len) & (PAGE_CACHE_SIZE - 1)))) {
                        start = page->index << PAGE_CACHE_SHIFT;
                        end  = start + PAGE_CACHE_SIZE - 1;
                        if (test_range_bit(tree, start, end,
@@ -2265,7 +2265,7 @@ int set_extent_buffer_uptodate(struct extent_map_tree *tree,
                page = extent_buffer_page(eb, i);
                if ((i == 0 && (eb->start & (PAGE_CACHE_SIZE - 1))) ||
                    ((i == num_pages - 1) &&
-                    ((eb->start + eb->len - 1) & (PAGE_CACHE_SIZE - 1)))) {
+                    ((eb->start + eb->len) & (PAGE_CACHE_SIZE - 1)))) {
                        check_page_uptodate(tree, page);
                        continue;
                }
@@ -2401,7 +2401,7 @@ int map_private_extent_buffer(struct extent_buffer *eb, unsigned long start,
        struct page *p;
        size_t start_offset = eb->start & ((u64)PAGE_CACHE_SIZE - 1);
        unsigned long i = (start_offset + start) >> PAGE_CACHE_SHIFT;
-       unsigned long end_i = (start_offset + start + min_len) >>
+       unsigned long end_i = (start_offset + start + min_len - 1) >>
                PAGE_CACHE_SHIFT;
 
        if (i != end_i)
@@ -2414,7 +2414,7 @@ int map_private_extent_buffer(struct extent_buffer *eb, unsigned long start,
                offset = 0;
                *map_start = (i << PAGE_CACHE_SHIFT) - start_offset;
        }
-       if (start + min_len >= eb->len) {
+       if (start + min_len > eb->len) {
 printk("bad mapping eb start %Lu len %lu, wanted %lu %lu\n", eb->start, eb->len, start, min_len);
                WARN_ON(1);
        }
index 7efc0470abf1a153d0552d0e1461b7712267f2f0..c07433072322c3b7fe91a89f1469d6d6c4900454 100644 (file)
@@ -616,6 +616,7 @@ static int btrfs_truncate_in_trans(struct btrfs_trans_handle *trans,
                                break;
                        }
                        btrfs_set_key_type(&key, found_type);
+                       btrfs_release_path(root, path);
                        continue;
                }
                if (found_key.offset >= inode->i_size)