]> git.hungrycats.org Git - linux/commitdiff
Btrfs: make get_caching_control unconditionally return the ctl
authorJosef Bacik <jbacik@fb.com>
Wed, 26 Nov 2014 16:52:54 +0000 (11:52 -0500)
committerZygo Blaxell <zblaxell@serenity.furryterror.org>
Fri, 23 Jan 2015 13:21:44 +0000 (08:21 -0500)
This was written when we didn't do a caching control for the fast free space
cache loading.  However we started doing that a long time ago, and there is
still a small window of time that we could be caching the block group the fast
way, so if there is a caching_ctl at all on the block group just return it, the
callers all wait properly for what they want.  Thanks,

Signed-off-by: Josef Bacik <jbacik@fb.com>
Signed-off-by: Chris Mason <clm@fb.com>
(cherry picked from commit cb83b7b81698a4abe531e0ba18b9e288b06947ce)

fs/btrfs/extent-tree.c

index 1915b20ce5db6ea010414f85d8897980ba6ce036..a719a54995ac94f71d99fa5408f345c6bb9ca284 100644 (file)
@@ -315,12 +315,6 @@ get_caching_control(struct btrfs_block_group_cache *cache)
        struct btrfs_caching_control *ctl;
 
        spin_lock(&cache->lock);
-       if (cache->cached != BTRFS_CACHE_STARTED) {
-               spin_unlock(&cache->lock);
-               return NULL;
-       }
-
-       /* We're loading it the fast way, so we don't have a caching_ctl. */
        if (!cache->caching_ctl) {
                spin_unlock(&cache->lock);
                return NULL;
@@ -594,6 +588,7 @@ static int cache_block_group(struct btrfs_block_group_cache *cache,
        spin_unlock(&cache->lock);
 
        if (fs_info->mount_opt & BTRFS_MOUNT_SPACE_CACHE) {
+               mutex_lock(&caching_ctl->mutex);
                ret = load_free_space_cache(fs_info, cache);
 
                spin_lock(&cache->lock);
@@ -601,6 +596,7 @@ static int cache_block_group(struct btrfs_block_group_cache *cache,
                        cache->caching_ctl = NULL;
                        cache->cached = BTRFS_CACHE_FINISHED;
                        cache->last_byte_to_unpin = (u64)-1;
+                       caching_ctl->progress = (u64)-1;
                } else {
                        if (load_cache_only) {
                                cache->caching_ctl = NULL;
@@ -611,6 +607,8 @@ static int cache_block_group(struct btrfs_block_group_cache *cache,
                        }
                }
                spin_unlock(&cache->lock);
+               mutex_unlock(&caching_ctl->mutex);
+
                wake_up(&caching_ctl->wait);
                if (ret == 1) {
                        put_caching_control(caching_ctl);