Btrfs: A few updates for 2.6.18 and versions older than 2.6.25
[linux-2.6-block.git] / fs / btrfs / volumes.c
index 82bc6cfc110f5129a010ddc0c2395659c932e058..f81519f0e4a763e4953eb06db11e67b575ccf527 100644 (file)
@@ -126,6 +126,7 @@ static int device_list_add(const char *path,
                }
                device->devid = devid;
                device->barriers = 1;
+               spin_lock_init(&device->io_lock);
                device->name = kstrdup(path, GFP_NOFS);
                if (!device->name) {
                        kfree(device);
@@ -759,8 +760,8 @@ printk("alloc chunk start %Lu size %Lu from dev %Lu type %Lu\n", key.objectid, c
        em_tree = &extent_root->fs_info->mapping_tree.map_tree;
        spin_lock(&em_tree->lock);
        ret = add_extent_mapping(em_tree, em);
-       BUG_ON(ret);
        spin_unlock(&em_tree->lock);
+       BUG_ON(ret);
        free_extent_map(em);
        return ret;
 }
@@ -799,6 +800,7 @@ int btrfs_num_copies(struct btrfs_mapping_tree *map_tree, u64 logical, u64 len)
 
        spin_lock(&em_tree->lock);
        em = lookup_extent_mapping(em_tree, logical, len);
+       spin_unlock(&em_tree->lock);
        BUG_ON(!em);
 
        BUG_ON(em->start > logical || em->start + em->len < logical);
@@ -808,7 +810,6 @@ int btrfs_num_copies(struct btrfs_mapping_tree *map_tree, u64 logical, u64 len)
        else
                ret = 1;
        free_extent_map(em);
-       spin_unlock(&em_tree->lock);
        return ret;
 }
 
@@ -840,6 +841,7 @@ again:
 
        spin_lock(&em_tree->lock);
        em = lookup_extent_mapping(em_tree, logical, *length);
+       spin_unlock(&em_tree->lock);
        BUG_ON(!em);
 
        BUG_ON(em->start > logical || em->start + em->len < logical);
@@ -855,7 +857,6 @@ again:
            ((map->type & BTRFS_BLOCK_GROUP_RAID1) ||
             (map->type & BTRFS_BLOCK_GROUP_DUP))) {
                stripes_allocated = map->num_stripes;
-               spin_unlock(&em_tree->lock);
                free_extent_map(em);
                kfree(multi);
                goto again;
@@ -932,7 +933,6 @@ again:
        *multi_ret = multi;
 out:
        free_extent_map(em);
-       spin_unlock(&em_tree->lock);
        return 0;
 }
 
@@ -1060,16 +1060,15 @@ static int read_one_chunk(struct btrfs_root *root, struct btrfs_key *key,
        length = key->offset;
        spin_lock(&map_tree->map_tree.lock);
        em = lookup_extent_mapping(&map_tree->map_tree, logical, 1);
+       spin_unlock(&map_tree->map_tree.lock);
 
        /* already mapped? */
        if (em && em->start <= logical && em->start + em->len > logical) {
                free_extent_map(em);
-               spin_unlock(&map_tree->map_tree.lock);
                return 0;
        } else if (em) {
                free_extent_map(em);
        }
-       spin_unlock(&map_tree->map_tree.lock);
 
        map = kzalloc(sizeof(*map), GFP_NOFS);
        if (!map)
@@ -1110,8 +1109,8 @@ static int read_one_chunk(struct btrfs_root *root, struct btrfs_key *key,
 
        spin_lock(&map_tree->map_tree.lock);
        ret = add_extent_mapping(&map_tree->map_tree, em);
-       BUG_ON(ret);
        spin_unlock(&map_tree->map_tree.lock);
+       BUG_ON(ret);
        free_extent_map(em);
 
        return 0;
@@ -1154,7 +1153,7 @@ static int read_one_dev(struct btrfs_root *root,
                        return -ENOMEM;
                list_add(&device->dev_list,
                         &root->fs_info->fs_devices->devices);
-               device->total_ios = 0;
+               device->barriers = 1;
                spin_lock_init(&device->io_lock);
        }