Btrfs: Fix extent_map leak in extent_bmap
authorYan <yanzheng@21cn.com>
Mon, 29 Oct 2007 15:41:05 +0000 (11:41 -0400)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:03:57 +0000 (11:03 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/extent_map.c

index c44989a1e5201224b3afa1329789a98616ea7ae6..e4ee980cc138adea7d19ac1fbe76083851ba98f7 100644 (file)
@@ -1924,6 +1924,7 @@ sector_t extent_bmap(struct address_space *mapping, sector_t iblock,
        struct inode *inode = mapping->host;
        u64 start = iblock << inode->i_blkbits;
        u64 end = start + (1 << inode->i_blkbits) - 1;
+       sector_t sector = 0;
        struct extent_map *em;
 
        em = get_extent(inode, NULL, 0, start, end, 0);
@@ -1932,9 +1933,12 @@ sector_t extent_bmap(struct address_space *mapping, sector_t iblock,
 
        if (em->block_start == EXTENT_MAP_INLINE ||
            em->block_start == EXTENT_MAP_HOLE)
-               return 0;
+               goto out;
 
-       return (em->block_start + start - em->start) >> inode->i_blkbits;
+       sector = (em->block_start + start - em->start) >> inode->i_blkbits;
+out:
+       free_extent_map(em);
+       return sector;
 }
 
 static int add_lru(struct extent_map_tree *tree, struct extent_buffer *eb)