]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/block/umem.c
blk: pass from_schedule to non-request unplug functions.
[mirror_ubuntu-artful-kernel.git] / drivers / block / umem.c
index aa2712060bfbcd153e446f5adcf80a9d61377e75..eb0d8216f557434b36e6fbc809b75c33bbbc1292 100644 (file)
@@ -513,6 +513,21 @@ static void process_page(unsigned long data)
        }
 }
 
+static void mm_unplug(struct blk_plug_cb *cb, bool from_schedule)
+{
+       struct cardinfo *card = cb->data;
+
+       spin_lock_irq(&card->lock);
+       activate(card);
+       spin_unlock_irq(&card->lock);
+       kfree(cb);
+}
+
+static int mm_check_plugged(struct cardinfo *card)
+{
+       return !!blk_check_plugged(mm_unplug, card, sizeof(struct blk_plug_cb));
+}
+
 static void mm_make_request(struct request_queue *q, struct bio *bio)
 {
        struct cardinfo *card = q->queuedata;
@@ -523,6 +538,8 @@ static void mm_make_request(struct request_queue *q, struct bio *bio)
        *card->biotail = bio;
        bio->bi_next = NULL;
        card->biotail = &bio->bi_next;
+       if (bio->bi_rw & REQ_SYNC || !mm_check_plugged(card))
+               activate(card);
        spin_unlock_irq(&card->lock);
 
        return;