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;
        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);
                        break;
        }
 
-       up(&lo->lo_sem);
+       complete(&lo->lo_done);
        return 0;
 }
 
        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:
        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;
 
                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;