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

Commit ec6a8679 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable:
  Btrfs: be more polite in the async caching threads
  Btrfs: preserve commit_root for async caching
parents db06816c f36f3042
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -825,6 +825,7 @@ struct btrfs_fs_info {
	struct mutex drop_mutex;
	struct mutex volume_mutex;
	struct mutex tree_reloc_mutex;
	struct rw_semaphore extent_commit_sem;

	/*
	 * this protects the ordered operations list only while we are
@@ -959,9 +960,6 @@ struct btrfs_root {
	/* the node lock is held while changing the node pointer */
	spinlock_t node_lock;

	/* taken when updating the commit root */
	struct rw_semaphore commit_root_sem;

	struct extent_buffer *commit_root;
	struct btrfs_root *log_root;
	struct btrfs_root *reloc_root;
+1 −1
Original line number Diff line number Diff line
@@ -909,7 +909,6 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize,
	spin_lock_init(&root->inode_lock);
	mutex_init(&root->objectid_mutex);
	mutex_init(&root->log_mutex);
	init_rwsem(&root->commit_root_sem);
	init_waitqueue_head(&root->log_writer_wait);
	init_waitqueue_head(&root->log_commit_wait[0]);
	init_waitqueue_head(&root->log_commit_wait[1]);
@@ -1640,6 +1639,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
	mutex_init(&fs_info->cleaner_mutex);
	mutex_init(&fs_info->volume_mutex);
	mutex_init(&fs_info->tree_reloc_mutex);
	init_rwsem(&fs_info->extent_commit_sem);

	btrfs_init_free_cluster(&fs_info->meta_alloc_cluster);
	btrfs_init_free_cluster(&fs_info->data_alloc_cluster);
+6 −5
Original line number Diff line number Diff line
@@ -267,7 +267,7 @@ static int caching_kthread(void *data)
	last = max_t(u64, block_group->key.objectid, BTRFS_SUPER_INFO_OFFSET);
again:
	/* need to make sure the commit_root doesn't disappear */
	down_read(&fs_info->extent_root->commit_root_sem);
	down_read(&fs_info->extent_commit_sem);

	/*
	 * We don't want to deadlock with somebody trying to allocate a new
@@ -302,10 +302,11 @@ static int caching_kthread(void *data)
			else if (ret)
				break;

			if (need_resched()) {
			if (need_resched() ||
			    btrfs_transaction_in_commit(fs_info)) {
				btrfs_release_path(fs_info->extent_root, path);
				up_read(&fs_info->extent_root->commit_root_sem);
				cond_resched();
				up_read(&fs_info->extent_commit_sem);
				schedule_timeout(1);
				goto again;
			}

@@ -345,7 +346,7 @@ static int caching_kthread(void *data)

err:
	btrfs_free_path(path);
	up_read(&fs_info->extent_root->commit_root_sem);
	up_read(&fs_info->extent_commit_sem);
	atomic_dec(&block_group->space_info->caching_threads);
	wake_up(&block_group->caching_q);

+19 −3
Original line number Diff line number Diff line
@@ -42,10 +42,8 @@ static noinline void put_transaction(struct btrfs_transaction *transaction)

static noinline void switch_commit_root(struct btrfs_root *root)
{
	down_write(&root->commit_root_sem);
	free_extent_buffer(root->commit_root);
	root->commit_root = btrfs_root_node(root);
	up_write(&root->commit_root_sem);
}

/*
@@ -466,7 +464,10 @@ static int update_cowonly_root(struct btrfs_trans_handle *trans,
		ret = btrfs_write_dirty_block_groups(trans, root);
		BUG_ON(ret);
	}

	if (root != root->fs_info->extent_root)
		switch_commit_root(root);

	return 0;
}

@@ -499,6 +500,11 @@ static noinline int commit_cowonly_roots(struct btrfs_trans_handle *trans,

		update_cowonly_root(trans, root);
	}

	down_write(&fs_info->extent_commit_sem);
	switch_commit_root(fs_info->extent_root);
	up_write(&fs_info->extent_commit_sem);

	return 0;
}

@@ -851,6 +857,16 @@ static void update_super_roots(struct btrfs_root *root)
	super->root_level = root_item->level;
}

int btrfs_transaction_in_commit(struct btrfs_fs_info *info)
{
	int ret = 0;
	spin_lock(&info->new_trans_lock);
	if (info->running_transaction)
		ret = info->running_transaction->in_commit;
	spin_unlock(&info->new_trans_lock);
	return ret;
}

int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
			     struct btrfs_root *root)
{
+1 −0
Original line number Diff line number Diff line
@@ -107,4 +107,5 @@ int btrfs_record_root_in_trans(struct btrfs_trans_handle *trans,
				struct btrfs_root *root);
int btrfs_write_and_wait_marked_extents(struct btrfs_root *root,
					struct extent_io_tree *dirty_pages);
int btrfs_transaction_in_commit(struct btrfs_fs_info *info);
#endif