|
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 */
|