@@ -1204,6 +1204,14 @@ static int mirror_map(struct dm_target *ti, struct bio *bio)
if (rw == WRITE) {
/* Save region for mirror_end_io() handler */
bio_record->write_region = dm_rh_bio_to_region(ms->rh, bio);
+ if (bio->bi_opf & REQ_NOWAIT) {
+ int state = dm_rh_get_state(ms->rh,
+ bio_record->write_region, 1);
+ if (state != DM_RH_CLEAN && state != DM_RH_DIRTY) {
+ bio_wouldblock_error(bio);
+ return DM_MAPIO_SUBMITTED;
+ }
+ }
queue_bio(ms, bio, rw);
return DM_MAPIO_SUBMITTED;
}
@@ -1219,6 +1227,11 @@ static int mirror_map(struct dm_target *ti, struct bio *bio)
if (bio->bi_opf & REQ_RAHEAD)
return DM_MAPIO_KILL;
+ if (bio->bi_opf & REQ_NOWAIT) {
+ bio_wouldblock_error(bio);
+ return DM_MAPIO_SUBMITTED;
+ }
+
queue_bio(ms, bio, rw);
return DM_MAPIO_SUBMITTED;
}