Skip to content

Commit 43d871f

Browse files
committed
Merge branch 'integration-4.5' of git://git.kernel.org/pub/scm/linux/kernel/git/fdmanana/linux into for-linus-4.5
2 parents e410e34 + 0c0fe3b commit 43d871f

File tree

5 files changed

+115
-68
lines changed

5 files changed

+115
-68
lines changed

fs/btrfs/backref.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1406,7 +1406,8 @@ char *btrfs_ref_to_path(struct btrfs_root *fs_root, struct btrfs_path *path,
14061406
read_extent_buffer(eb, dest + bytes_left,
14071407
name_off, name_len);
14081408
if (eb != eb_in) {
1409-
btrfs_tree_read_unlock_blocking(eb);
1409+
if (!path->skip_locking)
1410+
btrfs_tree_read_unlock_blocking(eb);
14101411
free_extent_buffer(eb);
14111412
}
14121413
ret = btrfs_find_item(fs_root, path, parent, 0,
@@ -1426,9 +1427,10 @@ char *btrfs_ref_to_path(struct btrfs_root *fs_root, struct btrfs_path *path,
14261427
eb = path->nodes[0];
14271428
/* make sure we can use eb after releasing the path */
14281429
if (eb != eb_in) {
1429-
atomic_inc(&eb->refs);
1430-
btrfs_tree_read_lock(eb);
1431-
btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
1430+
if (!path->skip_locking)
1431+
btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
1432+
path->nodes[0] = NULL;
1433+
path->locks[0] = 0;
14321434
}
14331435
btrfs_release_path(path);
14341436
iref = btrfs_item_ptr(eb, slot, struct btrfs_inode_ref);

fs/btrfs/compression.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -637,11 +637,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
637637
faili = nr_pages - 1;
638638
cb->nr_pages = nr_pages;
639639

640-
/* In the parent-locked case, we only locked the range we are
641-
* interested in. In all other cases, we can opportunistically
642-
* cache decompressed data that goes beyond the requested range. */
643-
if (!(bio_flags & EXTENT_BIO_PARENT_LOCKED))
644-
add_ra_bio_pages(inode, em_start + em_len, cb);
640+
add_ra_bio_pages(inode, em_start + em_len, cb);
645641

646642
/* include any pages we added in add_ra-bio_pages */
647643
uncompressed_len = bio->bi_vcnt * PAGE_CACHE_SIZE;

fs/btrfs/extent_io.c

Lines changed: 11 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2897,12 +2897,11 @@ static int __do_readpage(struct extent_io_tree *tree,
28972897
struct block_device *bdev;
28982898
int ret;
28992899
int nr = 0;
2900-
int parent_locked = *bio_flags & EXTENT_BIO_PARENT_LOCKED;
29012900
size_t pg_offset = 0;
29022901
size_t iosize;
29032902
size_t disk_io_size;
29042903
size_t blocksize = inode->i_sb->s_blocksize;
2905-
unsigned long this_bio_flag = *bio_flags & EXTENT_BIO_PARENT_LOCKED;
2904+
unsigned long this_bio_flag = 0;
29062905

29072906
set_page_extent_mapped(page);
29082907

@@ -2942,18 +2941,16 @@ static int __do_readpage(struct extent_io_tree *tree,
29422941
kunmap_atomic(userpage);
29432942
set_extent_uptodate(tree, cur, cur + iosize - 1,
29442943
&cached, GFP_NOFS);
2945-
if (!parent_locked)
2946-
unlock_extent_cached(tree, cur,
2947-
cur + iosize - 1,
2948-
&cached, GFP_NOFS);
2944+
unlock_extent_cached(tree, cur,
2945+
cur + iosize - 1,
2946+
&cached, GFP_NOFS);
29492947
break;
29502948
}
29512949
em = __get_extent_map(inode, page, pg_offset, cur,
29522950
end - cur + 1, get_extent, em_cached);
29532951
if (IS_ERR_OR_NULL(em)) {
29542952
SetPageError(page);
2955-
if (!parent_locked)
2956-
unlock_extent(tree, cur, end);
2953+
unlock_extent(tree, cur, end);
29572954
break;
29582955
}
29592956
extent_offset = cur - em->start;
@@ -3038,12 +3035,9 @@ static int __do_readpage(struct extent_io_tree *tree,
30383035

30393036
set_extent_uptodate(tree, cur, cur + iosize - 1,
30403037
&cached, GFP_NOFS);
3041-
if (parent_locked)
3042-
free_extent_state(cached);
3043-
else
3044-
unlock_extent_cached(tree, cur,
3045-
cur + iosize - 1,
3046-
&cached, GFP_NOFS);
3038+
unlock_extent_cached(tree, cur,
3039+
cur + iosize - 1,
3040+
&cached, GFP_NOFS);
30473041
cur = cur + iosize;
30483042
pg_offset += iosize;
30493043
continue;
@@ -3052,8 +3046,7 @@ static int __do_readpage(struct extent_io_tree *tree,
30523046
if (test_range_bit(tree, cur, cur_end,
30533047
EXTENT_UPTODATE, 1, NULL)) {
30543048
check_page_uptodate(tree, page);
3055-
if (!parent_locked)
3056-
unlock_extent(tree, cur, cur + iosize - 1);
3049+
unlock_extent(tree, cur, cur + iosize - 1);
30573050
cur = cur + iosize;
30583051
pg_offset += iosize;
30593052
continue;
@@ -3063,8 +3056,7 @@ static int __do_readpage(struct extent_io_tree *tree,
30633056
*/
30643057
if (block_start == EXTENT_MAP_INLINE) {
30653058
SetPageError(page);
3066-
if (!parent_locked)
3067-
unlock_extent(tree, cur, cur + iosize - 1);
3059+
unlock_extent(tree, cur, cur + iosize - 1);
30683060
cur = cur + iosize;
30693061
pg_offset += iosize;
30703062
continue;
@@ -3083,8 +3075,7 @@ static int __do_readpage(struct extent_io_tree *tree,
30833075
*bio_flags = this_bio_flag;
30843076
} else {
30853077
SetPageError(page);
3086-
if (!parent_locked)
3087-
unlock_extent(tree, cur, cur + iosize - 1);
3078+
unlock_extent(tree, cur, cur + iosize - 1);
30883079
}
30893080
cur = cur + iosize;
30903081
pg_offset += iosize;
@@ -3213,20 +3204,6 @@ int extent_read_full_page(struct extent_io_tree *tree, struct page *page,
32133204
return ret;
32143205
}
32153206

3216-
int extent_read_full_page_nolock(struct extent_io_tree *tree, struct page *page,
3217-
get_extent_t *get_extent, int mirror_num)
3218-
{
3219-
struct bio *bio = NULL;
3220-
unsigned long bio_flags = EXTENT_BIO_PARENT_LOCKED;
3221-
int ret;
3222-
3223-
ret = __do_readpage(tree, page, get_extent, NULL, &bio, mirror_num,
3224-
&bio_flags, READ, NULL);
3225-
if (bio)
3226-
ret = submit_one_bio(READ, bio, mirror_num, bio_flags);
3227-
return ret;
3228-
}
3229-
32303207
static noinline void update_nr_written(struct page *page,
32313208
struct writeback_control *wbc,
32323209
unsigned long nr_written)

fs/btrfs/extent_io.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
*/
3030
#define EXTENT_BIO_COMPRESSED 1
3131
#define EXTENT_BIO_TREE_LOG 2
32-
#define EXTENT_BIO_PARENT_LOCKED 4
3332
#define EXTENT_BIO_FLAG_SHIFT 16
3433

3534
/* these are bit numbers for test/set bit */
@@ -210,8 +209,6 @@ static inline int lock_extent(struct extent_io_tree *tree, u64 start, u64 end)
210209
int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end);
211210
int extent_read_full_page(struct extent_io_tree *tree, struct page *page,
212211
get_extent_t *get_extent, int mirror_num);
213-
int extent_read_full_page_nolock(struct extent_io_tree *tree, struct page *page,
214-
get_extent_t *get_extent, int mirror_num);
215212
int __init extent_io_init(void);
216213
void extent_io_exit(void);
217214

fs/btrfs/ioctl.c

Lines changed: 97 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2794,24 +2794,29 @@ static long btrfs_ioctl_dev_info(struct btrfs_root *root, void __user *arg)
27942794
static struct page *extent_same_get_page(struct inode *inode, pgoff_t index)
27952795
{
27962796
struct page *page;
2797-
struct extent_io_tree *tree = &BTRFS_I(inode)->io_tree;
27982797

27992798
page = grab_cache_page(inode->i_mapping, index);
28002799
if (!page)
2801-
return NULL;
2800+
return ERR_PTR(-ENOMEM);
28022801

28032802
if (!PageUptodate(page)) {
2804-
if (extent_read_full_page_nolock(tree, page, btrfs_get_extent,
2805-
0))
2806-
return NULL;
2803+
int ret;
2804+
2805+
ret = btrfs_readpage(NULL, page);
2806+
if (ret)
2807+
return ERR_PTR(ret);
28072808
lock_page(page);
28082809
if (!PageUptodate(page)) {
28092810
unlock_page(page);
28102811
page_cache_release(page);
2811-
return NULL;
2812+
return ERR_PTR(-EIO);
2813+
}
2814+
if (page->mapping != inode->i_mapping) {
2815+
unlock_page(page);
2816+
page_cache_release(page);
2817+
return ERR_PTR(-EAGAIN);
28122818
}
28132819
}
2814-
unlock_page(page);
28152820

28162821
return page;
28172822
}
@@ -2823,17 +2828,31 @@ static int gather_extent_pages(struct inode *inode, struct page **pages,
28232828
pgoff_t index = off >> PAGE_CACHE_SHIFT;
28242829

28252830
for (i = 0; i < num_pages; i++) {
2831+
again:
28262832
pages[i] = extent_same_get_page(inode, index + i);
2827-
if (!pages[i])
2828-
return -ENOMEM;
2833+
if (IS_ERR(pages[i])) {
2834+
int err = PTR_ERR(pages[i]);
2835+
2836+
if (err == -EAGAIN)
2837+
goto again;
2838+
pages[i] = NULL;
2839+
return err;
2840+
}
28292841
}
28302842
return 0;
28312843
}
28322844

2833-
static inline void lock_extent_range(struct inode *inode, u64 off, u64 len)
2845+
static int lock_extent_range(struct inode *inode, u64 off, u64 len,
2846+
bool retry_range_locking)
28342847
{
2835-
/* do any pending delalloc/csum calc on src, one way or
2836-
another, and lock file content */
2848+
/*
2849+
* Do any pending delalloc/csum calculations on inode, one way or
2850+
* another, and lock file content.
2851+
* The locking order is:
2852+
*
2853+
* 1) pages
2854+
* 2) range in the inode's io tree
2855+
*/
28372856
while (1) {
28382857
struct btrfs_ordered_extent *ordered;
28392858
lock_extent(&BTRFS_I(inode)->io_tree, off, off + len - 1);
@@ -2851,8 +2870,11 @@ static inline void lock_extent_range(struct inode *inode, u64 off, u64 len)
28512870
unlock_extent(&BTRFS_I(inode)->io_tree, off, off + len - 1);
28522871
if (ordered)
28532872
btrfs_put_ordered_extent(ordered);
2873+
if (!retry_range_locking)
2874+
return -EAGAIN;
28542875
btrfs_wait_ordered_range(inode, off, len);
28552876
}
2877+
return 0;
28562878
}
28572879

28582880
static void btrfs_double_inode_unlock(struct inode *inode1, struct inode *inode2)
@@ -2877,15 +2899,24 @@ static void btrfs_double_extent_unlock(struct inode *inode1, u64 loff1,
28772899
unlock_extent(&BTRFS_I(inode2)->io_tree, loff2, loff2 + len - 1);
28782900
}
28792901

2880-
static void btrfs_double_extent_lock(struct inode *inode1, u64 loff1,
2881-
struct inode *inode2, u64 loff2, u64 len)
2902+
static int btrfs_double_extent_lock(struct inode *inode1, u64 loff1,
2903+
struct inode *inode2, u64 loff2, u64 len,
2904+
bool retry_range_locking)
28822905
{
2906+
int ret;
2907+
28832908
if (inode1 < inode2) {
28842909
swap(inode1, inode2);
28852910
swap(loff1, loff2);
28862911
}
2887-
lock_extent_range(inode1, loff1, len);
2888-
lock_extent_range(inode2, loff2, len);
2912+
ret = lock_extent_range(inode1, loff1, len, retry_range_locking);
2913+
if (ret)
2914+
return ret;
2915+
ret = lock_extent_range(inode2, loff2, len, retry_range_locking);
2916+
if (ret)
2917+
unlock_extent(&BTRFS_I(inode1)->io_tree, loff1,
2918+
loff1 + len - 1);
2919+
return ret;
28892920
}
28902921

28912922
struct cmp_pages {
@@ -2901,11 +2932,15 @@ static void btrfs_cmp_data_free(struct cmp_pages *cmp)
29012932

29022933
for (i = 0; i < cmp->num_pages; i++) {
29032934
pg = cmp->src_pages[i];
2904-
if (pg)
2935+
if (pg) {
2936+
unlock_page(pg);
29052937
page_cache_release(pg);
2938+
}
29062939
pg = cmp->dst_pages[i];
2907-
if (pg)
2940+
if (pg) {
2941+
unlock_page(pg);
29082942
page_cache_release(pg);
2943+
}
29092944
}
29102945
kfree(cmp->src_pages);
29112946
kfree(cmp->dst_pages);
@@ -2966,6 +3001,8 @@ static int btrfs_cmp_data(struct inode *src, u64 loff, struct inode *dst,
29663001

29673002
src_page = cmp->src_pages[i];
29683003
dst_page = cmp->dst_pages[i];
3004+
ASSERT(PageLocked(src_page));
3005+
ASSERT(PageLocked(dst_page));
29693006

29703007
addr = kmap_atomic(src_page);
29713008
dst_addr = kmap_atomic(dst_page);
@@ -3078,14 +3115,46 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen,
30783115
goto out_unlock;
30793116
}
30803117

3118+
again:
30813119
ret = btrfs_cmp_data_prepare(src, loff, dst, dst_loff, olen, &cmp);
30823120
if (ret)
30833121
goto out_unlock;
30843122

30853123
if (same_inode)
3086-
lock_extent_range(src, same_lock_start, same_lock_len);
3124+
ret = lock_extent_range(src, same_lock_start, same_lock_len,
3125+
false);
30873126
else
3088-
btrfs_double_extent_lock(src, loff, dst, dst_loff, len);
3127+
ret = btrfs_double_extent_lock(src, loff, dst, dst_loff, len,
3128+
false);
3129+
/*
3130+
* If one of the inodes has dirty pages in the respective range or
3131+
* ordered extents, we need to flush dellaloc and wait for all ordered
3132+
* extents in the range. We must unlock the pages and the ranges in the
3133+
* io trees to avoid deadlocks when flushing delalloc (requires locking
3134+
* pages) and when waiting for ordered extents to complete (they require
3135+
* range locking).
3136+
*/
3137+
if (ret == -EAGAIN) {
3138+
/*
3139+
* Ranges in the io trees already unlocked. Now unlock all
3140+
* pages before waiting for all IO to complete.
3141+
*/
3142+
btrfs_cmp_data_free(&cmp);
3143+
if (same_inode) {
3144+
btrfs_wait_ordered_range(src, same_lock_start,
3145+
same_lock_len);
3146+
} else {
3147+
btrfs_wait_ordered_range(src, loff, len);
3148+
btrfs_wait_ordered_range(dst, dst_loff, len);
3149+
}
3150+
goto again;
3151+
}
3152+
ASSERT(ret == 0);
3153+
if (WARN_ON(ret)) {
3154+
/* ranges in the io trees already unlocked */
3155+
btrfs_cmp_data_free(&cmp);
3156+
return ret;
3157+
}
30893158

30903159
/* pass original length for comparison so we stay within i_size */
30913160
ret = btrfs_cmp_data(src, loff, dst, dst_loff, olen, &cmp);
@@ -3907,9 +3976,15 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,
39073976
u64 lock_start = min_t(u64, off, destoff);
39083977
u64 lock_len = max_t(u64, off, destoff) + len - lock_start;
39093978

3910-
lock_extent_range(src, lock_start, lock_len);
3979+
ret = lock_extent_range(src, lock_start, lock_len, true);
39113980
} else {
3912-
btrfs_double_extent_lock(src, off, inode, destoff, len);
3981+
ret = btrfs_double_extent_lock(src, off, inode, destoff, len,
3982+
true);
3983+
}
3984+
ASSERT(ret == 0);
3985+
if (WARN_ON(ret)) {
3986+
/* ranges in the io trees already unlocked */
3987+
goto out_unlock;
39133988
}
39143989

39153990
ret = btrfs_clone(src, inode, off, olen, len, destoff, 0);

0 commit comments

Comments
 (0)