Message ID | 20190329142346.1677-2-bob.liu@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Block/XFS: Support alternative mirror device retry | expand |
On Mar 29, 2019, at 8:23 AM, Bob Liu <bob.liu@oracle.com> wrote: > > This patch adds a function verifier callback to submit_bio. The > filesystem layer can use submit_bio_verify to pass a call back > to the block layer which can then be used to verify if the data > read is correct. How does this interact (if at all) with bio_integrity_verify() code? Does it mean if e.g. XFS is on storage with T10-PI that only one or the other can be used, or will it be possible to chain the verify callbacks? Cheers, Andreas > Signed-off-by: Bob Liu <bob.liu@oracle.com> > --- > block/blk-core.c | 13 ++++++++++--- > include/linux/bio.h | 2 ++ > 2 files changed, 12 insertions(+), 3 deletions(-) > > diff --git a/block/blk-core.c b/block/blk-core.c > index 6b78ec56a4f2..d265d2924c32 100644 > --- a/block/blk-core.c > +++ b/block/blk-core.c > @@ -1156,15 +1156,16 @@ blk_qc_t direct_make_request(struct bio *bio) > EXPORT_SYMBOL_GPL(direct_make_request); > > /** > - * submit_bio - submit a bio to the block device layer for I/O > + * submit_bio_verify - submit a bio to the block device layer for I/O > * @bio: The &struct bio which describes the I/O > * > - * submit_bio() is very similar in purpose to generic_make_request(), and > + * submit_bio_verify() is very similar in purpose to generic_make_request(), and > * uses that function to do most of the work. Both are fairly rough > * interfaces; @bio must be presetup and ready for I/O. > * > */ > -blk_qc_t submit_bio(struct bio *bio) > +blk_qc_t submit_bio_verify(struct bio *bio, > + int (*verifier_cb_func)(struct bio *)) > { > /* > * If it's a regular read/write or a barrier with data attached, > @@ -1197,6 +1198,12 @@ blk_qc_t submit_bio(struct bio *bio) > > return generic_make_request(bio); > } > +EXPORT_SYMBOL(submit_bio_verify); > + > +blk_qc_t submit_bio(struct bio *bio) > +{ > + return submit_bio_verify(bio, NULL); > +} > EXPORT_SYMBOL(submit_bio); > > /** > diff --git a/include/linux/bio.h b/include/linux/bio.h > index 7380b094dcca..ddaadab74dcf 100644 > --- a/include/linux/bio.h > +++ b/include/linux/bio.h > @@ -398,6 +398,8 @@ static inline struct bio *bio_kmalloc(gfp_t gfp_mask, unsigned int nr_iovecs) > return bio_alloc_bioset(gfp_mask, nr_iovecs, NULL); > } > > +extern blk_qc_t submit_bio_verify(struct bio *, > + int (*verifier_cb_func)(struct bio *)); > extern blk_qc_t submit_bio(struct bio *); > > extern void bio_endio(struct bio *); > -- > 2.17.1 > Cheers, Andreas
Andreas, > How does this interact (if at all) with bio_integrity_verify() code? > Does it mean if e.g. XFS is on storage with T10-PI that only one or > the other can be used, Yes. Although if your storage is sophisticated enough to be T10 PI capable, you are probably using redundancy inside the array and therefore not MD. But I think there are other problems with the callback approach. See my impending email.
diff --git a/block/blk-core.c b/block/blk-core.c index 6b78ec56a4f2..d265d2924c32 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1156,15 +1156,16 @@ blk_qc_t direct_make_request(struct bio *bio) EXPORT_SYMBOL_GPL(direct_make_request); /** - * submit_bio - submit a bio to the block device layer for I/O + * submit_bio_verify - submit a bio to the block device layer for I/O * @bio: The &struct bio which describes the I/O * - * submit_bio() is very similar in purpose to generic_make_request(), and + * submit_bio_verify() is very similar in purpose to generic_make_request(), and * uses that function to do most of the work. Both are fairly rough * interfaces; @bio must be presetup and ready for I/O. * */ -blk_qc_t submit_bio(struct bio *bio) +blk_qc_t submit_bio_verify(struct bio *bio, + int (*verifier_cb_func)(struct bio *)) { /* * If it's a regular read/write or a barrier with data attached, @@ -1197,6 +1198,12 @@ blk_qc_t submit_bio(struct bio *bio) return generic_make_request(bio); } +EXPORT_SYMBOL(submit_bio_verify); + +blk_qc_t submit_bio(struct bio *bio) +{ + return submit_bio_verify(bio, NULL); +} EXPORT_SYMBOL(submit_bio); /** diff --git a/include/linux/bio.h b/include/linux/bio.h index 7380b094dcca..ddaadab74dcf 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -398,6 +398,8 @@ static inline struct bio *bio_kmalloc(gfp_t gfp_mask, unsigned int nr_iovecs) return bio_alloc_bioset(gfp_mask, nr_iovecs, NULL); } +extern blk_qc_t submit_bio_verify(struct bio *, + int (*verifier_cb_func)(struct bio *)); extern blk_qc_t submit_bio(struct bio *); extern void bio_endio(struct bio *);
This patch adds a function verifier callback to submit_bio. The filesystem layer can use submit_bio_verify to pass a call back to the block layer which can then be used to verify if the data read is correct. Signed-off-by: Bob Liu <bob.liu@oracle.com> --- block/blk-core.c | 13 ++++++++++--- include/linux/bio.h | 2 ++ 2 files changed, 12 insertions(+), 3 deletions(-)