Merge branch 'for-linus' into for-linus-3.12
This commit is contained in:
commit
1329dfc8bb
@ -107,7 +107,8 @@ static void check_idle_worker(struct btrfs_worker_thread *worker)
|
|||||||
worker->idle = 1;
|
worker->idle = 1;
|
||||||
|
|
||||||
/* the list may be empty if the worker is just starting */
|
/* 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,
|
list_move(&worker->worker_list,
|
||||||
&worker->workers->idle_list);
|
&worker->workers->idle_list);
|
||||||
}
|
}
|
||||||
@ -127,7 +128,8 @@ static void check_busy_worker(struct btrfs_worker_thread *worker)
|
|||||||
spin_lock_irqsave(&worker->workers->lock, flags);
|
spin_lock_irqsave(&worker->workers->lock, flags);
|
||||||
worker->idle = 0;
|
worker->idle = 0;
|
||||||
|
|
||||||
if (!list_empty(&worker->worker_list)) {
|
if (!list_empty(&worker->worker_list) &&
|
||||||
|
!worker->workers->stopping) {
|
||||||
list_move_tail(&worker->worker_list,
|
list_move_tail(&worker->worker_list,
|
||||||
&worker->workers->worker_list);
|
&worker->workers->worker_list);
|
||||||
}
|
}
|
||||||
@ -412,6 +414,7 @@ void btrfs_stop_workers(struct btrfs_workers *workers)
|
|||||||
int can_stop;
|
int can_stop;
|
||||||
|
|
||||||
spin_lock_irq(&workers->lock);
|
spin_lock_irq(&workers->lock);
|
||||||
|
workers->stopping = 1;
|
||||||
list_splice_init(&workers->idle_list, &workers->worker_list);
|
list_splice_init(&workers->idle_list, &workers->worker_list);
|
||||||
while (!list_empty(&workers->worker_list)) {
|
while (!list_empty(&workers->worker_list)) {
|
||||||
cur = workers->worker_list.next;
|
cur = workers->worker_list.next;
|
||||||
@ -455,6 +458,7 @@ void btrfs_init_workers(struct btrfs_workers *workers, char *name, int max,
|
|||||||
workers->ordered = 0;
|
workers->ordered = 0;
|
||||||
workers->atomic_start_pending = 0;
|
workers->atomic_start_pending = 0;
|
||||||
workers->atomic_worker_start = async_helper;
|
workers->atomic_worker_start = async_helper;
|
||||||
|
workers->stopping = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -480,15 +484,19 @@ static int __btrfs_start_workers(struct btrfs_workers *workers)
|
|||||||
atomic_set(&worker->num_pending, 0);
|
atomic_set(&worker->num_pending, 0);
|
||||||
atomic_set(&worker->refs, 1);
|
atomic_set(&worker->refs, 1);
|
||||||
worker->workers = workers;
|
worker->workers = workers;
|
||||||
worker->task = kthread_run(worker_loop, worker,
|
worker->task = kthread_create(worker_loop, worker,
|
||||||
"btrfs-%s-%d", workers->name,
|
"btrfs-%s-%d", workers->name,
|
||||||
workers->num_workers + 1);
|
workers->num_workers + 1);
|
||||||
if (IS_ERR(worker->task)) {
|
if (IS_ERR(worker->task)) {
|
||||||
ret = PTR_ERR(worker->task);
|
ret = PTR_ERR(worker->task);
|
||||||
kfree(worker);
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irq(&workers->lock);
|
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);
|
list_add_tail(&worker->worker_list, &workers->idle_list);
|
||||||
worker->idle = 1;
|
worker->idle = 1;
|
||||||
workers->num_workers++;
|
workers->num_workers++;
|
||||||
@ -496,8 +504,13 @@ static int __btrfs_start_workers(struct btrfs_workers *workers)
|
|||||||
WARN_ON(workers->num_workers_starting < 0);
|
WARN_ON(workers->num_workers_starting < 0);
|
||||||
spin_unlock_irq(&workers->lock);
|
spin_unlock_irq(&workers->lock);
|
||||||
|
|
||||||
|
wake_up_process(worker->task);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
fail_kthread:
|
||||||
|
kthread_stop(worker->task);
|
||||||
fail:
|
fail:
|
||||||
|
kfree(worker);
|
||||||
spin_lock_irq(&workers->lock);
|
spin_lock_irq(&workers->lock);
|
||||||
workers->num_workers_starting--;
|
workers->num_workers_starting--;
|
||||||
spin_unlock_irq(&workers->lock);
|
spin_unlock_irq(&workers->lock);
|
||||||
|
@ -107,6 +107,8 @@ struct btrfs_workers {
|
|||||||
|
|
||||||
/* extra name for this worker, used for current->name */
|
/* extra name for this worker, used for current->name */
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
|
int stopping;
|
||||||
};
|
};
|
||||||
|
|
||||||
void btrfs_queue_worker(struct btrfs_workers *workers, struct btrfs_work *work);
|
void btrfs_queue_worker(struct btrfs_workers *workers, struct btrfs_work *work);
|
||||||
|
@ -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);
|
list_add(&tgt_device->dev_alloc_list, &fs_info->fs_devices->alloc_list);
|
||||||
|
|
||||||
btrfs_rm_dev_replace_srcdev(fs_info, src_device);
|
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
|
* this is again a consistent state where no dev_replace procedure
|
||||||
* is running, the target device is part of the filesystem, the
|
* is running, the target device is part of the filesystem, the
|
||||||
|
@ -1614,7 +1614,7 @@ static noinline u64 find_lock_delalloc_range(struct inode *inode,
|
|||||||
*start = delalloc_start;
|
*start = delalloc_start;
|
||||||
*end = delalloc_end;
|
*end = delalloc_end;
|
||||||
free_extent_state(cached_state);
|
free_extent_state(cached_state);
|
||||||
return found;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1838,11 +1838,8 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
|
|||||||
assert_qgroups_uptodate(trans);
|
assert_qgroups_uptodate(trans);
|
||||||
update_super_roots(root);
|
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(root->fs_info->super_copy, 0);
|
btrfs_set_super_log_root_level(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,
|
memcpy(root->fs_info->super_for_commit, root->fs_info->super_copy,
|
||||||
sizeof(*root->fs_info->super_copy));
|
sizeof(*root->fs_info->super_copy));
|
||||||
|
|
||||||
|
@ -1716,6 +1716,7 @@ void btrfs_rm_dev_replace_srcdev(struct btrfs_fs_info *fs_info,
|
|||||||
struct btrfs_device *srcdev)
|
struct btrfs_device *srcdev)
|
||||||
{
|
{
|
||||||
WARN_ON(!mutex_is_locked(&fs_info->fs_devices->device_list_mutex));
|
WARN_ON(!mutex_is_locked(&fs_info->fs_devices->device_list_mutex));
|
||||||
|
|
||||||
list_del_rcu(&srcdev->dev_list);
|
list_del_rcu(&srcdev->dev_list);
|
||||||
list_del_rcu(&srcdev->dev_alloc_list);
|
list_del_rcu(&srcdev->dev_alloc_list);
|
||||||
fs_info->fs_devices->num_devices--;
|
fs_info->fs_devices->num_devices--;
|
||||||
@ -1725,9 +1726,13 @@ void btrfs_rm_dev_replace_srcdev(struct btrfs_fs_info *fs_info,
|
|||||||
}
|
}
|
||||||
if (srcdev->can_discard)
|
if (srcdev->can_discard)
|
||||||
fs_info->fs_devices->num_can_discard--;
|
fs_info->fs_devices->num_can_discard--;
|
||||||
if (srcdev->bdev)
|
if (srcdev->bdev) {
|
||||||
fs_info->fs_devices->open_devices--;
|
fs_info->fs_devices->open_devices--;
|
||||||
|
|
||||||
|
/* zero out the old super */
|
||||||
|
btrfs_scratch_superblock(srcdev);
|
||||||
|
}
|
||||||
|
|
||||||
call_rcu(&srcdev->rcu, free_device);
|
call_rcu(&srcdev->rcu, free_device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user