extent_io.c (2d8ad8719591fa803b0d589ed057fa46f49b7155) | extent_io.c (721a9602e6607417c6bc15b18e97a2f35266c690) |
---|---|
1#include <linux/bitops.h> 2#include <linux/slab.h> 3#include <linux/bio.h> 4#include <linux/mm.h> 5#include <linux/pagemap.h> 6#include <linux/page-flags.h> 7#include <linux/module.h> 8#include <linux/spinlock.h> --- 1851 unchanged lines hidden (view full) --- 1860 1861 start = ((u64)page->index << PAGE_CACHE_SHIFT) + bvec->bv_offset; 1862 1863 bio->bi_private = NULL; 1864 1865 bio_get(bio); 1866 1867 if (tree->ops && tree->ops->submit_bio_hook) | 1#include <linux/bitops.h> 2#include <linux/slab.h> 3#include <linux/bio.h> 4#include <linux/mm.h> 5#include <linux/pagemap.h> 6#include <linux/page-flags.h> 7#include <linux/module.h> 8#include <linux/spinlock.h> --- 1851 unchanged lines hidden (view full) --- 1860 1861 start = ((u64)page->index << PAGE_CACHE_SHIFT) + bvec->bv_offset; 1862 1863 bio->bi_private = NULL; 1864 1865 bio_get(bio); 1866 1867 if (tree->ops && tree->ops->submit_bio_hook) |
1868 tree->ops->submit_bio_hook(page->mapping->host, rw, bio, | 1868 ret = tree->ops->submit_bio_hook(page->mapping->host, rw, bio, |
1869 mirror_num, bio_flags, start); 1870 else 1871 submit_bio(rw, bio); 1872 if (bio_flagged(bio, BIO_EOPNOTSUPP)) 1873 ret = -EOPNOTSUPP; 1874 bio_put(bio); 1875 return ret; 1876} --- 38 unchanged lines hidden (view full) --- 1915 } 1916 } 1917 if (this_compressed) 1918 nr = BIO_MAX_PAGES; 1919 else 1920 nr = bio_get_nr_vecs(bdev); 1921 1922 bio = btrfs_bio_alloc(bdev, sector, nr, GFP_NOFS | __GFP_HIGH); | 1869 mirror_num, bio_flags, start); 1870 else 1871 submit_bio(rw, bio); 1872 if (bio_flagged(bio, BIO_EOPNOTSUPP)) 1873 ret = -EOPNOTSUPP; 1874 bio_put(bio); 1875 return ret; 1876} --- 38 unchanged lines hidden (view full) --- 1915 } 1916 } 1917 if (this_compressed) 1918 nr = BIO_MAX_PAGES; 1919 else 1920 nr = bio_get_nr_vecs(bdev); 1921 1922 bio = btrfs_bio_alloc(bdev, sector, nr, GFP_NOFS | __GFP_HIGH); |
1923 if (!bio) 1924 return -ENOMEM; |
|
1923 1924 bio_add_page(bio, page, page_size, offset); 1925 bio->bi_end_io = end_io_func; 1926 bio->bi_private = tree; 1927 1928 if (bio_ret) 1929 *bio_ret = bio; 1930 else --- 8 unchanged lines hidden (view full) --- 1939 SetPagePrivate(page); 1940 page_cache_get(page); 1941 set_page_private(page, EXTENT_PAGE_PRIVATE); 1942 } 1943} 1944 1945static void set_page_extent_head(struct page *page, unsigned long len) 1946{ | 1925 1926 bio_add_page(bio, page, page_size, offset); 1927 bio->bi_end_io = end_io_func; 1928 bio->bi_private = tree; 1929 1930 if (bio_ret) 1931 *bio_ret = bio; 1932 else --- 8 unchanged lines hidden (view full) --- 1941 SetPagePrivate(page); 1942 page_cache_get(page); 1943 set_page_private(page, EXTENT_PAGE_PRIVATE); 1944 } 1945} 1946 1947static void set_page_extent_head(struct page *page, unsigned long len) 1948{ |
1949 WARN_ON(!PagePrivate(page)); |
|
1947 set_page_private(page, EXTENT_PAGE_PRIVATE_FIRST_PAGE | len << 2); 1948} 1949 1950/* 1951 * basic readpage implementation. Locked extent state structs are inserted 1952 * into the tree that are removed when the IO is done (by the end_io 1953 * handlers) 1954 */ --- 166 unchanged lines hidden (view full) --- 2121{ 2122 struct bio *bio = NULL; 2123 unsigned long bio_flags = 0; 2124 int ret; 2125 2126 ret = __extent_read_full_page(tree, page, get_extent, &bio, 0, 2127 &bio_flags); 2128 if (bio) | 1950 set_page_private(page, EXTENT_PAGE_PRIVATE_FIRST_PAGE | len << 2); 1951} 1952 1953/* 1954 * basic readpage implementation. Locked extent state structs are inserted 1955 * into the tree that are removed when the IO is done (by the end_io 1956 * handlers) 1957 */ --- 166 unchanged lines hidden (view full) --- 2124{ 2125 struct bio *bio = NULL; 2126 unsigned long bio_flags = 0; 2127 int ret; 2128 2129 ret = __extent_read_full_page(tree, page, get_extent, &bio, 0, 2130 &bio_flags); 2131 if (bio) |
2129 submit_one_bio(READ, bio, 0, bio_flags); | 2132 ret = submit_one_bio(READ, bio, 0, bio_flags); |
2130 return ret; 2131} 2132 2133static noinline void update_nr_written(struct page *page, 2134 struct writeback_control *wbc, 2135 unsigned long nr_written) 2136{ 2137 wbc->nr_to_write -= nr_written; --- 36 unchanged lines hidden (view full) --- 2174 u64 nr_delalloc; 2175 u64 delalloc_end; 2176 int page_started; 2177 int compressed; 2178 int write_flags; 2179 unsigned long nr_written = 0; 2180 2181 if (wbc->sync_mode == WB_SYNC_ALL) | 2133 return ret; 2134} 2135 2136static noinline void update_nr_written(struct page *page, 2137 struct writeback_control *wbc, 2138 unsigned long nr_written) 2139{ 2140 wbc->nr_to_write -= nr_written; --- 36 unchanged lines hidden (view full) --- 2177 u64 nr_delalloc; 2178 u64 delalloc_end; 2179 int page_started; 2180 int compressed; 2181 int write_flags; 2182 unsigned long nr_written = 0; 2183 2184 if (wbc->sync_mode == WB_SYNC_ALL) |
2182 write_flags = WRITE_SYNC_PLUG; | 2185 write_flags = WRITE_SYNC; |
2183 else 2184 write_flags = WRITE; 2185 2186 WARN_ON(!PageLocked(page)); 2187 pg_offset = i_size & (PAGE_CACHE_SIZE - 1); 2188 if (page->index > end_index || 2189 (page->index == end_index && !pg_offset)) { 2190 page->mapping->a_ops->invalidatepage(page, 0); --- 623 unchanged lines hidden (view full) --- 2814 ret = 0; 2815 else { 2816 if ((mask & GFP_NOFS) == GFP_NOFS) 2817 mask = GFP_NOFS; 2818 /* 2819 * at this point we can safely clear everything except the 2820 * locked bit and the nodatasum bit 2821 */ | 2186 else 2187 write_flags = WRITE; 2188 2189 WARN_ON(!PageLocked(page)); 2190 pg_offset = i_size & (PAGE_CACHE_SIZE - 1); 2191 if (page->index > end_index || 2192 (page->index == end_index && !pg_offset)) { 2193 page->mapping->a_ops->invalidatepage(page, 0); --- 623 unchanged lines hidden (view full) --- 2817 ret = 0; 2818 else { 2819 if ((mask & GFP_NOFS) == GFP_NOFS) 2820 mask = GFP_NOFS; 2821 /* 2822 * at this point we can safely clear everything except the 2823 * locked bit and the nodatasum bit 2824 */ |
2822 clear_extent_bit(tree, start, end, | 2825 ret = clear_extent_bit(tree, start, end, |
2823 ~(EXTENT_LOCKED | EXTENT_NODATASUM), 2824 0, 0, NULL, mask); | 2826 ~(EXTENT_LOCKED | EXTENT_NODATASUM), 2827 0, 0, NULL, mask); |
2828 2829 /* if clear_extent_bit failed for enomem reasons, 2830 * we can't allow the release to continue. 2831 */ 2832 if (ret < 0) 2833 ret = 0; 2834 else 2835 ret = 1; |
|
2825 } 2826 return ret; 2827} 2828 2829/* 2830 * a helper for releasepage. As long as there are no locked extents 2831 * in the range corresponding to the page, both state records and extent 2832 * map records are removed --- 354 unchanged lines hidden (view full) --- 3187 if (i == 0) { 3188 eb->first_page = p; 3189 set_page_extent_head(p, len); 3190 } else { 3191 set_page_private(p, EXTENT_PAGE_PRIVATE); 3192 } 3193 if (!PageUptodate(p)) 3194 uptodate = 0; | 2836 } 2837 return ret; 2838} 2839 2840/* 2841 * a helper for releasepage. As long as there are no locked extents 2842 * in the range corresponding to the page, both state records and extent 2843 * map records are removed --- 354 unchanged lines hidden (view full) --- 3198 if (i == 0) { 3199 eb->first_page = p; 3200 set_page_extent_head(p, len); 3201 } else { 3202 set_page_private(p, EXTENT_PAGE_PRIVATE); 3203 } 3204 if (!PageUptodate(p)) 3205 uptodate = 0; |
3195 unlock_page(p); | 3206 3207 /* 3208 * see below about how we avoid a nasty race with release page 3209 * and why we unlock later 3210 */ 3211 if (i != 0) 3212 unlock_page(p); |
3196 } 3197 if (uptodate) 3198 set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags); 3199 3200 ret = radix_tree_preload(GFP_NOFS & ~__GFP_HIGHMEM); 3201 if (ret) 3202 goto free_eb; 3203 --- 7 unchanged lines hidden (view full) --- 3211 spin_unlock(&tree->buffer_lock); 3212 radix_tree_preload_end(); 3213 goto free_eb; 3214 } 3215 /* add one reference for the tree */ 3216 atomic_inc(&eb->refs); 3217 spin_unlock(&tree->buffer_lock); 3218 radix_tree_preload_end(); | 3213 } 3214 if (uptodate) 3215 set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags); 3216 3217 ret = radix_tree_preload(GFP_NOFS & ~__GFP_HIGHMEM); 3218 if (ret) 3219 goto free_eb; 3220 --- 7 unchanged lines hidden (view full) --- 3228 spin_unlock(&tree->buffer_lock); 3229 radix_tree_preload_end(); 3230 goto free_eb; 3231 } 3232 /* add one reference for the tree */ 3233 atomic_inc(&eb->refs); 3234 spin_unlock(&tree->buffer_lock); 3235 radix_tree_preload_end(); |
3236 3237 /* 3238 * there is a race where release page may have 3239 * tried to find this extent buffer in the radix 3240 * but failed. It will tell the VM it is safe to 3241 * reclaim the, and it will clear the page private bit. 3242 * We must make sure to set the page private bit properly 3243 * after the extent buffer is in the radix tree so 3244 * it doesn't get lost 3245 */ 3246 set_page_extent_mapped(eb->first_page); 3247 set_page_extent_head(eb->first_page, eb->len); 3248 if (!page0) 3249 unlock_page(eb->first_page); |
|
3219 return eb; 3220 3221free_eb: | 3250 return eb; 3251 3252free_eb: |
3253 if (eb->first_page && !page0) 3254 unlock_page(eb->first_page); 3255 |
|
3222 if (!atomic_dec_and_test(&eb->refs)) 3223 return exists; 3224 btrfs_release_extent_buffer(eb); 3225 return exists; 3226} 3227 3228struct extent_buffer *find_extent_buffer(struct extent_io_tree *tree, 3229 u64 start, unsigned long len, --- 34 unchanged lines hidden (view full) --- 3264 num_pages = num_extent_pages(eb->start, eb->len); 3265 3266 for (i = 0; i < num_pages; i++) { 3267 page = extent_buffer_page(eb, i); 3268 if (!PageDirty(page)) 3269 continue; 3270 3271 lock_page(page); | 3256 if (!atomic_dec_and_test(&eb->refs)) 3257 return exists; 3258 btrfs_release_extent_buffer(eb); 3259 return exists; 3260} 3261 3262struct extent_buffer *find_extent_buffer(struct extent_io_tree *tree, 3263 u64 start, unsigned long len, --- 34 unchanged lines hidden (view full) --- 3298 num_pages = num_extent_pages(eb->start, eb->len); 3299 3300 for (i = 0; i < num_pages; i++) { 3301 page = extent_buffer_page(eb, i); 3302 if (!PageDirty(page)) 3303 continue; 3304 3305 lock_page(page); |
3306 WARN_ON(!PagePrivate(page)); 3307 3308 set_page_extent_mapped(page); |
|
3272 if (i == 0) 3273 set_page_extent_head(page, eb->len); | 3309 if (i == 0) 3310 set_page_extent_head(page, eb->len); |
3274 else 3275 set_page_private(page, EXTENT_PAGE_PRIVATE); | |
3276 3277 clear_page_dirty_for_io(page); 3278 spin_lock_irq(&page->mapping->tree_lock); 3279 if (!PageDirty(page)) { 3280 radix_tree_tag_clear(&page->mapping->page_tree, 3281 page_index(page), 3282 PAGECACHE_TAG_DIRTY); 3283 } --- 173 unchanged lines hidden (view full) --- 3457 if (all_uptodate) { 3458 if (start_i == 0) 3459 set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags); 3460 goto unlock_exit; 3461 } 3462 3463 for (i = start_i; i < num_pages; i++) { 3464 page = extent_buffer_page(eb, i); | 3311 3312 clear_page_dirty_for_io(page); 3313 spin_lock_irq(&page->mapping->tree_lock); 3314 if (!PageDirty(page)) { 3315 radix_tree_tag_clear(&page->mapping->page_tree, 3316 page_index(page), 3317 PAGECACHE_TAG_DIRTY); 3318 } --- 173 unchanged lines hidden (view full) --- 3492 if (all_uptodate) { 3493 if (start_i == 0) 3494 set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags); 3495 goto unlock_exit; 3496 } 3497 3498 for (i = start_i; i < num_pages; i++) { 3499 page = extent_buffer_page(eb, i); |
3500 3501 WARN_ON(!PagePrivate(page)); 3502 3503 set_page_extent_mapped(page); 3504 if (i == 0) 3505 set_page_extent_head(page, eb->len); 3506 |
|
3465 if (inc_all_pages) 3466 page_cache_get(page); 3467 if (!PageUptodate(page)) { 3468 if (start_i == 0) 3469 inc_all_pages = 1; 3470 ClearPageError(page); 3471 err = __extent_read_full_page(tree, page, 3472 get_extent, &bio, --- 444 unchanged lines hidden --- | 3507 if (inc_all_pages) 3508 page_cache_get(page); 3509 if (!PageUptodate(page)) { 3510 if (start_i == 0) 3511 inc_all_pages = 1; 3512 ClearPageError(page); 3513 err = __extent_read_full_page(tree, page, 3514 get_extent, &bio, --- 444 unchanged lines hidden --- |