Commit d561c025 authored by Chris Mason's avatar Chris Mason Committed by David Woodhouse

Btrfs: very minimal locking

Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent 7f5c1516
...@@ -231,6 +231,7 @@ struct btrfs_fs_info { ...@@ -231,6 +231,7 @@ struct btrfs_fs_info {
struct buffer_head *sb_buffer; struct buffer_head *sb_buffer;
struct super_block *sb; struct super_block *sb;
struct mutex trans_mutex; struct mutex trans_mutex;
struct mutex fs_mutex;
}; };
/* /*
......
...@@ -116,6 +116,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, ...@@ -116,6 +116,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
fs_info->sb_buffer = sb_buffer; fs_info->sb_buffer = sb_buffer;
fs_info->sb = sb; fs_info->sb = sb;
mutex_init(&fs_info->trans_mutex); 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->current_insert, 0, sizeof(fs_info->current_insert));
memset(&fs_info->last_insert, 0, sizeof(fs_info->last_insert)); memset(&fs_info->last_insert, 0, sizeof(fs_info->last_insert));
......
...@@ -168,9 +168,10 @@ static int pin_down_block(struct btrfs_root *root, u64 blocknr, int tag) ...@@ -168,9 +168,10 @@ static int pin_down_block(struct btrfs_root *root, u64 blocknr, int tag)
BUG_ON(!bh); BUG_ON(!bh);
err = radix_tree_insert(&root->fs_info->pinned_radix, err = radix_tree_insert(&root->fs_info->pinned_radix,
blocknr, bh); blocknr, bh);
BUG_ON(err); if (err && err != -EEXIST) {
if (err) BUG();
return err; return err;
}
radix_tree_tag_set(&root->fs_info->pinned_radix, blocknr, radix_tree_tag_set(&root->fs_info->pinned_radix, blocknr,
tag); tag);
return 0; return 0;
......
...@@ -453,25 +453,21 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, ...@@ -453,25 +453,21 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,
struct inode *inode; struct inode *inode;
int err; int err;
mutex_lock(&root->fs_info->fs_mutex);
trans = btrfs_start_transaction(root, 1); trans = btrfs_start_transaction(root, 1);
inode = btrfs_new_inode(trans, dir, mode); inode = btrfs_new_inode(trans, dir, mode);
err = PTR_ERR(inode); err = PTR_ERR(inode);
if (IS_ERR(inode)) if (IS_ERR(inode))
return err; goto out_unlock;
// FIXME mark the inode dirty // FIXME mark the inode dirty
err = btrfs_add_nondir(trans, dentry, inode); err = btrfs_add_nondir(trans, dentry, inode);
dir->i_sb->s_dirt = 1; dir->i_sb->s_dirt = 1;
btrfs_end_transaction(trans, root); btrfs_end_transaction(trans, root);
out_unlock:
mutex_unlock(&root->fs_info->fs_mutex);
return err; 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) static int btrfs_sync_fs(struct super_block *sb, int wait)
{ {
struct btrfs_trans_handle *trans; struct btrfs_trans_handle *trans;
...@@ -479,17 +475,29 @@ static int btrfs_sync_fs(struct super_block *sb, int wait) ...@@ -479,17 +475,29 @@ static int btrfs_sync_fs(struct super_block *sb, int wait)
int ret; int ret;
sb->s_dirt = 0; 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); root = btrfs_sb(sb);
mutex_lock(&root->fs_info->fs_mutex);
trans = btrfs_start_transaction(root, 1); trans = btrfs_start_transaction(root, 1);
ret = btrfs_commit_transaction(trans, root); ret = btrfs_commit_transaction(trans, root);
sb->s_dirt = 0; sb->s_dirt = 0;
BUG_ON(ret); BUG_ON(ret);
printk("btrfs sync_fs\n"); printk("btrfs sync_fs\n");
mutex_unlock(&root->fs_info->fs_mutex);
return 0; 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, static int btrfs_get_sb(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data, struct vfsmount *mnt) int flags, const char *dev_name, void *data, struct vfsmount *mnt)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment