Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 260977
b: refs/heads/master
c: f2b3b44
h: refs/heads/master
i:
  260975: 5c2b76c
v: v3
  • Loading branch information
NeilBrown committed Jul 26, 2011
1 parent 469d00e commit cecca9a
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 46 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 82e5a1718b9d0401b826341b9023766d04cb82f2
refs/heads/master: f2b3b44deee1524ca4f006048e0569f47eefdb74
77 changes: 38 additions & 39 deletions trunk/drivers/md/raid5.c
Original file line number Diff line number Diff line change
Expand Up @@ -2318,7 +2318,7 @@ static int fetch_block5(struct stripe_head *sh, struct stripe_head_state *s,
int disk_idx, int disks)
{
struct r5dev *dev = &sh->dev[disk_idx];
struct r5dev *failed_dev = &sh->dev[s->failed_num];
struct r5dev *failed_dev = &sh->dev[s->failed_num[0]];

/* is the data in this block needed, and can we get it? */
if (!test_bit(R5_LOCKED, &dev->flags) &&
Expand All @@ -2334,7 +2334,7 @@ static int fetch_block5(struct stripe_head *sh, struct stripe_head_state *s,
* otherwise read it if the backing disk is insync
*/
if ((s->uptodate == disks - 1) &&
(s->failed && disk_idx == s->failed_num)) {
(s->failed && disk_idx == s->failed_num[0])) {
set_bit(STRIPE_COMPUTE_RUN, &sh->state);
set_bit(STRIPE_OP_COMPUTE_BLK, &s->ops_request);
set_bit(R5_Wantcompute, &dev->flags);
Expand Down Expand Up @@ -2388,11 +2388,11 @@ static void handle_stripe_fill5(struct stripe_head *sh,
* 0 to tell the loop in handle_stripe_fill6 to continue
*/
static int fetch_block6(struct stripe_head *sh, struct stripe_head_state *s,
struct r6_state *r6s, int disk_idx, int disks)
int disk_idx, int disks)
{
struct r5dev *dev = &sh->dev[disk_idx];
struct r5dev *fdev[2] = { &sh->dev[r6s->failed_num[0]],
&sh->dev[r6s->failed_num[1]] };
struct r5dev *fdev[2] = { &sh->dev[s->failed_num[0]],
&sh->dev[s->failed_num[1]] };

if (!test_bit(R5_LOCKED, &dev->flags) &&
!test_bit(R5_UPTODATE, &dev->flags) &&
Expand All @@ -2409,8 +2409,8 @@ static int fetch_block6(struct stripe_head *sh, struct stripe_head_state *s,
BUG_ON(test_bit(R5_Wantcompute, &dev->flags));
BUG_ON(test_bit(R5_Wantread, &dev->flags));
if ((s->uptodate == disks - 1) &&
(s->failed && (disk_idx == r6s->failed_num[0] ||
disk_idx == r6s->failed_num[1]))) {
(s->failed && (disk_idx == s->failed_num[0] ||
disk_idx == s->failed_num[1]))) {
/* have disk failed, and we're requested to fetch it;
* do compute it
*/
Expand Down Expand Up @@ -2465,7 +2465,7 @@ static int fetch_block6(struct stripe_head *sh, struct stripe_head_state *s,
* handle_stripe_fill6 - read or compute data to satisfy pending requests.
*/
static void handle_stripe_fill6(struct stripe_head *sh,
struct stripe_head_state *s, struct r6_state *r6s,
struct stripe_head_state *s,
int disks)
{
int i;
Expand All @@ -2477,7 +2477,7 @@ static void handle_stripe_fill6(struct stripe_head *sh,
if (!test_bit(STRIPE_COMPUTE_RUN, &sh->state) && !sh->check_state &&
!sh->reconstruct_state)
for (i = disks; i--; )
if (fetch_block6(sh, s, r6s, i, disks))
if (fetch_block6(sh, s, i, disks))
break;
set_bit(STRIPE_HANDLE, &sh->state);
}
Expand Down Expand Up @@ -2625,7 +2625,7 @@ static void handle_stripe_dirtying5(raid5_conf_t *conf,

static void handle_stripe_dirtying6(raid5_conf_t *conf,
struct stripe_head *sh, struct stripe_head_state *s,
struct r6_state *r6s, int disks)
int disks)
{
int rcw = 0, pd_idx = sh->pd_idx, i;
int qd_idx = sh->qd_idx;
Expand Down Expand Up @@ -2688,7 +2688,7 @@ static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh,
s->uptodate--;
break;
}
dev = &sh->dev[s->failed_num];
dev = &sh->dev[s->failed_num[0]];
/* fall through */
case check_state_compute_result:
sh->check_state = check_state_idle;
Expand Down Expand Up @@ -2760,7 +2760,7 @@ static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh,

static void handle_parity_checks6(raid5_conf_t *conf, struct stripe_head *sh,
struct stripe_head_state *s,
struct r6_state *r6s, int disks)
int disks)
{
int pd_idx = sh->pd_idx;
int qd_idx = sh->qd_idx;
Expand All @@ -2779,14 +2779,14 @@ static void handle_parity_checks6(raid5_conf_t *conf, struct stripe_head *sh,
switch (sh->check_state) {
case check_state_idle:
/* start a new check operation if there are < 2 failures */
if (s->failed == r6s->q_failed) {
if (s->failed == s->q_failed) {
/* The only possible failed device holds Q, so it
* makes sense to check P (If anything else were failed,
* we would have used P to recreate it).
*/
sh->check_state = check_state_run;
}
if (!r6s->q_failed && s->failed < 2) {
if (!s->q_failed && s->failed < 2) {
/* Q is not failed, and we didn't use it to generate
* anything, so it makes sense to check it
*/
Expand Down Expand Up @@ -2828,13 +2828,13 @@ static void handle_parity_checks6(raid5_conf_t *conf, struct stripe_head *sh,
*/
BUG_ON(s->uptodate < disks - 1); /* We don't need Q to recover */
if (s->failed == 2) {
dev = &sh->dev[r6s->failed_num[1]];
dev = &sh->dev[s->failed_num[1]];
s->locked++;
set_bit(R5_LOCKED, &dev->flags);
set_bit(R5_Wantwrite, &dev->flags);
}
if (s->failed >= 1) {
dev = &sh->dev[r6s->failed_num[0]];
dev = &sh->dev[s->failed_num[0]];
s->locked++;
set_bit(R5_LOCKED, &dev->flags);
set_bit(R5_Wantwrite, &dev->flags);
Expand Down Expand Up @@ -2922,7 +2922,7 @@ static void handle_parity_checks6(raid5_conf_t *conf, struct stripe_head *sh,
}

static void handle_stripe_expansion(raid5_conf_t *conf, struct stripe_head *sh,
struct r6_state *r6s)
struct stripe_head_state *r6s)
{
int i;

Expand Down Expand Up @@ -3082,7 +3082,7 @@ static void handle_stripe5(struct stripe_head *sh)
clear_bit(R5_Insync, &dev->flags);
if (!test_bit(R5_Insync, &dev->flags)) {
s.failed++;
s.failed_num = i;
s.failed_num[0] = i;
}
}
spin_unlock_irq(&conf->device_lock);
Expand All @@ -3107,7 +3107,7 @@ static void handle_stripe5(struct stripe_head *sh)
pr_debug("locked=%d uptodate=%d to_read=%d"
" to_write=%d failed=%d failed_num=%d\n",
s.locked, s.uptodate, s.to_read, s.to_write,
s.failed, s.failed_num);
s.failed, s.failed_num[0]);
/* check if the array has lost two devices and, if so, some requests might
* need to be failed
*/
Expand All @@ -3127,7 +3127,7 @@ static void handle_stripe5(struct stripe_head *sh)
((test_bit(R5_Insync, &dev->flags) &&
!test_bit(R5_LOCKED, &dev->flags) &&
test_bit(R5_UPTODATE, &dev->flags)) ||
(s.failed == 1 && s.failed_num == sh->pd_idx)))
(s.failed == 1 && s.failed_num[0] == sh->pd_idx)))
handle_stripe_clean_event(conf, sh, disks, &return_bi);

/* Now we might consider reading some blocks, either to check/generate
Expand Down Expand Up @@ -3198,11 +3198,11 @@ static void handle_stripe5(struct stripe_head *sh)
* the repair/check process
*/
if (s.failed == 1 && !conf->mddev->ro &&
test_bit(R5_ReadError, &sh->dev[s.failed_num].flags)
&& !test_bit(R5_LOCKED, &sh->dev[s.failed_num].flags)
&& test_bit(R5_UPTODATE, &sh->dev[s.failed_num].flags)
test_bit(R5_ReadError, &sh->dev[s.failed_num[0]].flags)
&& !test_bit(R5_LOCKED, &sh->dev[s.failed_num[0]].flags)
&& test_bit(R5_UPTODATE, &sh->dev[s.failed_num[0]].flags)
) {
dev = &sh->dev[s.failed_num];
dev = &sh->dev[s.failed_num[0]];
if (!test_bit(R5_ReWrite, &dev->flags)) {
set_bit(R5_Wantwrite, &dev->flags);
set_bit(R5_ReWrite, &dev->flags);
Expand Down Expand Up @@ -3292,7 +3292,6 @@ static void handle_stripe6(struct stripe_head *sh)
struct bio *return_bi = NULL;
int i, pd_idx = sh->pd_idx, qd_idx = sh->qd_idx;
struct stripe_head_state s;
struct r6_state r6s;
struct r5dev *dev, *pdev, *qdev;
mdk_rdev_t *blocked_rdev = NULL;
int dec_preread_active = 0;
Expand Down Expand Up @@ -3370,7 +3369,7 @@ static void handle_stripe6(struct stripe_head *sh)
clear_bit(R5_Insync, &dev->flags);
if (!test_bit(R5_Insync, &dev->flags)) {
if (s.failed < 2)
r6s.failed_num[s.failed] = i;
s.failed_num[s.failed] = i;
s.failed++;
}
}
Expand All @@ -3396,7 +3395,7 @@ static void handle_stripe6(struct stripe_head *sh)
pr_debug("locked=%d uptodate=%d to_read=%d"
" to_write=%d failed=%d failed_num=%d,%d\n",
s.locked, s.uptodate, s.to_read, s.to_write, s.failed,
r6s.failed_num[0], r6s.failed_num[1]);
s.failed_num[0], s.failed_num[1]);
/* check if the array has lost >2 devices and, if so, some requests
* might need to be failed
*/
Expand All @@ -3413,17 +3412,17 @@ static void handle_stripe6(struct stripe_head *sh)
* are safe, or on a failed drive
*/
pdev = &sh->dev[pd_idx];
r6s.p_failed = (s.failed >= 1 && r6s.failed_num[0] == pd_idx)
|| (s.failed >= 2 && r6s.failed_num[1] == pd_idx);
s.p_failed = (s.failed >= 1 && s.failed_num[0] == pd_idx)
|| (s.failed >= 2 && s.failed_num[1] == pd_idx);
qdev = &sh->dev[qd_idx];
r6s.q_failed = (s.failed >= 1 && r6s.failed_num[0] == qd_idx)
|| (s.failed >= 2 && r6s.failed_num[1] == qd_idx);
s.q_failed = (s.failed >= 1 && s.failed_num[0] == qd_idx)
|| (s.failed >= 2 && s.failed_num[1] == qd_idx);

if ( s.written &&
( r6s.p_failed || ((test_bit(R5_Insync, &pdev->flags)
if (s.written &&
(s.p_failed || ((test_bit(R5_Insync, &pdev->flags)
&& !test_bit(R5_LOCKED, &pdev->flags)
&& test_bit(R5_UPTODATE, &pdev->flags)))) &&
( r6s.q_failed || ((test_bit(R5_Insync, &qdev->flags)
(s.q_failed || ((test_bit(R5_Insync, &qdev->flags)
&& !test_bit(R5_LOCKED, &qdev->flags)
&& test_bit(R5_UPTODATE, &qdev->flags)))))
handle_stripe_clean_event(conf, sh, disks, &return_bi);
Expand All @@ -3434,7 +3433,7 @@ static void handle_stripe6(struct stripe_head *sh)
*/
if (s.to_read || s.non_overwrite || (s.to_write && s.failed) ||
(s.syncing && (s.uptodate + s.compute < disks)) || s.expanding)
handle_stripe_fill6(sh, &s, &r6s, disks);
handle_stripe_fill6(sh, &s, disks);

/* Now we check to see if any write operations have recently
* completed
Expand Down Expand Up @@ -3472,7 +3471,7 @@ static void handle_stripe6(struct stripe_head *sh)
* block.
*/
if (s.to_write && !sh->reconstruct_state && !sh->check_state)
handle_stripe_dirtying6(conf, sh, &s, &r6s, disks);
handle_stripe_dirtying6(conf, sh, &s, disks);

/* maybe we need to check and possibly fix the parity for this stripe
* Any reads will already have been scheduled, so we just see if enough
Expand All @@ -3483,7 +3482,7 @@ static void handle_stripe6(struct stripe_head *sh)
(s.syncing && s.locked == 0 &&
!test_bit(STRIPE_COMPUTE_RUN, &sh->state) &&
!test_bit(STRIPE_INSYNC, &sh->state)))
handle_parity_checks6(conf, sh, &s, &r6s, disks);
handle_parity_checks6(conf, sh, &s, disks);

if (s.syncing && s.locked == 0 && test_bit(STRIPE_INSYNC, &sh->state)) {
md_done_sync(conf->mddev, STRIPE_SECTORS,1);
Expand All @@ -3495,7 +3494,7 @@ static void handle_stripe6(struct stripe_head *sh)
*/
if (s.failed <= 2 && !conf->mddev->ro)
for (i = 0; i < s.failed; i++) {
dev = &sh->dev[r6s.failed_num[i]];
dev = &sh->dev[s.failed_num[i]];
if (test_bit(R5_ReadError, &dev->flags)
&& !test_bit(R5_LOCKED, &dev->flags)
&& test_bit(R5_UPTODATE, &dev->flags)
Expand Down Expand Up @@ -3557,7 +3556,7 @@ static void handle_stripe6(struct stripe_head *sh)

if (s.expanding && s.locked == 0 &&
!test_bit(STRIPE_COMPUTE_RUN, &sh->state))
handle_stripe_expansion(conf, sh, &r6s);
handle_stripe_expansion(conf, sh, &s);

unlock:

Expand Down
8 changes: 2 additions & 6 deletions trunk/drivers/md/raid5.h
Original file line number Diff line number Diff line change
Expand Up @@ -242,13 +242,9 @@ struct stripe_head_state {
int syncing, expanding, expanded;
int locked, uptodate, to_read, to_write, failed, written;
int to_fill, compute, req_compute, non_overwrite;
int failed_num;
int failed_num[2];
unsigned long ops_request;
};

/* r6_state - extra state data only relevant to r6 */
struct r6_state {
int p_failed, q_failed, failed_num[2];
int p_failed, q_failed;
};

/* Flags */
Expand Down

0 comments on commit cecca9a

Please sign in to comment.