On Mon, Jan 07, 2019 at 12:03:43PM +0100, Johannes Thumshirn wrote: > >> + /* > >> + * Since the failed bio can return partial data, bi_sector might be > >> + * incremented by that value. We need to revert it back to the > >> + * state before the bio was submitted. > >> + */ > >> + physical -= bio->bi_iter.bi_done; > > > > The bi_done member has been removed in recent block layer changes > > commit 7759eb23fd9808a2e4498cf36a798ed65cde78ae ("block: remove > > bio_rewind_iter()"). I wonder what kind of block-magic do we need to do > > as the iterators seem to be local and there's nothing available in the > > call chain leading to find_bio_stripe. Johannes, any ideas? > > Right, what we could do here is go the same way Ming did in > 7759eb23fd980 ("block: remove bio_rewind_iter()") and save a bvec_iter > somewhere before submission and then see if we returned partial data, > but this somehow feels wrong to me (at least to do in btrfs code instead > of the block layer).
> Ming can we resurrect ->bi_done, or do you have a different suggestion > for finding about partial written bios? I don't think bi_done can be resurrected (https://marc.info/?l=linux-block&m=153549921116441&w=2) but I still am not sure that saving the iterator is the right thing (or at least how to do that right, not that the whole idea is wrong).