Skip to content

Commit

Permalink
Merge branch 'for-linus' into for-linus-3.12
Browse files Browse the repository at this point in the history
  • Loading branch information
Chris Mason committed Oct 5, 2013
2 parents 15c03dd + 1357272 commit 1329dfc
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 17 deletions.
25 changes: 19 additions & 6 deletions fs/btrfs/async-thread.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,8 @@ static void check_idle_worker(struct btrfs_worker_thread *worker)
worker->idle = 1;

/* the list may be empty if the worker is just starting */
if (!list_empty(&worker->worker_list)) {
if (!list_empty(&worker->worker_list) &&
!worker->workers->stopping) {
list_move(&worker->worker_list,
&worker->workers->idle_list);
}
Expand All @@ -127,7 +128,8 @@ static void check_busy_worker(struct btrfs_worker_thread *worker)
spin_lock_irqsave(&worker->workers->lock, flags);
worker->idle = 0;

if (!list_empty(&worker->worker_list)) {
if (!list_empty(&worker->worker_list) &&
!worker->workers->stopping) {
list_move_tail(&worker->worker_list,
&worker->workers->worker_list);
}
Expand Down Expand Up @@ -412,6 +414,7 @@ void btrfs_stop_workers(struct btrfs_workers *workers)
int can_stop;

spin_lock_irq(&workers->lock);
workers->stopping = 1;
list_splice_init(&workers->idle_list, &workers->worker_list);
while (!list_empty(&workers->worker_list)) {
cur = workers->worker_list.next;
Expand Down Expand Up @@ -455,6 +458,7 @@ void btrfs_init_workers(struct btrfs_workers *workers, char *name, int max,
workers->ordered = 0;
workers->atomic_start_pending = 0;
workers->atomic_worker_start = async_helper;
workers->stopping = 0;
}

/*
Expand All @@ -480,24 +484,33 @@ static int __btrfs_start_workers(struct btrfs_workers *workers)
atomic_set(&worker->num_pending, 0);
atomic_set(&worker->refs, 1);
worker->workers = workers;
worker->task = kthread_run(worker_loop, worker,
"btrfs-%s-%d", workers->name,
workers->num_workers + 1);
worker->task = kthread_create(worker_loop, worker,
"btrfs-%s-%d", workers->name,
workers->num_workers + 1);
if (IS_ERR(worker->task)) {
ret = PTR_ERR(worker->task);
kfree(worker);
goto fail;
}

spin_lock_irq(&workers->lock);
if (workers->stopping) {
spin_unlock_irq(&workers->lock);
goto fail_kthread;
}
list_add_tail(&worker->worker_list, &workers->idle_list);
worker->idle = 1;
workers->num_workers++;
workers->num_workers_starting--;
WARN_ON(workers->num_workers_starting < 0);
spin_unlock_irq(&workers->lock);

wake_up_process(worker->task);
return 0;

fail_kthread:
kthread_stop(worker->task);
fail:
kfree(worker);
spin_lock_irq(&workers->lock);
workers->num_workers_starting--;
spin_unlock_irq(&workers->lock);
Expand Down
2 changes: 2 additions & 0 deletions fs/btrfs/async-thread.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,8 @@ struct btrfs_workers {

/* extra name for this worker, used for current->name */
char *name;

int stopping;
};

void btrfs_queue_worker(struct btrfs_workers *workers, struct btrfs_work *work);
Expand Down
5 changes: 1 addition & 4 deletions fs/btrfs/dev-replace.c
Original file line number Diff line number Diff line change
Expand Up @@ -535,10 +535,7 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,
list_add(&tgt_device->dev_alloc_list, &fs_info->fs_devices->alloc_list);

btrfs_rm_dev_replace_srcdev(fs_info, src_device);
if (src_device->bdev) {
/* zero out the old super */
btrfs_scratch_superblock(src_device);
}

/*
* this is again a consistent state where no dev_replace procedure
* is running, the target device is part of the filesystem, the
Expand Down
2 changes: 1 addition & 1 deletion fs/btrfs/extent_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -1614,7 +1614,7 @@ static noinline u64 find_lock_delalloc_range(struct inode *inode,
*start = delalloc_start;
*end = delalloc_end;
free_extent_state(cached_state);
return found;
return 0;
}

/*
Expand Down
7 changes: 2 additions & 5 deletions fs/btrfs/transaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -1838,11 +1838,8 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
assert_qgroups_uptodate(trans);
update_super_roots(root);

if (!root->fs_info->log_root_recovering) {
btrfs_set_super_log_root(root->fs_info->super_copy, 0);
btrfs_set_super_log_root_level(root->fs_info->super_copy, 0);
}

btrfs_set_super_log_root(root->fs_info->super_copy, 0);
btrfs_set_super_log_root_level(root->fs_info->super_copy, 0);
memcpy(root->fs_info->super_for_commit, root->fs_info->super_copy,
sizeof(*root->fs_info->super_copy));

Expand Down
7 changes: 6 additions & 1 deletion fs/btrfs/volumes.c
Original file line number Diff line number Diff line change
Expand Up @@ -1716,6 +1716,7 @@ void btrfs_rm_dev_replace_srcdev(struct btrfs_fs_info *fs_info,
struct btrfs_device *srcdev)
{
WARN_ON(!mutex_is_locked(&fs_info->fs_devices->device_list_mutex));

list_del_rcu(&srcdev->dev_list);
list_del_rcu(&srcdev->dev_alloc_list);
fs_info->fs_devices->num_devices--;
Expand All @@ -1725,9 +1726,13 @@ void btrfs_rm_dev_replace_srcdev(struct btrfs_fs_info *fs_info,
}
if (srcdev->can_discard)
fs_info->fs_devices->num_can_discard--;
if (srcdev->bdev)
if (srcdev->bdev) {
fs_info->fs_devices->open_devices--;

/* zero out the old super */
btrfs_scratch_superblock(srcdev);
}

call_rcu(&srcdev->rcu, free_device);
}

Expand Down

0 comments on commit 1329dfc

Please sign in to comment.