summaryrefslogtreecommitdiffstats
path: root/drivers/md/raid5-cache.c
diff options
context:
space:
mode:
authorShaohua Li2015-09-02 22:49:49 +0200
committerNeilBrown2015-11-01 03:48:26 +0100
commit828cbe989e4f5c8666cb3d99918b03666ccde0a0 (patch)
treed0a2523905dbada0b75104e22e6b8d93fec77a78 /drivers/md/raid5-cache.c
parentraid5-cache: move functionality out of __r5l_set_io_unit_state (diff)
downloadkernel-qcow2-linux-828cbe989e4f5c8666cb3d99918b03666ccde0a0.tar.gz
kernel-qcow2-linux-828cbe989e4f5c8666cb3d99918b03666ccde0a0.tar.xz
kernel-qcow2-linux-828cbe989e4f5c8666cb3d99918b03666ccde0a0.zip
raid5-cache: optimize FLUSH IO with log enabled
With log enabled, bio is written to raid disks after the bio is settled down in log disk. The recovery guarantees we can recovery the bio data from log disk, so we we skip FLUSH IO. Signed-off-by: Shaohua Li <shli@fb.com> Signed-off-by: NeilBrown <neilb@suse.com>
Diffstat (limited to 'drivers/md/raid5-cache.c')
-rw-r--r--drivers/md/raid5-cache.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c
index 6479f15a5434..ea1480392eba 100644
--- a/drivers/md/raid5-cache.c
+++ b/drivers/md/raid5-cache.c
@@ -507,6 +507,24 @@ void r5l_write_stripe_run(struct r5l_log *log)
mutex_unlock(&log->io_mutex);
}
+int r5l_handle_flush_request(struct r5l_log *log, struct bio *bio)
+{
+ if (!log)
+ return -ENODEV;
+ /*
+ * we flush log disk cache first, then write stripe data to raid disks.
+ * So if bio is finished, the log disk cache is flushed already. The
+ * recovery guarantees we can recovery the bio from log disk, so we
+ * don't need to flush again
+ */
+ if (bio->bi_iter.bi_size == 0) {
+ bio_endio(bio);
+ return 0;
+ }
+ bio->bi_rw &= ~REQ_FLUSH;
+ return -EAGAIN;
+}
+
/* This will run after log space is reclaimed */
static void r5l_run_no_space_stripes(struct r5l_log *log)
{