浏览代码

btrfs_get_extent should treat inline extents as though they hold a whole block

Signed-off-by: Chris Mason <chris.mason@oracle.com>
Chris Mason 17 年之前
父节点
当前提交
50b78c24d5
共有 1 个文件被更改,包括 7 次插入5 次删除
  1. 7 5
      fs/btrfs/inode.c

+ 7 - 5
fs/btrfs/inode.c

@@ -1505,13 +1505,13 @@ again:
 
 		size = btrfs_file_extent_inline_len(leaf->items +
 						    path->slots[0]);
-		extent_end = extent_start + size;
+		extent_end = extent_start | ((u64)root->blocksize - 1);
 		if (start < extent_start || start >= extent_end) {
 			em->start = start;
 			if (start < extent_start) {
 				if (end < extent_start)
 					goto not_found;
-				em->end = extent_end - 1;
+				em->end = extent_end;
 			} else {
 				em->end = end;
 			}
@@ -1520,17 +1520,19 @@ again:
 		em->block_start = EXTENT_MAP_INLINE;
 		em->block_end = EXTENT_MAP_INLINE;
 		em->start = extent_start;
-		em->end = extent_end - 1;
+		em->end = extent_end;
 		if (!page) {
 			goto insert;
 		}
 		ptr = btrfs_file_extent_inline_start(item);
 		map = kmap(page);
 		memcpy(map + page_offset, ptr, size);
-		flush_dcache_page(result->b_page);
+		memset(map + page_offset + size, 0,
+		       root->blocksize - (page_offset + size));
+		flush_dcache_page(page);
 		kunmap(page);
 		set_extent_uptodate(em_tree, extent_start,
-				    extent_end - 1, GFP_NOFS);
+				    extent_end, GFP_NOFS);
 		goto insert;
 	} else {
 		printk("unkknown found_type %d\n", found_type);