aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/ordered-data.c
diff options
context:
space:
mode:
authorFilipe Manana <fdmanana@suse.com>2014-11-13 12:00:35 -0500
committerChris Mason <clm@fb.com>2014-11-21 14:59:56 -0500
commit0870295b2371673b3563735825ad559409d8cedc (patch)
tree11c07b99c363a2b4fccf42fc78fd5cf907200bfc /fs/btrfs/ordered-data.c
parent5ab5e44a36164f0366a98b47289c868d8fbcb256 (diff)
Btrfs: collect only the necessary ordered extents on ranged fsync
Instead of collecting all ordered extents from the inode's ordered tree and then wait for all of them to complete, just collect the ones that overlap the fsync range. Signed-off-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'fs/btrfs/ordered-data.c')
-rw-r--r--fs/btrfs/ordered-data.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c
index 9c28eb4da4dd..534544e08f76 100644
--- a/fs/btrfs/ordered-data.c
+++ b/fs/btrfs/ordered-data.c
@@ -432,21 +432,31 @@ out:
432 432
433/* Needs to either be called under a log transaction or the log_mutex */ 433/* Needs to either be called under a log transaction or the log_mutex */
434void btrfs_get_logged_extents(struct inode *inode, 434void btrfs_get_logged_extents(struct inode *inode,
435 struct list_head *logged_list) 435 struct list_head *logged_list,
436 const loff_t start,
437 const loff_t end)
436{ 438{
437 struct btrfs_ordered_inode_tree *tree; 439 struct btrfs_ordered_inode_tree *tree;
438 struct btrfs_ordered_extent *ordered; 440 struct btrfs_ordered_extent *ordered;
439 struct rb_node *n; 441 struct rb_node *n;
442 struct rb_node *prev;
440 443
441 tree = &BTRFS_I(inode)->ordered_tree; 444 tree = &BTRFS_I(inode)->ordered_tree;
442 spin_lock_irq(&tree->lock); 445 spin_lock_irq(&tree->lock);
443 for (n = rb_first(&tree->tree); n; n = rb_next(n)) { 446 n = __tree_search(&tree->tree, end, &prev);
447 if (!n)
448 n = prev;
449 for (; n; n = rb_prev(n)) {
444 ordered = rb_entry(n, struct btrfs_ordered_extent, rb_node); 450 ordered = rb_entry(n, struct btrfs_ordered_extent, rb_node);
451 if (ordered->file_offset > end)
452 continue;
453 if (entry_end(ordered) <= start)
454 break;
445 if (!list_empty(&ordered->log_list)) 455 if (!list_empty(&ordered->log_list))
446 continue; 456 continue;
447 if (test_bit(BTRFS_ORDERED_LOGGED, &ordered->flags)) 457 if (test_bit(BTRFS_ORDERED_LOGGED, &ordered->flags))
448 continue; 458 continue;
449 list_add_tail(&ordered->log_list, logged_list); 459 list_add(&ordered->log_list, logged_list);
450 atomic_inc(&ordered->refs); 460 atomic_inc(&ordered->refs);
451 } 461 }
452 spin_unlock_irq(&tree->lock); 462 spin_unlock_irq(&tree->lock);