--- x/block/blk-map.c +++ y/block/blk-map.c @@ -48,7 +48,9 @@ static int bio_copy_from_iter(struct bio { struct bio_vec *bvec; struct bvec_iter_all iter_all; + bool data_source = iter->data_source; + iter->data_source = true; bio_for_each_segment_all(bvec, bio, iter_all) { ssize_t ret; @@ -60,9 +62,12 @@ static int bio_copy_from_iter(struct bio if (!iov_iter_count(iter)) break; - if (ret < bvec->bv_len) + if (ret < bvec->bv_len) { + iter->data_source = data_source; return -EFAULT; + } } + iter->data_source = data_source; return 0; }