Hm haven't seen that one, does it help? I'll probably cherry pick this from mainline to retain attribution though, instead of using your version.
IIRC I had to do some changes to the function (adapt to kernel internal interface changes in time). But maybe you can work it out someway pretty, like do a set of commits retaining attribution, then one commit by you or me (I dont care for attribution that much, but whatever) doing the interface fixing.
Anyhows the randomly found-out workaround codepath is as follows:
1. Try to read big block (2 or more sectors)
2. Get spurious read error due to concurrent write on the other channel. (Why? - resolving this would be the real bug fix)
3. New code tries to find out what sector failed by reading the big block 1 sector at a time (old 2.6.27 code marked lots of sectors as bad at this point)
4. No sector fails (why does this work?, dunno but works), and code returns with success (as the re-reading is done with a flag and a goto to retry point - so it can also normally exit with success.)