Message ID | 4E1E5FF7.7060202@cn.fujitsu.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Jul 14, 2011 at 11:18:15AM +0800, Li Zefan wrote: > lookup_extent_map() and search_extent_map() can share most of code. > > Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> > --- > fs/btrfs/extent_map.c | 85 +++++++++++++++++-------------------------------- > 1 files changed, 29 insertions(+), 56 deletions(-) > > diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c > index 911a9db..df7a803 100644 > --- a/fs/btrfs/extent_map.c > +++ b/fs/btrfs/extent_map.c > @@ -299,19 +299,8 @@ static u64 range_end(u64 start, u64 len) > return start + len; > } > > -/** > - * lookup_extent_mapping - lookup extent_map > - * @tree: tree to lookup in > - * @start: byte offset to start the search > - * @len: length of the lookup range > - * > - * Find and return the first extent_map struct in @tree that intersects the > - * [start, len] range. There may be additional objects in the tree that > - * intersect, so check the object returned carefully to make sure that no > - * additional lookups are needed. > - */ > -struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree, > - u64 start, u64 len) > +struct extent_map *__lookup_extent_mapping(struct extent_map_tree *tree, > + u64 start, u64 len, int strict) just minor thing: can be defined static > { > struct extent_map *em; > struct rb_node *rb_node; > @@ -320,38 +309,42 @@ struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree, > u64 end = range_end(start, len); > > rb_node = __tree_search(&tree->map, start, &prev, &next); > - if (!rb_node && prev) { > - em = rb_entry(prev, struct extent_map, rb_node); > - if (end > em->start && start < extent_map_end(em)) > - goto found; > - } > - if (!rb_node && next) { > - em = rb_entry(next, struct extent_map, rb_node); > - if (end > em->start && start < extent_map_end(em)) > - goto found; > - } > if (!rb_node) { > - em = NULL; > - goto out; > - } > - if (IS_ERR(rb_node)) { > - em = ERR_CAST(rb_node); > - goto out; > + if (prev) > + rb_node = prev; > + else if (next) > + rb_node = next; > + else > + return NULL; > } > + > em = rb_entry(rb_node, struct extent_map, rb_node); > - if (end > em->start && start < extent_map_end(em)) > - goto found; > > - em = NULL; > - goto out; > + if (strict && !(end > em->start && start < extent_map_end(em))) > + return NULL; > > -found: > atomic_inc(&em->refs); > -out: > return em; > } > > /** > + * lookup_extent_mapping - lookup extent_map > + * @tree: tree to lookup in > + * @start: byte offset to start the search > + * @len: length of the lookup range > + * > + * Find and return the first extent_map struct in @tree that intersects the > + * [start, len] range. There may be additional objects in the tree that > + * intersect, so check the object returned carefully to make sure that no > + * additional lookups are needed. > + */ > +struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree, > + u64 start, u64 len) > +{ > + return __lookup_extent_mapping(tree, start, len, 1); > +} > + > +/** > * search_extent_mapping - find a nearby extent map > * @tree: tree to lookup in > * @start: byte offset to start the search > @@ -365,27 +358,7 @@ out: > struct extent_map *search_extent_mapping(struct extent_map_tree *tree, > u64 start, u64 len) > { > - struct extent_map *em; > - struct rb_node *rb_node; > - struct rb_node *prev = NULL; > - struct rb_node *next = NULL; > - > - rb_node = __tree_search(&tree->map, start, &prev, &next); > - if (!rb_node && prev) { > - em = rb_entry(prev, struct extent_map, rb_node); > - goto found; > - } > - if (!rb_node && next) { > - em = rb_entry(next, struct extent_map, rb_node); > - goto found; > - } > - if (!rb_node) > - return NULL; > - > - em = rb_entry(rb_node, struct extent_map, rb_node); > -found: > - atomic_inc(&em->refs); > - return em; > + return __lookup_extent_mapping(tree, start, len, 0); > } > > /** > -- > 1.7.3.1 > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c index 911a9db..df7a803 100644 --- a/fs/btrfs/extent_map.c +++ b/fs/btrfs/extent_map.c @@ -299,19 +299,8 @@ static u64 range_end(u64 start, u64 len) return start + len; } -/** - * lookup_extent_mapping - lookup extent_map - * @tree: tree to lookup in - * @start: byte offset to start the search - * @len: length of the lookup range - * - * Find and return the first extent_map struct in @tree that intersects the - * [start, len] range. There may be additional objects in the tree that - * intersect, so check the object returned carefully to make sure that no - * additional lookups are needed. - */ -struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree, - u64 start, u64 len) +struct extent_map *__lookup_extent_mapping(struct extent_map_tree *tree, + u64 start, u64 len, int strict) { struct extent_map *em; struct rb_node *rb_node; @@ -320,38 +309,42 @@ struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree, u64 end = range_end(start, len); rb_node = __tree_search(&tree->map, start, &prev, &next); - if (!rb_node && prev) { - em = rb_entry(prev, struct extent_map, rb_node); - if (end > em->start && start < extent_map_end(em)) - goto found; - } - if (!rb_node && next) { - em = rb_entry(next, struct extent_map, rb_node); - if (end > em->start && start < extent_map_end(em)) - goto found; - } if (!rb_node) { - em = NULL; - goto out; - } - if (IS_ERR(rb_node)) { - em = ERR_CAST(rb_node); - goto out; + if (prev) + rb_node = prev; + else if (next) + rb_node = next; + else + return NULL; } + em = rb_entry(rb_node, struct extent_map, rb_node); - if (end > em->start && start < extent_map_end(em)) - goto found; - em = NULL; - goto out; + if (strict && !(end > em->start && start < extent_map_end(em))) + return NULL; -found: atomic_inc(&em->refs); -out: return em; } /** + * lookup_extent_mapping - lookup extent_map + * @tree: tree to lookup in + * @start: byte offset to start the search + * @len: length of the lookup range + * + * Find and return the first extent_map struct in @tree that intersects the + * [start, len] range. There may be additional objects in the tree that + * intersect, so check the object returned carefully to make sure that no + * additional lookups are needed. + */ +struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree, + u64 start, u64 len) +{ + return __lookup_extent_mapping(tree, start, len, 1); +} + +/** * search_extent_mapping - find a nearby extent map * @tree: tree to lookup in * @start: byte offset to start the search @@ -365,27 +358,7 @@ out: struct extent_map *search_extent_mapping(struct extent_map_tree *tree, u64 start, u64 len) { - struct extent_map *em; - struct rb_node *rb_node; - struct rb_node *prev = NULL; - struct rb_node *next = NULL; - - rb_node = __tree_search(&tree->map, start, &prev, &next); - if (!rb_node && prev) { - em = rb_entry(prev, struct extent_map, rb_node); - goto found; - } - if (!rb_node && next) { - em = rb_entry(next, struct extent_map, rb_node); - goto found; - } - if (!rb_node) - return NULL; - - em = rb_entry(rb_node, struct extent_map, rb_node); -found: - atomic_inc(&em->refs); - return em; + return __lookup_extent_mapping(tree, start, len, 0); } /**
lookup_extent_map() and search_extent_map() can share most of code. Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> --- fs/btrfs/extent_map.c | 85 +++++++++++++++++-------------------------------- 1 files changed, 29 insertions(+), 56 deletions(-)