Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

Btrfs: very minimal locking

parent 7f5c1516
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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;
};

/*
+1 −0
Original line number Diff line number Diff line
@@ -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));

+3 −2
Original line number Diff line number Diff line
@@ -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;
+17 −9
Original line number Diff line number Diff line
@@ -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;
	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)
{