diff options
Diffstat (limited to 'fs/ext4/extents_status.c')
| -rw-r--r-- | fs/ext4/extents_status.c | 17 | 
1 files changed, 12 insertions, 5 deletions
diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c index fe3337a85ed..e6941e622d3 100644 --- a/fs/ext4/extents_status.c +++ b/fs/ext4/extents_status.c @@ -232,14 +232,16 @@ static struct extent_status *__es_tree_search(struct rb_root *root,  }  /* - * ext4_es_find_delayed_extent: find the 1st delayed extent covering @es->lblk - * if it exists, otherwise, the next extent after @es->lblk. + * ext4_es_find_delayed_extent_range: find the 1st delayed extent covering + * @es->lblk if it exists, otherwise, the next extent after @es->lblk.   *   * @inode: the inode which owns delayed extents   * @lblk: the offset where we start to search + * @end: the offset where we stop to search   * @es: delayed extent that we found   */ -void ext4_es_find_delayed_extent(struct inode *inode, ext4_lblk_t lblk, +void ext4_es_find_delayed_extent_range(struct inode *inode, +				 ext4_lblk_t lblk, ext4_lblk_t end,  				 struct extent_status *es)  {  	struct ext4_es_tree *tree = NULL; @@ -247,7 +249,8 @@ void ext4_es_find_delayed_extent(struct inode *inode, ext4_lblk_t lblk,  	struct rb_node *node;  	BUG_ON(es == NULL); -	trace_ext4_es_find_delayed_extent_enter(inode, lblk); +	BUG_ON(end < lblk); +	trace_ext4_es_find_delayed_extent_range_enter(inode, lblk);  	read_lock(&EXT4_I(inode)->i_es_lock);  	tree = &EXT4_I(inode)->i_es_tree; @@ -270,6 +273,10 @@ out:  	if (es1 && !ext4_es_is_delayed(es1)) {  		while ((node = rb_next(&es1->rb_node)) != NULL) {  			es1 = rb_entry(node, struct extent_status, rb_node); +			if (es1->es_lblk > end) { +				es1 = NULL; +				break; +			}  			if (ext4_es_is_delayed(es1))  				break;  		} @@ -285,7 +292,7 @@ out:  	read_unlock(&EXT4_I(inode)->i_es_lock);  	ext4_es_lru_add(inode); -	trace_ext4_es_find_delayed_extent_exit(inode, es); +	trace_ext4_es_find_delayed_extent_range_exit(inode, es);  }  static struct extent_status *  |