Hi all In analyse_stripe is_bad = is_badblock(rdev, sh->sector, STRIPE_SECTORS, &first_bad, &bad_sectors); clear_bit(R5_Insync, &dev->flags); if (!rdev) /* Not in-sync */; else if (is_bad) { /* also not in-sync */ if (!test_bit(WriteErrorSeen, &rdev->flags) && test_bit(R5_UPTODATE, &dev->flags)) { /* treat as in-sync, but with a read error * which we can now try to correct */ set_bit(R5_Insync, &dev->flags); set_bit(R5_ReadError, &dev->flags); } } If there is any bad block in the range of a read, it will fall from cache-bypass to stripe-cache. With the R5_UPTODATE checking here, we may try to read from this badblock instead of attempting to calculate the data directly. Why do we need the R5_UPTODATE here ? >From the comment of the commit, " We can only treat a known-bad-block like a read-error if we have the data that belongs in that block " Would anyone please help to clarify the reason ? Thanks in advance Jianchao