--- zzzz-none-000/linux-2.6.32.61/drivers/mtd/mtd_blkdevs.c 2013-06-10 09:43:48.000000000 +0000 +++ ar10-7272-687/linux-2.6.32.61/drivers/mtd/mtd_blkdevs.c 2013-10-30 13:12:30.000000000 +0000 @@ -56,18 +56,35 @@ switch(rq_data_dir(req)) { case READ: - for (; nsect > 0; nsect--, block++, buf += tr->blksize) - if (tr->readsect(dev, block, buf)) - return -EIO; +#if 0 + for (; nsect > 0; nsect--, block++, buf += tr->blksize) { + int ret = tr->readsect(dev, block, buf); + if (ret && (ret != -EUCLEAN)) + return ret; + } +#else + for (; nsect > 0; nsect--, block++, buf += tr->blksize) { + if (tr->readsect(dev, block, buf)) + return -EIO; + } +#endif return 0; case WRITE: if (!tr->writesect) return -EIO; - - for (; nsect > 0; nsect--, block++, buf += tr->blksize) - if (tr->writesect(dev, block, buf)) +#if 0 + for (; nsect > 0; nsect--, block++, buf += tr->blksize) { + int ret = tr->writesect(dev, block, buf); + if (ret && (ret != -EUCLEAN)) + return ret; + } +#else + for (; nsect > 0; nsect--, block++, buf += tr->blksize) { + if (tr->writesect(dev, block, buf)) return -EIO; + } +#endif return 0; default: @@ -110,7 +127,11 @@ spin_lock_irq(rq->queue_lock); +#if 0 + if (!__blk_end_request_cur(req, (!res || (res == -EUCLEAN)) ? 0 : res)) +#else if (!__blk_end_request_cur(req, res)) +#endif req = NULL; }