blk: pass from_schedule to non-request unplug functions.
authorNeilBrown <neilb@suse.de>
Tue, 31 Jul 2012 07:08:15 +0000 (09:08 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 31 Jul 2012 07:08:15 +0000 (09:08 +0200)
This will allow md/raid to know why the unplug was called,
and will be able to act according - if !from_schedule it
is safe to perform tasks which could themselves schedule.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-core.c
drivers/block/umem.c
drivers/md/md.c
drivers/md/md.h
include/linux/blkdev.h

index 35bf4fe8234ca32b136c55a4c2cd9339d0adfbf9..4b4dbdfbca89fe5769fd4b2f6826f305fca18e26 100644 (file)
@@ -2909,7 +2909,7 @@ static void queue_unplugged(struct request_queue *q, unsigned int depth,
 
 }
 
-static void flush_plug_callbacks(struct blk_plug *plug)
+static void flush_plug_callbacks(struct blk_plug *plug, bool from_schedule)
 {
        LIST_HEAD(callbacks);
 
@@ -2921,7 +2921,7 @@ static void flush_plug_callbacks(struct blk_plug *plug)
                                                          struct blk_plug_cb,
                                                          list);
                        list_del(&cb->list);
-                       cb->callback(cb);
+                       cb->callback(cb, from_schedule);
                }
        }
 }
@@ -2961,7 +2961,7 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule)
 
        BUG_ON(plug->magic != PLUG_MAGIC);
 
-       flush_plug_callbacks(plug);
+       flush_plug_callbacks(plug, from_schedule);
        if (list_empty(&plug->list))
                return;
 
index 6ef3489568e3a7c869dd8a505339640d4ad9fdaa..eb0d8216f557434b36e6fbc809b75c33bbbc1292 100644 (file)
@@ -513,7 +513,7 @@ static void process_page(unsigned long data)
        }
 }
 
-static void mm_unplug(struct blk_plug_cb *cb)
+static void mm_unplug(struct blk_plug_cb *cb, bool from_schedule)
 {
        struct cardinfo *card = cb->data;
 
index b493fa4173875e667d218fcd7b32eec7baf83913..db02d2efb76f943185ec0d4101c4913fe0b3a41e 100644 (file)
@@ -498,7 +498,7 @@ void md_flush_request(struct mddev *mddev, struct bio *bio)
 }
 EXPORT_SYMBOL(md_flush_request);
 
-void md_unplug(struct blk_plug_cb *cb)
+void md_unplug(struct blk_plug_cb *cb, bool from_schedule)
 {
        struct mddev *mddev = cb->data;
        md_wakeup_thread(mddev->thread);
index 8f998e08fb8760d1aae86338c3b72c04e6979a1d..f385b038589d32313014e07af203b8f742bec4a7 100644 (file)
@@ -629,7 +629,7 @@ extern struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
                                   struct mddev *mddev);
 extern void md_trim_bio(struct bio *bio, int offset, int size);
 
-extern void md_unplug(struct blk_plug_cb *cb);
+extern void md_unplug(struct blk_plug_cb *cb, bool from_schedule);
 static inline int mddev_check_plugged(struct mddev *mddev)
 {
        return !!blk_check_plugged(md_unplug, mddev,
index 607ca228f47e416292c5543bc877c9de763b969c..4e72a9d48232d513b5b2fe44d973de8dfeb1e9e4 100644 (file)
@@ -923,7 +923,7 @@ struct blk_plug {
 #define BLK_MAX_REQUEST_COUNT 16
 
 struct blk_plug_cb;
-typedef void (*blk_plug_cb_fn)(struct blk_plug_cb *);
+typedef void (*blk_plug_cb_fn)(struct blk_plug_cb *, bool);
 struct blk_plug_cb {
        struct list_head list;
        blk_plug_cb_fn callback;