md/raid5: move resolving of reconstruct_state earlier in
stripe_handle. The chunk of code in stripe_handle which responds to a *_result value in reconstruct_state is really the completion of some processing that happened outside of handle_stripe (possibly asynchronously) and so should be one of the first things done in handle_stripe(). After the next patch it will be important that it happens before handle_stripe_clean_event(), as that will clear some dev->flags bit that this code tests. Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
Родитель
4ac6875eeb
Коммит
ef5b7c69b7
|
@ -3490,40 +3490,6 @@ static void handle_stripe(struct stripe_head *sh)
|
|||
handle_failed_sync(conf, sh, &s);
|
||||
}
|
||||
|
||||
/*
|
||||
* might be able to return some write requests if the parity blocks
|
||||
* are safe, or on a failed drive
|
||||
*/
|
||||
pdev = &sh->dev[sh->pd_idx];
|
||||
s.p_failed = (s.failed >= 1 && s.failed_num[0] == sh->pd_idx)
|
||||
|| (s.failed >= 2 && s.failed_num[1] == sh->pd_idx);
|
||||
qdev = &sh->dev[sh->qd_idx];
|
||||
s.q_failed = (s.failed >= 1 && s.failed_num[0] == sh->qd_idx)
|
||||
|| (s.failed >= 2 && s.failed_num[1] == sh->qd_idx)
|
||||
|| conf->level < 6;
|
||||
|
||||
if (s.written &&
|
||||
(s.p_failed || ((test_bit(R5_Insync, &pdev->flags)
|
||||
&& !test_bit(R5_LOCKED, &pdev->flags)
|
||||
&& (test_bit(R5_UPTODATE, &pdev->flags) ||
|
||||
test_bit(R5_Discard, &pdev->flags))))) &&
|
||||
(s.q_failed || ((test_bit(R5_Insync, &qdev->flags)
|
||||
&& !test_bit(R5_LOCKED, &qdev->flags)
|
||||
&& (test_bit(R5_UPTODATE, &qdev->flags) ||
|
||||
test_bit(R5_Discard, &qdev->flags))))))
|
||||
handle_stripe_clean_event(conf, sh, disks, &s.return_bi);
|
||||
|
||||
/* Now we might consider reading some blocks, either to check/generate
|
||||
* parity, or to satisfy requests
|
||||
* or to load a block that is being partially written.
|
||||
*/
|
||||
if (s.to_read || s.non_overwrite
|
||||
|| (conf->level == 6 && s.to_write && s.failed)
|
||||
|| (s.syncing && (s.uptodate + s.compute < disks))
|
||||
|| s.replacing
|
||||
|| s.expanding)
|
||||
handle_stripe_fill(sh, &s, disks);
|
||||
|
||||
/* Now we check to see if any write operations have recently
|
||||
* completed
|
||||
*/
|
||||
|
@ -3561,6 +3527,40 @@ static void handle_stripe(struct stripe_head *sh)
|
|||
s.dec_preread_active = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* might be able to return some write requests if the parity blocks
|
||||
* are safe, or on a failed drive
|
||||
*/
|
||||
pdev = &sh->dev[sh->pd_idx];
|
||||
s.p_failed = (s.failed >= 1 && s.failed_num[0] == sh->pd_idx)
|
||||
|| (s.failed >= 2 && s.failed_num[1] == sh->pd_idx);
|
||||
qdev = &sh->dev[sh->qd_idx];
|
||||
s.q_failed = (s.failed >= 1 && s.failed_num[0] == sh->qd_idx)
|
||||
|| (s.failed >= 2 && s.failed_num[1] == sh->qd_idx)
|
||||
|| conf->level < 6;
|
||||
|
||||
if (s.written &&
|
||||
(s.p_failed || ((test_bit(R5_Insync, &pdev->flags)
|
||||
&& !test_bit(R5_LOCKED, &pdev->flags)
|
||||
&& (test_bit(R5_UPTODATE, &pdev->flags) ||
|
||||
test_bit(R5_Discard, &pdev->flags))))) &&
|
||||
(s.q_failed || ((test_bit(R5_Insync, &qdev->flags)
|
||||
&& !test_bit(R5_LOCKED, &qdev->flags)
|
||||
&& (test_bit(R5_UPTODATE, &qdev->flags) ||
|
||||
test_bit(R5_Discard, &qdev->flags))))))
|
||||
handle_stripe_clean_event(conf, sh, disks, &s.return_bi);
|
||||
|
||||
/* Now we might consider reading some blocks, either to check/generate
|
||||
* parity, or to satisfy requests
|
||||
* or to load a block that is being partially written.
|
||||
*/
|
||||
if (s.to_read || s.non_overwrite
|
||||
|| (conf->level == 6 && s.to_write && s.failed)
|
||||
|| (s.syncing && (s.uptodate + s.compute < disks))
|
||||
|| s.replacing
|
||||
|| s.expanding)
|
||||
handle_stripe_fill(sh, &s, disks);
|
||||
|
||||
/* Now to consider new write requests and what else, if anything
|
||||
* should be read. We do not handle new writes when:
|
||||
* 1/ A 'write' operation (copy+xor) is already in flight.
|
||||
|
|
Загрузка…
Ссылка в новой задаче