]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
blk: pass from_schedule to non-request unplug functions.
authorNeilBrown <neilb@suse.de>
Thu, 19 Jul 2012 10:49:56 +0000 (20:49 +1000)
committerNeilBrown <neilb@suse.de>
Thu, 19 Jul 2012 10:49:56 +0000 (20:49 +1000)
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>
block/blk-core.c
drivers/block/umem.c
drivers/md/md.c
drivers/md/md.h
include/linux/blkdev.h

index bf38a5b7dd0e575ea60bd774368727e300b96c09..c3b17c38664165af63c9b9e74a16a502dab8a3d7 100644 (file)
@@ -2896,7 +2896,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);
 
@@ -2908,7 +2908,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);
                }
        }
 }
@@ -2948,7 +2948,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 68ba19dcf4d9ab1b699e8f42f0918d45377cfb67..26988664616eb82d6fa3807770d7e141144f7846 100644 (file)
@@ -912,7 +912,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;