It looks like some minor changes slipped through on the RAID.

A couple of checks for REQ_PREFLUSH flag should also check for
bi_op matching REQ_OP_FLUSH.

Wrappers for sync_page_io() are passed READ/WRITE but need to
be passed REQ_OP_READ and REQ_OP_WRITE.

Signed-off-by: Shaun Tancheff <[email protected]>
---
 drivers/md/raid0.c  |  3 ++-
 drivers/md/raid1.c  | 13 +++++++------
 drivers/md/raid10.c | 21 ++++++++++-----------
 drivers/md/raid5.c  |  3 ++-
 4 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index f95463d..46e9ba8 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -458,7 +458,8 @@ static void raid0_make_request(struct mddev *mddev, struct 
bio *bio)
        struct md_rdev *tmp_dev;
        struct bio *split;
 
-       if (unlikely(bio->bi_rw & REQ_PREFLUSH)) {
+       if (unlikely(bio->bi_rw & REQ_PREFLUSH) ||
+           unlikely(bio->bi_op == REQ_OP_FLUSH)) {
                md_flush_request(mddev, bio);
                return;
        }
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index 2a2c177..f7c0577 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -1771,12 +1771,12 @@ static void end_sync_write(struct bio *bio)
 }
 
 static int r1_sync_page_io(struct md_rdev *rdev, sector_t sector,
-                           int sectors, struct page *page, int rw)
+                           int sectors, struct page *page, int op)
 {
-       if (sync_page_io(rdev, sector, sectors << 9, page, rw, 0, false))
+       if (sync_page_io(rdev, sector, sectors << 9, page, op, 0, false))
                /* success */
                return 1;
-       if (rw == WRITE) {
+       if (op == REQ_OP_WRITE) {
                set_bit(WriteErrorSeen, &rdev->flags);
                if (!test_and_set_bit(WantReplacement,
                                      &rdev->flags))
@@ -1883,7 +1883,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
                        rdev = conf->mirrors[d].rdev;
                        if (r1_sync_page_io(rdev, sect, s,
                                            bio->bi_io_vec[idx].bv_page,
-                                           WRITE) == 0) {
+                                           REQ_OP_WRITE) == 0) {
                                r1_bio->bios[d]->bi_end_io = NULL;
                                rdev_dec_pending(rdev, mddev);
                        }
@@ -2118,7 +2118,7 @@ static void fix_read_error(struct r1conf *conf, int 
read_disk,
                        if (rdev &&
                            !test_bit(Faulty, &rdev->flags))
                                r1_sync_page_io(rdev, sect, s,
-                                               conf->tmppage, WRITE);
+                                               conf->tmppage, REQ_OP_WRITE);
                }
                d = start;
                while (d != read_disk) {
@@ -2130,7 +2130,7 @@ static void fix_read_error(struct r1conf *conf, int 
read_disk,
                        if (rdev &&
                            !test_bit(Faulty, &rdev->flags)) {
                                if (r1_sync_page_io(rdev, sect, s,
-                                                   conf->tmppage, READ)) {
+                                                   conf->tmppage, 
REQ_OP_READ)) {
                                        atomic_add(s, &rdev->corrected_errors);
                                        printk(KERN_INFO
                                               "md/raid1:%s: read error 
corrected "
@@ -2204,6 +2204,7 @@ static int narrow_write_error(struct r1bio *r1_bio, int i)
                }
 
                wbio->bi_op = REQ_OP_WRITE;
+               wbio->bi_rw = 0;
                wbio->bi_iter.bi_sector = r1_bio->sector;
                wbio->bi_iter.bi_size = r1_bio->sectors << 9;
 
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index c5dc4e4..44e87c2 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -1364,8 +1364,7 @@ retry_write:
                        mbio->bi_bdev = rdev->bdev;
                        mbio->bi_end_io = raid10_end_write_request;
                        mbio->bi_op = op;
-                       mbio->bi_rw =
-                               do_sync | do_fua | do_sec;
+                       mbio->bi_rw = do_sync | do_fua | do_sec;
                        mbio->bi_private = r10_bio;
 
                        atomic_inc(&r10_bio->remaining);
@@ -1408,8 +1407,7 @@ retry_write:
                        mbio->bi_bdev = rdev->bdev;
                        mbio->bi_end_io = raid10_end_write_request;
                        mbio->bi_op = op;
-                       mbio->bi_rw =
-                               do_sync | do_fua | do_sec;
+                       mbio->bi_rw = do_sync | do_fua | do_sec;
                        mbio->bi_private = r10_bio;
 
                        atomic_inc(&r10_bio->remaining);
@@ -1452,7 +1450,8 @@ static void raid10_make_request(struct mddev *mddev, 
struct bio *bio)
 
        struct bio *split;
 
-       if (unlikely(bio->bi_rw & REQ_PREFLUSH)) {
+       if (unlikely(bio->bi_rw & REQ_PREFLUSH) ||
+           unlikely(bio->bi_op == REQ_OP_FLUSH)) {
                md_flush_request(mddev, bio);
                return;
        }
@@ -2207,18 +2206,18 @@ static void check_decay_read_errors(struct mddev 
*mddev, struct md_rdev *rdev)
 }
 
 static int r10_sync_page_io(struct md_rdev *rdev, sector_t sector,
-                           int sectors, struct page *page, int rw)
+                           int sectors, struct page *page, int op)
 {
        sector_t first_bad;
        int bad_sectors;
 
        if (is_badblock(rdev, sector, sectors, &first_bad, &bad_sectors)
-           && (rw == READ || test_bit(WriteErrorSeen, &rdev->flags)))
+           && (op == REQ_OP_READ || test_bit(WriteErrorSeen, &rdev->flags)))
                return -1;
-       if (sync_page_io(rdev, sector, sectors << 9, page, rw, 0, false))
+       if (sync_page_io(rdev, sector, sectors << 9, page, op, 0, false))
                /* success */
                return 1;
-       if (rw == WRITE) {
+       if (op == REQ_OP_WRITE) {
                set_bit(WriteErrorSeen, &rdev->flags);
                if (!test_and_set_bit(WantReplacement, &rdev->flags))
                        set_bit(MD_RECOVERY_NEEDED,
@@ -2354,7 +2353,7 @@ static void fix_read_error(struct r10conf *conf, struct 
mddev *mddev, struct r10
                        if (r10_sync_page_io(rdev,
                                             r10_bio->devs[sl].addr +
                                             sect,
-                                            s, conf->tmppage, WRITE)
+                                            s, conf->tmppage, REQ_OP_WRITE)
                            == 0) {
                                /* Well, this device is dead */
                                printk(KERN_NOTICE
@@ -2394,7 +2393,7 @@ static void fix_read_error(struct r10conf *conf, struct 
mddev *mddev, struct r10
                                             r10_bio->devs[sl].addr +
                                             sect,
                                             s, conf->tmppage,
-                                                READ)) {
+                                                REQ_OP_READ)) {
                        case 0:
                                /* Well, this device is dead */
                                printk(KERN_NOTICE
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 8504862..3e5a9db 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -5161,7 +5161,8 @@ static void raid5_make_request(struct mddev *mddev, 
struct bio * bi)
        DEFINE_WAIT(w);
        bool do_prepare;
 
-       if (unlikely(bi->bi_rw & REQ_PREFLUSH)) {
+       if (unlikely(bi->bi_rw & REQ_PREFLUSH) ||
+           unlikely(bi->bi_op == REQ_OP_FLUSH)) {
                int ret = r5l_handle_flush_request(conf->log, bi);
 
                if (ret == 0)
-- 
2.8.1


------------------------------------------------------------------------------
Find and fix application performance issues faster with Applications Manager
Applications Manager provides deep performance insights into multiple tiers of
your business applications. It resolves application problems quickly and
reduces your MTTR. Get your free trial!
https://ad.doubleclick.net/ddm/clk/302982198;130105516;z
_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to