Message ID | 20240425183943.6319-6-joshi.k@samsung.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Read/Write with meta/integrity | expand |
The subjet is about as useless as it gets :) The essence is that it should take the iter into account, so name that. > --- a/include/linux/blk-integrity.h > +++ b/include/linux/blk-integrity.h > @@ -109,11 +109,12 @@ static inline bool blk_integrity_rq(struct request *rq) > * Return the first bvec that contains integrity data. Only drivers that are > * limited to a single integrity segment should use this helper. > */ The comment really needs an update. With this rq_integrity_vec now is a "normal" iter based operation, that can actually be used by drivers with multiple integrity segments if it is properly advanced. > +static inline struct bio_vec rq_integrity_vec(struct request *rq) > { > - return NULL; > + return (struct bio_vec){0}; No need for the 0 here.
On 4/27/2024 12:48 PM, Christoph Hellwig wrote: > The subjet is about as useless as it gets :) > > The essence is that it should take the iter into account, so name that. Sure. >> --- a/include/linux/blk-integrity.h >> +++ b/include/linux/blk-integrity.h >> @@ -109,11 +109,12 @@ static inline bool blk_integrity_rq(struct request *rq) >> * Return the first bvec that contains integrity data. Only drivers that are >> * limited to a single integrity segment should use this helper. >> */ > > The comment really needs an update. With this rq_integrity_vec now > is a "normal" iter based operation, that can actually be used by > drivers with multiple integrity segments if it is properly advanced. Right, will update. >> +static inline struct bio_vec rq_integrity_vec(struct request *rq) >> { >> - return NULL; >> + return (struct bio_vec){0}; > > No need for the 0 here. Um, I did not follow. Need that to keep the compiler happy. Do you suggest to change the prototype.
On Mon, Apr 29, 2024 at 05:04:30PM +0530, Kanchan Joshi wrote: > >> + return (struct bio_vec){0}; > > > > No need for the 0 here. > Um, I did not follow. Need that to keep the compiler happy. > Do you suggest to change the prototype. Just removing the NULL as in: return (struct bio_vec){ }; compiles just fine here, and at least for non-anonymous struct initializers we use it all the time.
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index 8e0bb9692685..bc5177ea6330 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -825,9 +825,9 @@ static blk_status_t nvme_map_metadata(struct nvme_dev *dev, struct request *req, struct nvme_command *cmnd) { struct nvme_iod *iod = blk_mq_rq_to_pdu(req); + struct bio_vec bv = rq_integrity_vec(req); - iod->meta_dma = dma_map_bvec(dev->dev, rq_integrity_vec(req), - rq_dma_dir(req), 0); + iod->meta_dma = dma_map_bvec(dev->dev, &bv, rq_dma_dir(req), 0); if (dma_mapping_error(dev->dev, iod->meta_dma)) return BLK_STS_IOERR; cmnd->rw.metadata = cpu_to_le64(iod->meta_dma); @@ -964,9 +964,10 @@ static __always_inline void nvme_pci_unmap_rq(struct request *req) if (blk_integrity_rq(req)) { struct nvme_iod *iod = blk_mq_rq_to_pdu(req); + struct bio_vec bv = rq_integrity_vec(req); - dma_unmap_page(dev->dev, iod->meta_dma, - rq_integrity_vec(req)->bv_len, rq_dma_dir(req)); + dma_unmap_page(dev->dev, iod->meta_dma, bv.bv_len, + rq_dma_dir(req)); } if (blk_rq_nr_phys_segments(req)) diff --git a/include/linux/blk-integrity.h b/include/linux/blk-integrity.h index e253e7bd0d17..9223050c0f75 100644 --- a/include/linux/blk-integrity.h +++ b/include/linux/blk-integrity.h @@ -109,11 +109,12 @@ static inline bool blk_integrity_rq(struct request *rq) * Return the first bvec that contains integrity data. Only drivers that are * limited to a single integrity segment should use this helper. */ -static inline struct bio_vec *rq_integrity_vec(struct request *rq) +static inline struct bio_vec rq_integrity_vec(struct request *rq) { - if (WARN_ON_ONCE(queue_max_integrity_segments(rq->q) > 1)) - return NULL; - return rq->bio->bi_integrity->bip_vec; + WARN_ON_ONCE(queue_max_integrity_segments(rq->q) > 1); + + return mp_bvec_iter_bvec(rq->bio->bi_integrity->bip_vec, + rq->bio->bi_integrity->bip_iter); } #else /* CONFIG_BLK_DEV_INTEGRITY */ static inline int blk_rq_count_integrity_sg(struct request_queue *q, @@ -177,9 +178,9 @@ static inline int blk_integrity_rq(struct request *rq) return 0; } -static inline struct bio_vec *rq_integrity_vec(struct request *rq) +static inline struct bio_vec rq_integrity_vec(struct request *rq) { - return NULL; + return (struct bio_vec){0}; } #endif /* CONFIG_BLK_DEV_INTEGRITY */ #endif /* _LINUX_BLK_INTEGRITY_H */