diff options
Diffstat (limited to 'fs/btrfs/extent_io.c')
-rw-r--r-- | fs/btrfs/extent_io.c | 67 |
1 files changed, 14 insertions, 53 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index ebe6b29e6069..eb2bee8b7fbf 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -2884,25 +2884,19 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | |||
2884 | disko = 0; | 2884 | disko = 0; |
2885 | flags = 0; | 2885 | flags = 0; |
2886 | 2886 | ||
2887 | switch (em->block_start) { | 2887 | if (em->block_start == EXTENT_MAP_LAST_BYTE) { |
2888 | case EXTENT_MAP_LAST_BYTE: | ||
2889 | end = 1; | 2888 | end = 1; |
2890 | flags |= FIEMAP_EXTENT_LAST; | 2889 | flags |= FIEMAP_EXTENT_LAST; |
2891 | break; | 2890 | } else if (em->block_start == EXTENT_MAP_HOLE) { |
2892 | case EXTENT_MAP_HOLE: | ||
2893 | flags |= FIEMAP_EXTENT_UNWRITTEN; | 2891 | flags |= FIEMAP_EXTENT_UNWRITTEN; |
2894 | break; | 2892 | } else if (em->block_start == EXTENT_MAP_INLINE) { |
2895 | case EXTENT_MAP_INLINE: | ||
2896 | flags |= (FIEMAP_EXTENT_DATA_INLINE | | 2893 | flags |= (FIEMAP_EXTENT_DATA_INLINE | |
2897 | FIEMAP_EXTENT_NOT_ALIGNED); | 2894 | FIEMAP_EXTENT_NOT_ALIGNED); |
2898 | break; | 2895 | } else if (em->block_start == EXTENT_MAP_DELALLOC) { |
2899 | case EXTENT_MAP_DELALLOC: | ||
2900 | flags |= (FIEMAP_EXTENT_DELALLOC | | 2896 | flags |= (FIEMAP_EXTENT_DELALLOC | |
2901 | FIEMAP_EXTENT_UNKNOWN); | 2897 | FIEMAP_EXTENT_UNKNOWN); |
2902 | break; | 2898 | } else { |
2903 | default: | ||
2904 | disko = em->block_start; | 2899 | disko = em->block_start; |
2905 | break; | ||
2906 | } | 2900 | } |
2907 | if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags)) | 2901 | if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags)) |
2908 | flags |= FIEMAP_EXTENT_ENCODED; | 2902 | flags |= FIEMAP_EXTENT_ENCODED; |
@@ -3124,20 +3118,15 @@ void free_extent_buffer(struct extent_buffer *eb) | |||
3124 | int clear_extent_buffer_dirty(struct extent_io_tree *tree, | 3118 | int clear_extent_buffer_dirty(struct extent_io_tree *tree, |
3125 | struct extent_buffer *eb) | 3119 | struct extent_buffer *eb) |
3126 | { | 3120 | { |
3127 | int set; | ||
3128 | unsigned long i; | 3121 | unsigned long i; |
3129 | unsigned long num_pages; | 3122 | unsigned long num_pages; |
3130 | struct page *page; | 3123 | struct page *page; |
3131 | 3124 | ||
3132 | u64 start = eb->start; | ||
3133 | u64 end = start + eb->len - 1; | ||
3134 | |||
3135 | set = clear_extent_dirty(tree, start, end, GFP_NOFS); | ||
3136 | num_pages = num_extent_pages(eb->start, eb->len); | 3125 | num_pages = num_extent_pages(eb->start, eb->len); |
3137 | 3126 | ||
3138 | for (i = 0; i < num_pages; i++) { | 3127 | for (i = 0; i < num_pages; i++) { |
3139 | page = extent_buffer_page(eb, i); | 3128 | page = extent_buffer_page(eb, i); |
3140 | if (!set && !PageDirty(page)) | 3129 | if (!PageDirty(page)) |
3141 | continue; | 3130 | continue; |
3142 | 3131 | ||
3143 | lock_page(page); | 3132 | lock_page(page); |
@@ -3146,22 +3135,6 @@ int clear_extent_buffer_dirty(struct extent_io_tree *tree, | |||
3146 | else | 3135 | else |
3147 | set_page_private(page, EXTENT_PAGE_PRIVATE); | 3136 | set_page_private(page, EXTENT_PAGE_PRIVATE); |
3148 | 3137 | ||
3149 | /* | ||
3150 | * if we're on the last page or the first page and the | ||
3151 | * block isn't aligned on a page boundary, do extra checks | ||
3152 | * to make sure we don't clean page that is partially dirty | ||
3153 | */ | ||
3154 | if ((i == 0 && (eb->start & (PAGE_CACHE_SIZE - 1))) || | ||
3155 | ((i == num_pages - 1) && | ||
3156 | ((eb->start + eb->len) & (PAGE_CACHE_SIZE - 1)))) { | ||
3157 | start = (u64)page->index << PAGE_CACHE_SHIFT; | ||
3158 | end = start + PAGE_CACHE_SIZE - 1; | ||
3159 | if (test_range_bit(tree, start, end, | ||
3160 | EXTENT_DIRTY, 0)) { | ||
3161 | unlock_page(page); | ||
3162 | continue; | ||
3163 | } | ||
3164 | } | ||
3165 | clear_page_dirty_for_io(page); | 3138 | clear_page_dirty_for_io(page); |
3166 | spin_lock_irq(&page->mapping->tree_lock); | 3139 | spin_lock_irq(&page->mapping->tree_lock); |
3167 | if (!PageDirty(page)) { | 3140 | if (!PageDirty(page)) { |
@@ -3187,29 +3160,13 @@ int set_extent_buffer_dirty(struct extent_io_tree *tree, | |||
3187 | { | 3160 | { |
3188 | unsigned long i; | 3161 | unsigned long i; |
3189 | unsigned long num_pages; | 3162 | unsigned long num_pages; |
3163 | int was_dirty = 0; | ||
3190 | 3164 | ||
3165 | was_dirty = test_and_set_bit(EXTENT_BUFFER_DIRTY, &eb->bflags); | ||
3191 | num_pages = num_extent_pages(eb->start, eb->len); | 3166 | num_pages = num_extent_pages(eb->start, eb->len); |
3192 | for (i = 0; i < num_pages; i++) { | 3167 | for (i = 0; i < num_pages; i++) |
3193 | struct page *page = extent_buffer_page(eb, i); | ||
3194 | /* writepage may need to do something special for the | ||
3195 | * first page, we have to make sure page->private is | ||
3196 | * properly set. releasepage may drop page->private | ||
3197 | * on us if the page isn't already dirty. | ||
3198 | */ | ||
3199 | lock_page(page); | ||
3200 | if (i == 0) { | ||
3201 | set_page_extent_head(page, eb->len); | ||
3202 | } else if (PagePrivate(page) && | ||
3203 | page->private != EXTENT_PAGE_PRIVATE) { | ||
3204 | set_page_extent_mapped(page); | ||
3205 | } | ||
3206 | __set_page_dirty_nobuffers(extent_buffer_page(eb, i)); | 3168 | __set_page_dirty_nobuffers(extent_buffer_page(eb, i)); |
3207 | set_extent_dirty(tree, page_offset(page), | 3169 | return was_dirty; |
3208 | page_offset(page) + PAGE_CACHE_SIZE - 1, | ||
3209 | GFP_NOFS); | ||
3210 | unlock_page(page); | ||
3211 | } | ||
3212 | return 0; | ||
3213 | } | 3170 | } |
3214 | 3171 | ||
3215 | int clear_extent_buffer_uptodate(struct extent_io_tree *tree, | 3172 | int clear_extent_buffer_uptodate(struct extent_io_tree *tree, |
@@ -3789,6 +3746,10 @@ int try_release_extent_buffer(struct extent_io_tree *tree, struct page *page) | |||
3789 | ret = 0; | 3746 | ret = 0; |
3790 | goto out; | 3747 | goto out; |
3791 | } | 3748 | } |
3749 | if (test_bit(EXTENT_BUFFER_DIRTY, &eb->bflags)) { | ||
3750 | ret = 0; | ||
3751 | goto out; | ||
3752 | } | ||
3792 | /* at this point we can safely release the extent buffer */ | 3753 | /* at this point we can safely release the extent buffer */ |
3793 | num_pages = num_extent_pages(eb->start, eb->len); | 3754 | num_pages = num_extent_pages(eb->start, eb->len); |
3794 | for (i = 0; i < num_pages; i++) | 3755 | for (i = 0; i < num_pages; i++) |