Skip to content

Commit

Permalink
Merge branch 'for-linus' of git://neil.brown.name/md
Browse files Browse the repository at this point in the history
* 'for-linus' of git://neil.brown.name/md:
  md/raid5: STRIPE_ACTIVE has lock semantics, add barriers
  md/raid5: abort any pending parity operations when array fails.
  • Loading branch information
Linus Torvalds committed Nov 9, 2011
2 parents c8c27c9 + 257a4b4 commit ed72a3d
Showing 1 changed file with 10 additions and 6 deletions.
16 changes: 10 additions & 6 deletions drivers/md/raid5.c
Original file line number Diff line number Diff line change
Expand Up @@ -3110,7 +3110,7 @@ static void handle_stripe(struct stripe_head *sh)
struct r5dev *pdev, *qdev;

clear_bit(STRIPE_HANDLE, &sh->state);
if (test_and_set_bit(STRIPE_ACTIVE, &sh->state)) {
if (test_and_set_bit_lock(STRIPE_ACTIVE, &sh->state)) {
/* already being handled, ensure it gets handled
* again when current action finishes */
set_bit(STRIPE_HANDLE, &sh->state);
Expand Down Expand Up @@ -3159,10 +3159,14 @@ static void handle_stripe(struct stripe_head *sh)
/* check if the array has lost more than max_degraded devices and,
* if so, some requests might need to be failed.
*/
if (s.failed > conf->max_degraded && s.to_read+s.to_write+s.written)
handle_failed_stripe(conf, sh, &s, disks, &s.return_bi);
if (s.failed > conf->max_degraded && s.syncing)
handle_failed_sync(conf, sh, &s);
if (s.failed > conf->max_degraded) {
sh->check_state = 0;
sh->reconstruct_state = 0;
if (s.to_read+s.to_write+s.written)
handle_failed_stripe(conf, sh, &s, disks, &s.return_bi);
if (s.syncing)
handle_failed_sync(conf, sh, &s);
}

/*
* might be able to return some write requests if the parity blocks
Expand Down Expand Up @@ -3371,7 +3375,7 @@ static void handle_stripe(struct stripe_head *sh)

return_io(s.return_bi);

clear_bit(STRIPE_ACTIVE, &sh->state);
clear_bit_unlock(STRIPE_ACTIVE, &sh->state);
}

static void raid5_activate_delayed(struct r5conf *conf)
Expand Down

0 comments on commit ed72a3d

Please sign in to comment.