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

Commit 11b751ae authored by Ingo Molnar's avatar Ingo Molnar Committed by Ingo Molnar
Browse files

[PATCH] mutex subsystem, semaphore to completion: drivers/block/loop.c



convert the block loop device from semaphores to completions.

Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent f36d4024
Loading
Loading
Loading
Loading
+12 −15
Original line number Diff line number Diff line
@@ -527,12 +527,12 @@ static int loop_make_request(request_queue_t *q, struct bio *old_bio)
	lo->lo_pending++;
	loop_add_bio(lo, old_bio);
	spin_unlock_irq(&lo->lo_lock);
	up(&lo->lo_bh_mutex);
	complete(&lo->lo_bh_done);
	return 0;

out:
	if (lo->lo_pending == 0)
		up(&lo->lo_bh_mutex);
		complete(&lo->lo_bh_done);
	spin_unlock_irq(&lo->lo_lock);
	bio_io_error(old_bio, old_bio->bi_size);
	return 0;
@@ -593,23 +593,20 @@ static int loop_thread(void *data)
	lo->lo_pending = 1;

	/*
	 * up sem, we are running
	 * complete it, we are running
	 */
	up(&lo->lo_sem);
	complete(&lo->lo_done);

	for (;;) {
		int pending;

		/*
		 * interruptible just to not contribute to load avg
		 */
		if (down_interruptible(&lo->lo_bh_mutex))
		if (wait_for_completion_interruptible(&lo->lo_bh_done))
			continue;

		spin_lock_irq(&lo->lo_lock);

		/*
		 * could be upped because of tear-down, not pending work
		 * could be completed because of tear-down, not pending work
		 */
		if (unlikely(!lo->lo_pending)) {
			spin_unlock_irq(&lo->lo_lock);
@@ -632,7 +629,7 @@ static int loop_thread(void *data)
			break;
	}

	up(&lo->lo_sem);
	complete(&lo->lo_done);
	return 0;
}

@@ -843,7 +840,7 @@ static int loop_set_fd(struct loop_device *lo, struct file *lo_file,
	set_blocksize(bdev, lo_blocksize);

	kernel_thread(loop_thread, lo, CLONE_KERNEL);
	down(&lo->lo_sem);
	wait_for_completion(&lo->lo_done);
	return 0;

 out_putf:
@@ -909,10 +906,10 @@ static int loop_clr_fd(struct loop_device *lo, struct block_device *bdev)
	lo->lo_state = Lo_rundown;
	lo->lo_pending--;
	if (!lo->lo_pending)
		up(&lo->lo_bh_mutex);
		complete(&lo->lo_bh_done);
	spin_unlock_irq(&lo->lo_lock);

	down(&lo->lo_sem);
	wait_for_completion(&lo->lo_done);

	lo->lo_backing_file = NULL;

@@ -1289,8 +1286,8 @@ static int __init loop_init(void)
		if (!lo->lo_queue)
			goto out_mem4;
		init_MUTEX(&lo->lo_ctl_mutex);
		init_MUTEX_LOCKED(&lo->lo_sem);
		init_MUTEX_LOCKED(&lo->lo_bh_mutex);
		init_completion(&lo->lo_done);
		init_completion(&lo->lo_bh_done);
		lo->lo_number = i;
		spin_lock_init(&lo->lo_lock);
		disk->major = LOOP_MAJOR;
+2 −2
Original line number Diff line number Diff line
@@ -58,9 +58,9 @@ struct loop_device {
	struct bio 		*lo_bio;
	struct bio		*lo_biotail;
	int			lo_state;
	struct semaphore	lo_sem;
	struct completion	lo_done;
	struct completion	lo_bh_done;
	struct semaphore	lo_ctl_mutex;
	struct semaphore	lo_bh_mutex;
	int			lo_pending;

	request_queue_t		*lo_queue;