+@@ -1967,6 +2091,15 @@
+ set_bit(STRIPE_DEGRADED, &sh->state);
+ PRINTK("skip op %ld on disc %d for sector %llu\n",
+ bi->bi_rw, i, (unsigned long long)sh->sector);
++
++ if (test_bit(R5_Direct, &sh->dev[i].flags)) {
++ /* restore the page pointer of req, otherwise,
++ * no any read is permitted on this stripe, this is
++ * not what we want. -jay */
++ BUG_ON(sh->dev[i].req.bi_io_vec[0].bv_page == sh->dev[i].page);
++ sh->dev[i].req.bi_io_vec[0].bv_page = sh->dev[i].page;
++ }
++
+ clear_bit(R5_LOCKED, &sh->dev[i].flags);
+ set_bit(STRIPE_HANDLE, &sh->state);
+ }
+@@ -2172,7 +2305,8 @@