diff options
-rw-r--r-- | fs/btrfs/extent_io.c | 52 | ||||
-rw-r--r-- | fs/btrfs/extent_io.h | 18 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 26 |
3 files changed, 34 insertions, 62 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 5bbdb243bb6f..789d0b23048f 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -254,14 +254,14 @@ static void merge_cb(struct extent_io_tree *tree, struct extent_state *new, | |||
254 | * | 254 | * |
255 | * This should be called with the tree lock held. | 255 | * This should be called with the tree lock held. |
256 | */ | 256 | */ |
257 | static int merge_state(struct extent_io_tree *tree, | 257 | static void merge_state(struct extent_io_tree *tree, |
258 | struct extent_state *state) | 258 | struct extent_state *state) |
259 | { | 259 | { |
260 | struct extent_state *other; | 260 | struct extent_state *other; |
261 | struct rb_node *other_node; | 261 | struct rb_node *other_node; |
262 | 262 | ||
263 | if (state->state & (EXTENT_IOBITS | EXTENT_BOUNDARY)) | 263 | if (state->state & (EXTENT_IOBITS | EXTENT_BOUNDARY)) |
264 | return 0; | 264 | return; |
265 | 265 | ||
266 | other_node = rb_prev(&state->rb_node); | 266 | other_node = rb_prev(&state->rb_node); |
267 | if (other_node) { | 267 | if (other_node) { |
@@ -287,19 +287,13 @@ static int merge_state(struct extent_io_tree *tree, | |||
287 | free_extent_state(other); | 287 | free_extent_state(other); |
288 | } | 288 | } |
289 | } | 289 | } |
290 | |||
291 | return 0; | ||
292 | } | 290 | } |
293 | 291 | ||
294 | static int set_state_cb(struct extent_io_tree *tree, | 292 | static void set_state_cb(struct extent_io_tree *tree, |
295 | struct extent_state *state, int *bits) | 293 | struct extent_state *state, int *bits) |
296 | { | 294 | { |
297 | if (tree->ops && tree->ops->set_bit_hook) { | 295 | if (tree->ops && tree->ops->set_bit_hook) |
298 | return tree->ops->set_bit_hook(tree->mapping->host, | 296 | tree->ops->set_bit_hook(tree->mapping->host, state, bits); |
299 | state, bits); | ||
300 | } | ||
301 | |||
302 | return 0; | ||
303 | } | 297 | } |
304 | 298 | ||
305 | static void clear_state_cb(struct extent_io_tree *tree, | 299 | static void clear_state_cb(struct extent_io_tree *tree, |
@@ -325,7 +319,6 @@ static int insert_state(struct extent_io_tree *tree, | |||
325 | { | 319 | { |
326 | struct rb_node *node; | 320 | struct rb_node *node; |
327 | int bits_to_set = *bits & ~EXTENT_CTLBITS; | 321 | int bits_to_set = *bits & ~EXTENT_CTLBITS; |
328 | int ret; | ||
329 | 322 | ||
330 | if (end < start) { | 323 | if (end < start) { |
331 | printk(KERN_ERR "btrfs end < start %llu %llu\n", | 324 | printk(KERN_ERR "btrfs end < start %llu %llu\n", |
@@ -335,9 +328,7 @@ static int insert_state(struct extent_io_tree *tree, | |||
335 | } | 328 | } |
336 | state->start = start; | 329 | state->start = start; |
337 | state->end = end; | 330 | state->end = end; |
338 | ret = set_state_cb(tree, state, bits); | 331 | set_state_cb(tree, state, bits); |
339 | if (ret) | ||
340 | return ret; | ||
341 | 332 | ||
342 | if (bits_to_set & EXTENT_DIRTY) | 333 | if (bits_to_set & EXTENT_DIRTY) |
343 | tree->dirty_bytes += end - start + 1; | 334 | tree->dirty_bytes += end - start + 1; |
@@ -357,13 +348,11 @@ static int insert_state(struct extent_io_tree *tree, | |||
357 | return 0; | 348 | return 0; |
358 | } | 349 | } |
359 | 350 | ||
360 | static int split_cb(struct extent_io_tree *tree, struct extent_state *orig, | 351 | static void split_cb(struct extent_io_tree *tree, struct extent_state *orig, |
361 | u64 split) | 352 | u64 split) |
362 | { | 353 | { |
363 | if (tree->ops && tree->ops->split_extent_hook) | 354 | if (tree->ops && tree->ops->split_extent_hook) |
364 | return tree->ops->split_extent_hook(tree->mapping->host, | 355 | tree->ops->split_extent_hook(tree->mapping->host, orig, split); |
365 | orig, split); | ||
366 | return 0; | ||
367 | } | 356 | } |
368 | 357 | ||
369 | /* | 358 | /* |
@@ -670,23 +659,18 @@ out: | |||
670 | return 0; | 659 | return 0; |
671 | } | 660 | } |
672 | 661 | ||
673 | static int set_state_bits(struct extent_io_tree *tree, | 662 | static void set_state_bits(struct extent_io_tree *tree, |
674 | struct extent_state *state, | 663 | struct extent_state *state, |
675 | int *bits) | 664 | int *bits) |
676 | { | 665 | { |
677 | int ret; | ||
678 | int bits_to_set = *bits & ~EXTENT_CTLBITS; | 666 | int bits_to_set = *bits & ~EXTENT_CTLBITS; |
679 | 667 | ||
680 | ret = set_state_cb(tree, state, bits); | 668 | set_state_cb(tree, state, bits); |
681 | if (ret) | ||
682 | return ret; | ||
683 | if ((bits_to_set & EXTENT_DIRTY) && !(state->state & EXTENT_DIRTY)) { | 669 | if ((bits_to_set & EXTENT_DIRTY) && !(state->state & EXTENT_DIRTY)) { |
684 | u64 range = state->end - state->start + 1; | 670 | u64 range = state->end - state->start + 1; |
685 | tree->dirty_bytes += range; | 671 | tree->dirty_bytes += range; |
686 | } | 672 | } |
687 | state->state |= bits_to_set; | 673 | state->state |= bits_to_set; |
688 | |||
689 | return 0; | ||
690 | } | 674 | } |
691 | 675 | ||
692 | static void cache_state(struct extent_state *state, | 676 | static void cache_state(struct extent_state *state, |
@@ -779,9 +763,7 @@ hit_next: | |||
779 | goto out; | 763 | goto out; |
780 | } | 764 | } |
781 | 765 | ||
782 | err = set_state_bits(tree, state, &bits); | 766 | set_state_bits(tree, state, &bits); |
783 | if (err) | ||
784 | goto out; | ||
785 | 767 | ||
786 | cache_state(state, cached_state); | 768 | cache_state(state, cached_state); |
787 | merge_state(tree, state); | 769 | merge_state(tree, state); |
@@ -830,9 +812,7 @@ hit_next: | |||
830 | if (err) | 812 | if (err) |
831 | goto out; | 813 | goto out; |
832 | if (state->end <= end) { | 814 | if (state->end <= end) { |
833 | err = set_state_bits(tree, state, &bits); | 815 | set_state_bits(tree, state, &bits); |
834 | if (err) | ||
835 | goto out; | ||
836 | cache_state(state, cached_state); | 816 | cache_state(state, cached_state); |
837 | merge_state(tree, state); | 817 | merge_state(tree, state); |
838 | if (last_end == (u64)-1) | 818 | if (last_end == (u64)-1) |
@@ -893,11 +873,7 @@ hit_next: | |||
893 | err = split_state(tree, state, prealloc, end + 1); | 873 | err = split_state(tree, state, prealloc, end + 1); |
894 | BUG_ON(err == -EEXIST); | 874 | BUG_ON(err == -EEXIST); |
895 | 875 | ||
896 | err = set_state_bits(tree, prealloc, &bits); | 876 | set_state_bits(tree, prealloc, &bits); |
897 | if (err) { | ||
898 | prealloc = NULL; | ||
899 | goto out; | ||
900 | } | ||
901 | cache_state(prealloc, cached_state); | 877 | cache_state(prealloc, cached_state); |
902 | merge_state(tree, prealloc); | 878 | merge_state(tree, prealloc); |
903 | prealloc = NULL; | 879 | prealloc = NULL; |
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h index 21a7ca9e7282..d6871dc7524f 100644 --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h | |||
@@ -76,15 +76,15 @@ struct extent_io_ops { | |||
76 | struct extent_state *state); | 76 | struct extent_state *state); |
77 | int (*writepage_end_io_hook)(struct page *page, u64 start, u64 end, | 77 | int (*writepage_end_io_hook)(struct page *page, u64 start, u64 end, |
78 | struct extent_state *state, int uptodate); | 78 | struct extent_state *state, int uptodate); |
79 | int (*set_bit_hook)(struct inode *inode, struct extent_state *state, | 79 | void (*set_bit_hook)(struct inode *inode, struct extent_state *state, |
80 | int *bits); | 80 | int *bits); |
81 | int (*clear_bit_hook)(struct inode *inode, struct extent_state *state, | 81 | void (*clear_bit_hook)(struct inode *inode, struct extent_state *state, |
82 | int *bits); | 82 | int *bits); |
83 | int (*merge_extent_hook)(struct inode *inode, | 83 | void (*merge_extent_hook)(struct inode *inode, |
84 | struct extent_state *new, | 84 | struct extent_state *new, |
85 | struct extent_state *other); | 85 | struct extent_state *other); |
86 | int (*split_extent_hook)(struct inode *inode, | 86 | void (*split_extent_hook)(struct inode *inode, |
87 | struct extent_state *orig, u64 split); | 87 | struct extent_state *orig, u64 split); |
88 | int (*write_cache_pages_lock_hook)(struct page *page); | 88 | int (*write_cache_pages_lock_hook)(struct page *page); |
89 | }; | 89 | }; |
90 | 90 | ||
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 69e448eddf09..34195f9fc6bb 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -1283,17 +1283,16 @@ static int run_delalloc_range(struct inode *inode, struct page *locked_page, | |||
1283 | return ret; | 1283 | return ret; |
1284 | } | 1284 | } |
1285 | 1285 | ||
1286 | static int btrfs_split_extent_hook(struct inode *inode, | 1286 | static void btrfs_split_extent_hook(struct inode *inode, |
1287 | struct extent_state *orig, u64 split) | 1287 | struct extent_state *orig, u64 split) |
1288 | { | 1288 | { |
1289 | /* not delalloc, ignore it */ | 1289 | /* not delalloc, ignore it */ |
1290 | if (!(orig->state & EXTENT_DELALLOC)) | 1290 | if (!(orig->state & EXTENT_DELALLOC)) |
1291 | return 0; | 1291 | return; |
1292 | 1292 | ||
1293 | spin_lock(&BTRFS_I(inode)->lock); | 1293 | spin_lock(&BTRFS_I(inode)->lock); |
1294 | BTRFS_I(inode)->outstanding_extents++; | 1294 | BTRFS_I(inode)->outstanding_extents++; |
1295 | spin_unlock(&BTRFS_I(inode)->lock); | 1295 | spin_unlock(&BTRFS_I(inode)->lock); |
1296 | return 0; | ||
1297 | } | 1296 | } |
1298 | 1297 | ||
1299 | /* | 1298 | /* |
@@ -1302,18 +1301,17 @@ static int btrfs_split_extent_hook(struct inode *inode, | |||
1302 | * extents, such as when we are doing sequential writes, so we can properly | 1301 | * extents, such as when we are doing sequential writes, so we can properly |
1303 | * account for the metadata space we'll need. | 1302 | * account for the metadata space we'll need. |
1304 | */ | 1303 | */ |
1305 | static int btrfs_merge_extent_hook(struct inode *inode, | 1304 | static void btrfs_merge_extent_hook(struct inode *inode, |
1306 | struct extent_state *new, | 1305 | struct extent_state *new, |
1307 | struct extent_state *other) | 1306 | struct extent_state *other) |
1308 | { | 1307 | { |
1309 | /* not delalloc, ignore it */ | 1308 | /* not delalloc, ignore it */ |
1310 | if (!(other->state & EXTENT_DELALLOC)) | 1309 | if (!(other->state & EXTENT_DELALLOC)) |
1311 | return 0; | 1310 | return; |
1312 | 1311 | ||
1313 | spin_lock(&BTRFS_I(inode)->lock); | 1312 | spin_lock(&BTRFS_I(inode)->lock); |
1314 | BTRFS_I(inode)->outstanding_extents--; | 1313 | BTRFS_I(inode)->outstanding_extents--; |
1315 | spin_unlock(&BTRFS_I(inode)->lock); | 1314 | spin_unlock(&BTRFS_I(inode)->lock); |
1316 | return 0; | ||
1317 | } | 1315 | } |
1318 | 1316 | ||
1319 | /* | 1317 | /* |
@@ -1321,8 +1319,8 @@ static int btrfs_merge_extent_hook(struct inode *inode, | |||
1321 | * bytes in this file, and to maintain the list of inodes that | 1319 | * bytes in this file, and to maintain the list of inodes that |
1322 | * have pending delalloc work to be done. | 1320 | * have pending delalloc work to be done. |
1323 | */ | 1321 | */ |
1324 | static int btrfs_set_bit_hook(struct inode *inode, | 1322 | static void btrfs_set_bit_hook(struct inode *inode, |
1325 | struct extent_state *state, int *bits) | 1323 | struct extent_state *state, int *bits) |
1326 | { | 1324 | { |
1327 | 1325 | ||
1328 | /* | 1326 | /* |
@@ -1352,14 +1350,13 @@ static int btrfs_set_bit_hook(struct inode *inode, | |||
1352 | } | 1350 | } |
1353 | spin_unlock(&root->fs_info->delalloc_lock); | 1351 | spin_unlock(&root->fs_info->delalloc_lock); |
1354 | } | 1352 | } |
1355 | return 0; | ||
1356 | } | 1353 | } |
1357 | 1354 | ||
1358 | /* | 1355 | /* |
1359 | * extent_io.c clear_bit_hook, see set_bit_hook for why | 1356 | * extent_io.c clear_bit_hook, see set_bit_hook for why |
1360 | */ | 1357 | */ |
1361 | static int btrfs_clear_bit_hook(struct inode *inode, | 1358 | static void btrfs_clear_bit_hook(struct inode *inode, |
1362 | struct extent_state *state, int *bits) | 1359 | struct extent_state *state, int *bits) |
1363 | { | 1360 | { |
1364 | /* | 1361 | /* |
1365 | * set_bit and clear bit hooks normally require _irqsave/restore | 1362 | * set_bit and clear bit hooks normally require _irqsave/restore |
@@ -1396,7 +1393,6 @@ static int btrfs_clear_bit_hook(struct inode *inode, | |||
1396 | } | 1393 | } |
1397 | spin_unlock(&root->fs_info->delalloc_lock); | 1394 | spin_unlock(&root->fs_info->delalloc_lock); |
1398 | } | 1395 | } |
1399 | return 0; | ||
1400 | } | 1396 | } |
1401 | 1397 | ||
1402 | /* | 1398 | /* |