Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 167257
b: refs/heads/master
c: e3ccfa9
h: refs/heads/master
i:
  167255: 6421089
v: v3
  • Loading branch information
Josef Bacik authored and Chris Mason committed Oct 8, 2009
1 parent f68a174 commit 3923b21
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 12 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 32c00aff718bb54a214b39146bdd9ac01511cd25
refs/heads/master: e3ccfa989752c083ceb23c823a84f7ce3a081e61
13 changes: 7 additions & 6 deletions trunk/fs/btrfs/ctree.h
Original file line number Diff line number Diff line change
Expand Up @@ -691,17 +691,17 @@ struct btrfs_space_info {

struct list_head list;

/* for controlling how we free up space for allocations */
wait_queue_head_t allocate_wait;
wait_queue_head_t flush_wait;
int allocating_chunk;
int flushing;

/* for block groups in our same type */
struct list_head block_groups;
spinlock_t lock;
struct rw_semaphore groups_sem;
atomic_t caching_threads;

int allocating_chunk;
wait_queue_head_t wait;

int flushing;
wait_queue_head_t flush_wait;
};

/*
Expand Down Expand Up @@ -918,6 +918,7 @@ struct btrfs_fs_info {
struct btrfs_workers endio_meta_write_workers;
struct btrfs_workers endio_write_workers;
struct btrfs_workers submit_workers;
struct btrfs_workers enospc_workers;
/*
* fixup workers take dirty pages that didn't properly go through
* the cow mechanism and make them safe to write. It happens
Expand Down
6 changes: 6 additions & 0 deletions trunk/fs/btrfs/disk-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -1762,6 +1762,9 @@ struct btrfs_root *open_ctree(struct super_block *sb,
min_t(u64, fs_devices->num_devices,
fs_info->thread_pool_size),
&fs_info->generic_worker);
btrfs_init_workers(&fs_info->enospc_workers, "enospc",
fs_info->thread_pool_size,
&fs_info->generic_worker);

/* a higher idle thresh on the submit workers makes it much more
* likely that bios will be send down in a sane order to the
Expand Down Expand Up @@ -1809,6 +1812,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
btrfs_start_workers(&fs_info->endio_meta_workers, 1);
btrfs_start_workers(&fs_info->endio_meta_write_workers, 1);
btrfs_start_workers(&fs_info->endio_write_workers, 1);
btrfs_start_workers(&fs_info->enospc_workers, 1);

fs_info->bdi.ra_pages *= btrfs_super_num_devices(disk_super);
fs_info->bdi.ra_pages = max(fs_info->bdi.ra_pages,
Expand Down Expand Up @@ -2023,6 +2027,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
btrfs_stop_workers(&fs_info->endio_meta_write_workers);
btrfs_stop_workers(&fs_info->endio_write_workers);
btrfs_stop_workers(&fs_info->submit_workers);
btrfs_stop_workers(&fs_info->enospc_workers);
fail_iput:
invalidate_inode_pages2(fs_info->btree_inode->i_mapping);
iput(fs_info->btree_inode);
Expand Down Expand Up @@ -2449,6 +2454,7 @@ int close_ctree(struct btrfs_root *root)
btrfs_stop_workers(&fs_info->endio_meta_write_workers);
btrfs_stop_workers(&fs_info->endio_write_workers);
btrfs_stop_workers(&fs_info->submit_workers);
btrfs_stop_workers(&fs_info->enospc_workers);

btrfs_close_devices(fs_info->fs_devices);
btrfs_mapping_tree_free(&fs_info->mapping_tree);
Expand Down
80 changes: 75 additions & 5 deletions trunk/fs/btrfs/extent-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -2866,9 +2866,66 @@ static void check_force_delalloc(struct btrfs_space_info *meta_sinfo)
meta_sinfo->force_delalloc = 0;
}

struct async_flush {
struct btrfs_root *root;
struct btrfs_space_info *info;
struct btrfs_work work;
};

static noinline void flush_delalloc_async(struct btrfs_work *work)
{
struct async_flush *async;
struct btrfs_root *root;
struct btrfs_space_info *info;

async = container_of(work, struct async_flush, work);
root = async->root;
info = async->info;

btrfs_start_delalloc_inodes(root);
wake_up(&info->flush_wait);
btrfs_wait_ordered_extents(root, 0);

spin_lock(&info->lock);
info->flushing = 0;
spin_unlock(&info->lock);
wake_up(&info->flush_wait);

kfree(async);
}

static void wait_on_flush(struct btrfs_space_info *info)
{
DEFINE_WAIT(wait);
u64 used;

while (1) {
prepare_to_wait(&info->flush_wait, &wait,
TASK_UNINTERRUPTIBLE);
spin_lock(&info->lock);
if (!info->flushing) {
spin_unlock(&info->lock);
break;
}

used = info->bytes_used + info->bytes_reserved +
info->bytes_pinned + info->bytes_readonly +
info->bytes_super + info->bytes_root +
info->bytes_may_use + info->bytes_delalloc;
if (used < info->total_bytes) {
spin_unlock(&info->lock);
break;
}
spin_unlock(&info->lock);
schedule();
}
finish_wait(&info->flush_wait, &wait);
}

static void flush_delalloc(struct btrfs_root *root,
struct btrfs_space_info *info)
{
struct async_flush *async;
bool wait = false;

spin_lock(&info->lock);
Expand All @@ -2883,11 +2940,24 @@ static void flush_delalloc(struct btrfs_root *root,
spin_unlock(&info->lock);

if (wait) {
wait_event(info->flush_wait,
!info->flushing);
wait_on_flush(info);
return;
}

async = kzalloc(sizeof(*async), GFP_NOFS);
if (!async)
goto flush;

async->root = root;
async->info = info;
async->work.func = flush_delalloc_async;

btrfs_queue_worker(&root->fs_info->enospc_workers,
&async->work);
wait_on_flush(info);
return;

flush:
btrfs_start_delalloc_inodes(root);
btrfs_wait_ordered_extents(root, 0);

Expand Down Expand Up @@ -2927,15 +2997,15 @@ static int maybe_allocate_chunk(struct btrfs_root *root,
if (!info->allocating_chunk) {
info->force_alloc = 1;
info->allocating_chunk = 1;
init_waitqueue_head(&info->wait);
init_waitqueue_head(&info->allocate_wait);
} else {
wait = true;
}

spin_unlock(&info->lock);

if (wait) {
wait_event(info->wait,
wait_event(info->allocate_wait,
!info->allocating_chunk);
return 1;
}
Expand All @@ -2956,7 +3026,7 @@ static int maybe_allocate_chunk(struct btrfs_root *root,
spin_lock(&info->lock);
info->allocating_chunk = 0;
spin_unlock(&info->lock);
wake_up(&info->wait);
wake_up(&info->allocate_wait);

if (ret)
return 0;
Expand Down

0 comments on commit 3923b21

Please sign in to comment.