Browse Source

Btrfs: Off by one fixes in extent_map.c

Signed-off-by: Chris Mason <chris.mason@oracle.com>
Yan 17 years ago
parent
commit
65555a06b4
2 changed files with 6 additions and 5 deletions
  1. 5 5
      fs/btrfs/extent_map.c
  2. 1 0
      fs/btrfs/inode.c

+ 5 - 5
fs/btrfs/extent_map.c

@@ -2045,7 +2045,7 @@ struct extent_buffer *alloc_extent_buffer(struct extent_map_tree *tree,
 	struct extent_buffer *eb;
 	struct extent_buffer *eb;
 	struct page *p;
 	struct page *p;
 	struct address_space *mapping = tree->mapping;
 	struct address_space *mapping = tree->mapping;
-	int uptodate = 0;
+	int uptodate = 1;
 
 
 	eb = __alloc_extent_buffer(tree, start, len, mask);
 	eb = __alloc_extent_buffer(tree, start, len, mask);
 	if (!eb || IS_ERR(eb))
 	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))) ||
 		if ((i == 0 && (eb->start & (PAGE_CACHE_SIZE - 1))) ||
 		    ((i == num_pages - 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;
 			start = page->index << PAGE_CACHE_SHIFT;
 			end  = start + PAGE_CACHE_SIZE - 1;
 			end  = start + PAGE_CACHE_SIZE - 1;
 			if (test_range_bit(tree, start, end,
 			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);
 		page = extent_buffer_page(eb, i);
 		if ((i == 0 && (eb->start & (PAGE_CACHE_SIZE - 1))) ||
 		if ((i == 0 && (eb->start & (PAGE_CACHE_SIZE - 1))) ||
 		    ((i == num_pages - 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);
 			check_page_uptodate(tree, page);
 			continue;
 			continue;
 		}
 		}
@@ -2401,7 +2401,7 @@ int map_private_extent_buffer(struct extent_buffer *eb, unsigned long start,
 	struct page *p;
 	struct page *p;
 	size_t start_offset = eb->start & ((u64)PAGE_CACHE_SIZE - 1);
 	size_t start_offset = eb->start & ((u64)PAGE_CACHE_SIZE - 1);
 	unsigned long i = (start_offset + start) >> PAGE_CACHE_SHIFT;
 	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;
 		PAGE_CACHE_SHIFT;
 
 
 	if (i != end_i)
 	if (i != end_i)
@@ -2414,7 +2414,7 @@ int map_private_extent_buffer(struct extent_buffer *eb, unsigned long start,
 		offset = 0;
 		offset = 0;
 		*map_start = (i << PAGE_CACHE_SHIFT) - start_offset;
 		*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);
 printk("bad mapping eb start %Lu len %lu, wanted %lu %lu\n", eb->start, eb->len, start, min_len);
 		WARN_ON(1);
 		WARN_ON(1);
 	}
 	}

+ 1 - 0
fs/btrfs/inode.c

@@ -616,6 +616,7 @@ static int btrfs_truncate_in_trans(struct btrfs_trans_handle *trans,
 				break;
 				break;
 			}
 			}
 			btrfs_set_key_type(&key, found_type);
 			btrfs_set_key_type(&key, found_type);
+			btrfs_release_path(root, path);
 			continue;
 			continue;
 		}
 		}
 		if (found_key.offset >= inode->i_size)
 		if (found_key.offset >= inode->i_size)