btrfs_get_extent should treat inline extents as though they hold a whole block
authorChris Mason <chris.mason@oracle.com>
Thu, 20 Sep 2007 18:14:42 +0000 (14:14 -0400)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:03:56 +0000 (11:03 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/inode.c

index 0df325f89d62bf9cef3861a440da57d86ec46667..b03d40a907ca766d293f5034f202ad936fd1c223 100644 (file)
@@ -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);