On Fri, Jan 11, 2019 at 09:08:27AM +0100, Johannes Thumshirn wrote: > On 10/01/2019 17:49, Johannes Thumshirn wrote: > > Right, but we're looking for the number of already completed bytes to > > rewind here, so from bvec.h's docs it is bi_bvec_done. > > > > Dmitriy can you see if this works for you: > > > > diff --git a/fs/btrfs/raid56.c b/fs/btrfs/raid56.c > > index e74455eb42f9..2d0e2eec5413 100644 > > --- a/fs/btrfs/raid56.c > > +++ b/fs/btrfs/raid56.c > > @@ -1350,6 +1350,7 @@ static int find_bio_stripe(struct btrfs_raid_bio > > *rbio, > > struct btrfs_bio_stripe *stripe; > > > > physical <<= 9; > > + physical -= bio->bi_iter.bi_bvec_done; > > OK talked to Hannes about this issue, he says the only way is to save > the iterator state before submitting the bio. > > So the above is bogus too. > > This also is what Kent said in > https://marc.info/?l=linux-block&m=153549921116441&w=2 Yeah, .bi_bvec_done can't help, seems you need to take the similar approach in 7759eb23fd9808a2e ("block: remove bio_rewind_iter()"). In theory, the follow way might work, but still like a hack: #define BVEC_ITER_ALL_INIT (struct bvec_iter) \ { \ .bi_sector = 0, \ .bi_size = UINT_MAX, \ .bi_idx = 0, \ .bi_bvec_done = 0, \ } old_bi_sector = bio->bi_iter.bi_sector; bio->bi_iter = BVEC_ITER_ALL_INIT; bio->bi_iter.bi_sector = old_bi_sector; bio_advance(bio, where_to_rewind); This bio can't be the fast-cloned one, which should be satisfied by fs code. Also 'where_to_rewind' needs to point to the offset relative to start of this bio. Thanks, Ming
