Re: [PATCH 11/16] Btrfs: clean up code for extent_map lookup

2011-07-22 Thread David Sterba
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 
> ---
>  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 majord...@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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 11/16] Btrfs: clean up code for extent_map lookup

2011-07-13 Thread Li Zefan
lookup_extent_map() and search_extent_map() can share most of code.

Signed-off-by: Li Zefan 
---
 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)
 {
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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html