Btrfs: fix unlock in __start_delalloc_inodes()
authorWang Shilong <wangsl.fnst@cn.fujitsu.com>
Wed, 2 Apr 2014 11:53:32 +0000 (19:53 +0800)
committerChris Mason <clm@fb.com>
Mon, 7 Apr 2014 16:08:50 +0000 (09:08 -0700)
This patch fix a regression caused by the following patch:
Btrfs: don't flush all delalloc inodes when we doesn't get s_umount lock

break while loop will make us call @spin_unlock() without
calling @spin_lock() before, fix it.

Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com>
Reviewed-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/inode.c

index fdb8f4486e854c5568c6a47337f4cc47aa35978f..0c0bb450cbba6f6514ab6d4d4c2a1448ef9d9a4c 100644 (file)
@@ -8500,19 +8500,20 @@ static int __start_delalloc_inodes(struct btrfs_root *root, int delay_iput,
                        else
                                iput(inode);
                        ret = -ENOMEM;
-                       break;
+                       goto out;
                }
                list_add_tail(&work->list, &works);
                btrfs_queue_work(root->fs_info->flush_workers,
                                 &work->work);
                ret++;
                if (nr != -1 && ret >= nr)
-                       break;
+                       goto out;
                cond_resched();
                spin_lock(&root->delalloc_lock);
        }
        spin_unlock(&root->delalloc_lock);
 
+out:
        list_for_each_entry_safe(work, next, &works, list) {
                list_del_init(&work->list);
                btrfs_wait_and_free_delalloc_work(work);