Commit 6bcd658f authored by Mikulas Patocka's avatar Mikulas Patocka Committed by Mike Snitzer
Browse files

dm kcopyd: avoid spin_lock_irqsave from process context



The functions "pop", "push_head", "do_work" can only be called from
process context. Therefore, replace spin_lock_irq{save,restore} with
spin_{lock,unlock}_irq.

Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent db2351eb
Loading
Loading
Loading
Loading
+6 −9
Original line number Original line Diff line number Diff line
@@ -437,9 +437,8 @@ static struct kcopyd_job *pop(struct list_head *jobs,
			      struct dm_kcopyd_client *kc)
			      struct dm_kcopyd_client *kc)
{
{
	struct kcopyd_job *job = NULL;
	struct kcopyd_job *job = NULL;
	unsigned long flags;


	spin_lock_irqsave(&kc->job_lock, flags);
	spin_lock_irq(&kc->job_lock);


	if (!list_empty(jobs)) {
	if (!list_empty(jobs)) {
		if (jobs == &kc->io_jobs)
		if (jobs == &kc->io_jobs)
@@ -449,7 +448,7 @@ static struct kcopyd_job *pop(struct list_head *jobs,
			list_del(&job->list);
			list_del(&job->list);
		}
		}
	}
	}
	spin_unlock_irqrestore(&kc->job_lock, flags);
	spin_unlock_irq(&kc->job_lock);


	return job;
	return job;
}
}
@@ -467,12 +466,11 @@ static void push(struct list_head *jobs, struct kcopyd_job *job)


static void push_head(struct list_head *jobs, struct kcopyd_job *job)
static void push_head(struct list_head *jobs, struct kcopyd_job *job)
{
{
	unsigned long flags;
	struct dm_kcopyd_client *kc = job->kc;
	struct dm_kcopyd_client *kc = job->kc;


	spin_lock_irqsave(&kc->job_lock, flags);
	spin_lock_irq(&kc->job_lock);
	list_add(&job->list, jobs);
	list_add(&job->list, jobs);
	spin_unlock_irqrestore(&kc->job_lock, flags);
	spin_unlock_irq(&kc->job_lock);
}
}


/*
/*
@@ -648,7 +646,6 @@ static void do_work(struct work_struct *work)
	struct dm_kcopyd_client *kc = container_of(work,
	struct dm_kcopyd_client *kc = container_of(work,
					struct dm_kcopyd_client, kcopyd_work);
					struct dm_kcopyd_client, kcopyd_work);
	struct blk_plug plug;
	struct blk_plug plug;
	unsigned long flags;


	/*
	/*
	 * The order that these are called is *very* important.
	 * The order that these are called is *very* important.
@@ -657,9 +654,9 @@ static void do_work(struct work_struct *work)
	 * list.  io jobs call wake when they complete and it all
	 * list.  io jobs call wake when they complete and it all
	 * starts again.
	 * starts again.
	 */
	 */
	spin_lock_irqsave(&kc->job_lock, flags);
	spin_lock_irq(&kc->job_lock);
	list_splice_tail_init(&kc->callback_jobs, &kc->complete_jobs);
	list_splice_tail_init(&kc->callback_jobs, &kc->complete_jobs);
	spin_unlock_irqrestore(&kc->job_lock, flags);
	spin_unlock_irq(&kc->job_lock);


	blk_start_plug(&plug);
	blk_start_plug(&plug);
	process_jobs(&kc->complete_jobs, kc, run_complete_job);
	process_jobs(&kc->complete_jobs, kc, run_complete_job);