|
@@ -708,16 +708,15 @@ static void cached_dev_read_error(struct closure *cl)
|
|
{
|
|
{
|
|
struct search *s = container_of(cl, struct search, cl);
|
|
struct search *s = container_of(cl, struct search, cl);
|
|
struct bio *bio = &s->bio.bio;
|
|
struct bio *bio = &s->bio.bio;
|
|
- struct cached_dev *dc = container_of(s->d, struct cached_dev, disk);
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
- * If cache device is dirty (dc->has_dirty is non-zero), then
|
|
|
|
- * recovery a failed read request from cached device may get a
|
|
|
|
- * stale data back. So read failure recovery is only permitted
|
|
|
|
- * when cache device is clean.
|
|
|
|
|
|
+ * If read request hit dirty data (s->read_dirty_data is true),
|
|
|
|
+ * then recovery a failed read request from cached device may
|
|
|
|
+ * get a stale data back. So read failure recovery is only
|
|
|
|
+ * permitted when read request hit clean data in cache device,
|
|
|
|
+ * or when cache read race happened.
|
|
*/
|
|
*/
|
|
- if (s->recoverable &&
|
|
|
|
- (dc && !atomic_read(&dc->has_dirty))) {
|
|
|
|
|
|
+ if (s->recoverable && !s->read_dirty_data) {
|
|
/* Retry from the backing device: */
|
|
/* Retry from the backing device: */
|
|
trace_bcache_read_retry(s->orig_bio);
|
|
trace_bcache_read_retry(s->orig_bio);
|
|
|
|
|