raid5: add a new state for stripe log handling
authorShaohua Li <shli@fb.com>
Thu, 13 Aug 2015 21:31:58 +0000 (14:31 -0700)
committerNeilBrown <neilb@suse.com>
Sat, 24 Oct 2015 06:16:19 +0000 (17:16 +1100)
When a stripe finishes construction, we write the stripe to raid in
ops_run_io normally. With log, we do a bunch of other operations before
the stripe is written to raid. Mainly write the stripe to log disk,
flush disk cache and so on. The operations are still driven by raid5d
and run in the stripe state machine. We introduce a new state for such
stripe (trapped into log). The stripe is in this state from the time it
first enters ops_run_io (finish construction) to the time it is written
to raid. Since we know the state is only for log, we bypass other
check/operation in handle_stripe.

Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: NeilBrown <neilb@suse.com>
drivers/md/raid5.c
drivers/md/raid5.h

index b200c195160c995f2b34edb353bf037d636ab6ca..4b789f1f45508435e791e612f8665674e43d18a0 100644 (file)
@@ -4316,6 +4316,9 @@ static void handle_stripe(struct stripe_head *sh)
 
        analyse_stripe(sh, &s);
 
+       if (test_bit(STRIPE_LOG_TRAPPED, &sh->state))
+               goto finish;
+
        if (s.handle_bad_blocks) {
                set_bit(STRIPE_HANDLE, &sh->state);
                goto finish;
index 7686fcb62157117c67f7d320ec7b6081569d0398..a42c123d15d266552e00c1cd885417fdf680eb5f 100644 (file)
@@ -340,6 +340,7 @@ enum {
        STRIPE_BITMAP_PENDING,  /* Being added to bitmap, don't add
                                 * to batch yet.
                                 */
+       STRIPE_LOG_TRAPPED, /* trapped into log */
 };
 
 #define STRIPE_EXPAND_SYNC_FLAGS \