aboutsummaryrefslogtreecommitdiffstats
path: root/fs
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
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')
-rw-r--r--fs/btrfs/ordered-data.c16
-rw-r--r--fs/btrfs/ordered-data.h4
-rw-r--r--fs/btrfs/tree-log.c2
3 files changed, 17 insertions, 5 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);
diff --git a/fs/btrfs/ordered-data.h b/fs/btrfs/ordered-data.h
index 0124bffc775f..e96cd4ccd805 100644
--- a/fs/btrfs/ordered-data.h
+++ b/fs/btrfs/ordered-data.h
@@ -198,7 +198,9 @@ int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u64 disk_bytenr,
198int btrfs_wait_ordered_extents(struct btrfs_root *root, int nr); 198int btrfs_wait_ordered_extents(struct btrfs_root *root, int nr);
199void btrfs_wait_ordered_roots(struct btrfs_fs_info *fs_info, int nr); 199void btrfs_wait_ordered_roots(struct btrfs_fs_info *fs_info, int nr);
200void btrfs_get_logged_extents(struct inode *inode, 200void btrfs_get_logged_extents(struct inode *inode,
201 struct list_head *logged_list); 201 struct list_head *logged_list,
202 const loff_t start,
203 const loff_t end);
202void btrfs_put_logged_extents(struct list_head *logged_list); 204void btrfs_put_logged_extents(struct list_head *logged_list);
203void btrfs_submit_logged_extents(struct list_head *logged_list, 205void btrfs_submit_logged_extents(struct list_head *logged_list,
204 struct btrfs_root *log); 206 struct btrfs_root *log);
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index afe483cb27b0..3883d0febd82 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -3972,7 +3972,7 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
3972 3972
3973 mutex_lock(&BTRFS_I(inode)->log_mutex); 3973 mutex_lock(&BTRFS_I(inode)->log_mutex);
3974 3974
3975 btrfs_get_logged_extents(inode, &logged_list); 3975 btrfs_get_logged_extents(inode, &logged_list, start, end);
3976 3976
3977 /* 3977 /*
3978 * a brute force approach to making sure we get the most uptodate 3978 * a brute force approach to making sure we get the most uptodate