···527527 lo->lo_pending++;528528 loop_add_bio(lo, old_bio);529529 spin_unlock_irq(&lo->lo_lock);530530- up(&lo->lo_bh_mutex);530530+ complete(&lo->lo_bh_done);531531 return 0;532532533533out:534534 if (lo->lo_pending == 0)535535- up(&lo->lo_bh_mutex);535535+ complete(&lo->lo_bh_done);536536 spin_unlock_irq(&lo->lo_lock);537537 bio_io_error(old_bio, old_bio->bi_size);538538 return 0;···593593 lo->lo_pending = 1;594594595595 /*596596- * up sem, we are running596596+ * complete it, we are running597597 */598598- up(&lo->lo_sem);598598+ complete(&lo->lo_done);599599600600 for (;;) {601601 int pending;602602603603- /*604604- * interruptible just to not contribute to load avg605605- */606606- if (down_interruptible(&lo->lo_bh_mutex))603603+ if (wait_for_completion_interruptible(&lo->lo_bh_done))607604 continue;608605609606 spin_lock_irq(&lo->lo_lock);610607611608 /*612612- * could be upped because of tear-down, not pending work609609+ * could be completed because of tear-down, not pending work613610 */614611 if (unlikely(!lo->lo_pending)) {615612 spin_unlock_irq(&lo->lo_lock);···629632 break;630633 }631634632632- up(&lo->lo_sem);635635+ complete(&lo->lo_done);633636 return 0;634637}635638···840843 set_blocksize(bdev, lo_blocksize);841844842845 kernel_thread(loop_thread, lo, CLONE_KERNEL);843843- down(&lo->lo_sem);846846+ wait_for_completion(&lo->lo_done);844847 return 0;845848846849 out_putf:···906909 lo->lo_state = Lo_rundown;907910 lo->lo_pending--;908911 if (!lo->lo_pending)909909- up(&lo->lo_bh_mutex);912912+ complete(&lo->lo_bh_done);910913 spin_unlock_irq(&lo->lo_lock);911914912912- down(&lo->lo_sem);915915+ wait_for_completion(&lo->lo_done);913916914917 lo->lo_backing_file = NULL;915918···12861289 if (!lo->lo_queue)12871290 goto out_mem4;12881291 init_MUTEX(&lo->lo_ctl_mutex);12891289- init_MUTEX_LOCKED(&lo->lo_sem);12901290- init_MUTEX_LOCKED(&lo->lo_bh_mutex);12921292+ init_completion(&lo->lo_done);12931293+ init_completion(&lo->lo_bh_done);12911294 lo->lo_number = i;12921295 spin_lock_init(&lo->lo_lock);12931296 disk->major = LOOP_MAJOR;
+2-2
include/linux/loop.h
···5858 struct bio *lo_bio;5959 struct bio *lo_biotail;6060 int lo_state;6161- struct semaphore lo_sem;6161+ struct completion lo_done;6262+ struct completion lo_bh_done;6263 struct semaphore lo_ctl_mutex;6363- struct semaphore lo_bh_mutex;6464 int lo_pending;65656666 request_queue_t *lo_queue;