NeilBrown 9df69e
From: NeilBrown <neilb@suse.de>
NeilBrown 9df69e
Subject: kabi for for md: improve handling of bio with REQ_PREFLUSH in md_flush_request()
NeilBrown 9df69e
Patch-mainline: never, kabi
NeilBrown 9df69e
References: git-fixes
NeilBrown 9df69e
NeilBrown 9df69e
1/ Don't mark 'make_request' method as '__must_check'
NeilBrown 9df69e
NeilBrown 9df69e
2/ Instead of changing return value of md_flush_request(),
NeilBrown 9df69e
  create a new md_flush_request2(), and leave md_flush_request()
NeilBrown 9df69e
  with the old (slughtly buggy) behaviour.
NeilBrown 9df69e
NeilBrown 9df69e
Signed-off-by: NeilBrown <neilb@suse.de>
NeilBrown 9df69e
---
NeilBrown 9df69e
 drivers/md/md-linear.c    |    2 +-
NeilBrown 9df69e
 drivers/md/md-multipath.c |    2 +-
NeilBrown 9df69e
 drivers/md/md.c           |    9 ++++++++-
NeilBrown 9df69e
 drivers/md/md.h           |    5 +++--
NeilBrown 9df69e
 drivers/md/raid0.c        |    2 +-
NeilBrown 9df69e
 drivers/md/raid1.c        |    2 +-
NeilBrown 9df69e
 drivers/md/raid10.c       |    2 +-
NeilBrown 9df69e
 drivers/md/raid5.c        |    2 +-
NeilBrown 9df69e
 8 files changed, 17 insertions(+), 9 deletions(-)
NeilBrown 9df69e
NeilBrown 9df69e
--- a/drivers/md/md-linear.c
NeilBrown 9df69e
+++ b/drivers/md/md-linear.c
NeilBrown 9df69e
@@ -253,7 +253,7 @@ static bool linear_make_request(struct m
NeilBrown 9df69e
 	sector_t bio_sector = bio->bi_iter.bi_sector;
NeilBrown 9df69e
 
NeilBrown 9df69e
 	if (unlikely(bio->bi_opf & REQ_PREFLUSH)
NeilBrown 9df69e
-	    && md_flush_request(mddev, bio))
NeilBrown 9df69e
+	    && md_flush_request2(mddev, bio))
NeilBrown 9df69e
 		return true;
NeilBrown 9df69e
 
NeilBrown 9df69e
 	tmp_dev = which_dev(mddev, bio_sector);
NeilBrown 9df69e
--- a/drivers/md/md-multipath.c
NeilBrown 9df69e
+++ b/drivers/md/md-multipath.c
NeilBrown 9df69e
@@ -113,7 +113,7 @@ static bool multipath_make_request(struc
NeilBrown 9df69e
 	struct multipath_info *multipath;
NeilBrown 9df69e
 
NeilBrown 9df69e
 	if (unlikely(bio->bi_opf & REQ_PREFLUSH)
NeilBrown 9df69e
-	    && md_flush_request(mddev, bio))
NeilBrown 9df69e
+	    && md_flush_request2(mddev, bio))
NeilBrown 9df69e
 		return true;
NeilBrown 9df69e
 
NeilBrown 9df69e
 	mp_bh = mempool_alloc(conf->pool, GFP_NOIO);
NeilBrown 9df69e
--- a/drivers/md/md.c
NeilBrown 9df69e
+++ b/drivers/md/md.c
NeilBrown 9df69e
@@ -494,7 +494,7 @@ static void md_submit_flush_data(struct
NeilBrown 9df69e
  * being finished in another context.  Returns false if the flushing is
NeilBrown 9df69e
  * complete but still needs the I/O portion of the bio to be processed.
NeilBrown 9df69e
  */
NeilBrown 9df69e
-bool md_flush_request(struct mddev *mddev, struct bio *bio)
NeilBrown 9df69e
+bool md_flush_request2(struct mddev *mddev, struct bio *bio)
NeilBrown 9df69e
 {
NeilBrown 9df69e
 	ktime_t start = ktime_get_boottime();
NeilBrown 9df69e
 	spin_lock_irq(&mddev->lock);
NeilBrown 9df69e
@@ -524,6 +524,13 @@ bool md_flush_request(struct mddev *mdde
NeilBrown 9df69e
 	}
NeilBrown 9df69e
 	return true;
NeilBrown 9df69e
 }
NeilBrown 9df69e
+EXPORT_SYMBOL(md_flush_request2);
NeilBrown 9df69e
+
NeilBrown 9df69e
+void md_flush_request(struct mddev *mddev, struct bio *bio)
NeilBrown 9df69e
+{
NeilBrown 9df69e
+	if (!md_flush_request2(mddev, bio))
NeilBrown 9df69e
+		mddev->pers->make_request(mddev, bio);
NeilBrown 9df69e
+}
NeilBrown 9df69e
 EXPORT_SYMBOL(md_flush_request);
NeilBrown 9df69e
 
NeilBrown 9df69e
 static inline struct mddev *mddev_get(struct mddev *mddev)
NeilBrown 9df69e
--- a/drivers/md/md.h
NeilBrown 9df69e
+++ b/drivers/md/md.h
Denis Kirjanov e8af87
@@ -566,7 +566,7 @@ struct md_personality
NeilBrown 9df69e
 	int level;
NeilBrown 9df69e
 	struct list_head list;
NeilBrown 9df69e
 	struct module *owner;
NeilBrown 9df69e
-	bool __must_check (*make_request)(struct mddev *mddev, struct bio *bio);
NeilBrown 9df69e
+	bool (*make_request)(struct mddev *mddev, struct bio *bio);
Denis Kirjanov e8af87
 	/*
Denis Kirjanov e8af87
 	 * start up works that do NOT require md_thread. tasks that
Denis Kirjanov e8af87
 	 * requires md_thread should go into start()
NeilBrown 9df69e
@@ -682,7 +682,8 @@ extern void md_error(struct mddev *mddev
NeilBrown 9df69e
 extern void md_finish_reshape(struct mddev *mddev);
NeilBrown 9df69e
 
NeilBrown 9df69e
 extern int mddev_congested(struct mddev *mddev, int bits);
NeilBrown 9df69e
-extern bool __must_check md_flush_request(struct mddev *mddev, struct bio *bio);
NeilBrown 9df69e
+extern void md_flush_request(struct mddev *mddev, struct bio *bio);
NeilBrown 9df69e
+extern bool __must_check md_flush_request2(struct mddev *mddev, struct bio *bio);
NeilBrown 9df69e
 extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
NeilBrown 9df69e
 			   sector_t sector, int size, struct page *page);
NeilBrown 9df69e
 extern int md_super_wait(struct mddev *mddev);
NeilBrown 9df69e
--- a/drivers/md/raid0.c
NeilBrown 9df69e
+++ b/drivers/md/raid0.c
NeilBrown 9df69e
@@ -578,7 +578,7 @@ static bool raid0_make_request(struct md
NeilBrown 9df69e
 	unsigned sectors;
NeilBrown 9df69e
 
NeilBrown 9df69e
 	if (unlikely(bio->bi_opf & REQ_PREFLUSH)
NeilBrown 9df69e
-	    && md_flush_request(mddev, bio))
NeilBrown 9df69e
+	    && md_flush_request2(mddev, bio))
NeilBrown 9df69e
 		return true;
NeilBrown 9df69e
 
NeilBrown 9df69e
 	if (unlikely((bio_op(bio) == REQ_OP_DISCARD))) {
NeilBrown 9df69e
--- a/drivers/md/raid1.c
NeilBrown 9df69e
+++ b/drivers/md/raid1.c
NeilBrown 9df69e
@@ -1539,7 +1539,7 @@ static bool raid1_make_request(struct md
NeilBrown 9df69e
 	sector_t sectors;
NeilBrown 9df69e
 
NeilBrown 9df69e
 	if (unlikely(bio->bi_opf & REQ_PREFLUSH)
NeilBrown 9df69e
-	    && md_flush_request(mddev, bio))
NeilBrown 9df69e
+	    && md_flush_request2(mddev, bio))
NeilBrown 9df69e
 		return true;
NeilBrown 9df69e
 
NeilBrown 9df69e
 	/*
NeilBrown 9df69e
--- a/drivers/md/raid10.c
NeilBrown 9df69e
+++ b/drivers/md/raid10.c
NeilBrown 9df69e
@@ -1575,7 +1575,7 @@ static bool raid10_make_request(struct m
NeilBrown 9df69e
 	int sectors = bio_sectors(bio);
NeilBrown 9df69e
 
NeilBrown 9df69e
 	if (unlikely(bio->bi_opf & REQ_PREFLUSH)
NeilBrown 9df69e
-	    && md_flush_request(mddev, bio))
NeilBrown 9df69e
+	    && md_flush_request2(mddev, bio))
NeilBrown 9df69e
 		return true;
NeilBrown 9df69e
 
NeilBrown 9df69e
 	if (!md_write_start(mddev, bio))
NeilBrown 9df69e
--- a/drivers/md/raid5.c
NeilBrown 9df69e
+++ b/drivers/md/raid5.c
NeilBrown 9df69e
@@ -5584,7 +5584,7 @@ static bool raid5_make_request(struct md
NeilBrown 9df69e
 		if (ret == 0)
NeilBrown 9df69e
 			return true;
NeilBrown 9df69e
 		if (ret == -ENODEV) {
NeilBrown 9df69e
-			if (md_flush_request(mddev, bi))
NeilBrown 9df69e
+			if (md_flush_request2(mddev, bi))
NeilBrown 9df69e
 				return true;
NeilBrown 9df69e
 		}
NeilBrown 9df69e
 		/* ret == -EAGAIN, fallback */