Btrfs: very minimal locking
authorChris Mason <chris.mason@oracle.com>
Fri, 23 Mar 2007 23:47:49 +0000 (19:47 -0400)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Fri, 23 Mar 2007 23:47:49 +0000 (19:47 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ctree.h
fs/btrfs/disk-io.c
fs/btrfs/extent-tree.c
fs/btrfs/super.c

index 96cec6352f12dde649d55265a7f6b44308dc520a..68cafae6a85045cddcf7958a4999d2174e2686dd 100644 (file)
@@ -231,6 +231,7 @@ struct btrfs_fs_info {
        struct buffer_head *sb_buffer;
        struct super_block *sb;
        struct mutex trans_mutex;
+       struct mutex fs_mutex;
 };
 
 /*
index 3dea757d4cbbc6465877e96d4890de8a84ad54e8..e32ddff55b0ebb25d5cfddf05eaf57a532a633bb 100644 (file)
@@ -116,6 +116,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
        fs_info->sb_buffer = sb_buffer;
        fs_info->sb = sb;
        mutex_init(&fs_info->trans_mutex);
+       mutex_init(&fs_info->fs_mutex);
        memset(&fs_info->current_insert, 0, sizeof(fs_info->current_insert));
        memset(&fs_info->last_insert, 0, sizeof(fs_info->last_insert));
 
index c86f0e6152f2799a727940f2abe9f26e0eb00046..9583a9ae8b798d8ca7fd664d5ab2bee771994adc 100644 (file)
@@ -168,9 +168,10 @@ static int pin_down_block(struct btrfs_root *root, u64 blocknr, int tag)
        BUG_ON(!bh);
        err = radix_tree_insert(&root->fs_info->pinned_radix,
                                blocknr, bh);
-       BUG_ON(err);
-       if (err)
+       if (err && err != -EEXIST) {
+               BUG();
                return err;
+       }
        radix_tree_tag_set(&root->fs_info->pinned_radix, blocknr,
                           tag);
        return 0;
index a2db05594695ea37c11f3e4ab1cb16fd84f35b62..0ca1080e0198ae662819400e74ecf277826f268f 100644 (file)
@@ -453,25 +453,21 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,
        struct inode *inode;
        int err;
 
+       mutex_lock(&root->fs_info->fs_mutex);
        trans = btrfs_start_transaction(root, 1);
        inode = btrfs_new_inode(trans, dir, mode);
        err = PTR_ERR(inode);
        if (IS_ERR(inode))
-               return err;
+               goto out_unlock;
        // FIXME mark the inode dirty
        err = btrfs_add_nondir(trans, dentry, inode);
        dir->i_sb->s_dirt = 1;
        btrfs_end_transaction(trans, root);
+out_unlock:
+       mutex_unlock(&root->fs_info->fs_mutex);
        return err;
 }
 
-static void btrfs_write_super(struct super_block *sb)
-{
-       sb->s_dirt = 0;
-printk("btrfs write_super!\n");
-       filemap_flush(sb->s_bdev->bd_inode->i_mapping);
-}
-
 static int btrfs_sync_fs(struct super_block *sb, int wait)
 {
        struct btrfs_trans_handle *trans;
@@ -479,17 +475,29 @@ static int btrfs_sync_fs(struct super_block *sb, int wait)
        int ret;
 
        sb->s_dirt = 0;
-       return 0;
+       if (!wait) {
+               filemap_flush(sb->s_bdev->bd_inode->i_mapping);
+               return 0;
+       }
+       filemap_write_and_wait(sb->s_bdev->bd_inode->i_mapping);
 
        root = btrfs_sb(sb);
+       mutex_lock(&root->fs_info->fs_mutex);
        trans = btrfs_start_transaction(root, 1);
        ret = btrfs_commit_transaction(trans, root);
        sb->s_dirt = 0;
        BUG_ON(ret);
 printk("btrfs sync_fs\n");
+       mutex_unlock(&root->fs_info->fs_mutex);
        return 0;
 }
 
+static void btrfs_write_super(struct super_block *sb)
+{
+       btrfs_sync_fs(sb, 1);
+}
+
+
 static int btrfs_get_sb(struct file_system_type *fs_type,
        int flags, const char *dev_name, void *data, struct vfsmount *mnt)
 {