Loading block/blk-core.c +12 −0 Original line number Diff line number Diff line Loading @@ -1438,6 +1438,9 @@ void __blk_put_request(struct request_queue *q, struct request *req) /* this is a bio leak */ WARN_ON(req->bio != NULL); /* this is a bio leak if the bio is not tagged with BIO_DONTFREE */ WARN_ON(req->bio && !bio_flagged(req->bio, BIO_DONTFREE)); /* * Request may not have originated from ll_rw_blk. if not, * it didn't come out of our reserved rq pools Loading Loading @@ -2619,6 +2622,15 @@ bool blk_update_request(struct request *req, int error, unsigned int nr_bytes) blk_account_io_completion(req, nr_bytes); total_bytes = 0; /* * Check for this if flagged, Req based dm needs to perform * post processing, hence dont end bios or request.DM * layer takes care. */ if (bio_flagged(req->bio, BIO_DONTFREE)) return false; while (req->bio) { struct bio *bio = req->bio; unsigned bio_bytes = min(bio->bi_iter.bi_size, nr_bytes); Loading block/blk-merge.c +58 −0 Original line number Diff line number Diff line Loading @@ -492,6 +492,64 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq, } EXPORT_SYMBOL(blk_rq_map_sg); /* * map a request to scatterlist without combining PHY CONT * blocks, return number of sg entries setup. Caller * must make sure sg can hold rq->nr_phys_segments entries */ int blk_rq_map_sg_no_cluster(struct request_queue *q, struct request *rq, struct scatterlist *sglist) { struct bio_vec bvec, bvprv = { NULL }; struct req_iterator iter; struct scatterlist *sg; int nsegs, cluster = 0; nsegs = 0; /* * for each bio in rq */ sg = NULL; rq_for_each_segment(bvec, rq, iter) { __blk_segment_map_sg(q, &bvec, sglist, &bvprv, &sg, &nsegs, &cluster); } /* segments in rq */ if (!sg) return nsegs; if (unlikely(rq->cmd_flags & REQ_COPY_USER) && (blk_rq_bytes(rq) & q->dma_pad_mask)) { unsigned int pad_len = (q->dma_pad_mask & ~blk_rq_bytes(rq)) + 1; sg->length += pad_len; rq->extra_len += pad_len; } if (q->dma_drain_size && q->dma_drain_needed(rq)) { if (rq->cmd_flags & REQ_OP_WRITE) memset(q->dma_drain_buffer, 0, q->dma_drain_size); sg->page_link &= ~0x02; sg = sg_next(sg); sg_set_page(sg, virt_to_page(q->dma_drain_buffer), q->dma_drain_size, ((unsigned long)q->dma_drain_buffer) & (PAGE_SIZE - 1)); nsegs++; rq->extra_len += q->dma_drain_size; } if (sg) sg_mark_end(sg); return nsegs; } EXPORT_SYMBOL(blk_rq_map_sg_no_cluster); static inline int ll_new_hw_segment(struct request_queue *q, struct request *req, struct bio *bio) Loading block/blk.h +0 −1 Original line number Diff line number Diff line Loading @@ -207,7 +207,6 @@ int attempt_back_merge(struct request_queue *q, struct request *rq); int attempt_front_merge(struct request_queue *q, struct request *rq); int blk_attempt_req_merge(struct request_queue *q, struct request *rq, struct request *next); void blk_recalc_rq_segments(struct request *rq); void blk_rq_set_mixed_merge(struct request *rq); bool blk_rq_merge_ok(struct request *rq, struct bio *bio); int blk_try_merge(struct request *rq, struct bio *bio); Loading drivers/md/Kconfig +17 −0 Original line number Diff line number Diff line Loading @@ -277,6 +277,23 @@ config DM_CRYPT If unsure, say N. config DM_REQ_CRYPT tristate "Req Crypt target support" depends on BLK_DEV_DM select XTS select CRYPTO_XTS ---help--- This request based device-mapper target allows you to create a device that transparently encrypts the data on it. You'll need to activate the ciphers you're going to use in the cryptoapi configuration. The DM REQ CRYPT operates on requests (bigger payloads) to utilize crypto hardware better. To compile this code as a module, choose M here: the module will be called dm-req-crypt. If unsure, say N. config DM_SNAPSHOT tristate "Snapshot target" depends on BLK_DEV_DM Loading drivers/md/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ obj-$(CONFIG_DM_CACHE_SMQ) += dm-cache-smq.o obj-$(CONFIG_DM_CACHE_CLEANER) += dm-cache-cleaner.o obj-$(CONFIG_DM_ERA) += dm-era.o obj-$(CONFIG_DM_LOG_WRITES) += dm-log-writes.o obj-$(CONFIG_DM_REQ_CRYPT) += dm-req-crypt.o obj-$(CONFIG_DM_ANDROID_VERITY) += dm-android-verity.o ifeq ($(CONFIG_DM_UEVENT),y) Loading Loading
block/blk-core.c +12 −0 Original line number Diff line number Diff line Loading @@ -1438,6 +1438,9 @@ void __blk_put_request(struct request_queue *q, struct request *req) /* this is a bio leak */ WARN_ON(req->bio != NULL); /* this is a bio leak if the bio is not tagged with BIO_DONTFREE */ WARN_ON(req->bio && !bio_flagged(req->bio, BIO_DONTFREE)); /* * Request may not have originated from ll_rw_blk. if not, * it didn't come out of our reserved rq pools Loading Loading @@ -2619,6 +2622,15 @@ bool blk_update_request(struct request *req, int error, unsigned int nr_bytes) blk_account_io_completion(req, nr_bytes); total_bytes = 0; /* * Check for this if flagged, Req based dm needs to perform * post processing, hence dont end bios or request.DM * layer takes care. */ if (bio_flagged(req->bio, BIO_DONTFREE)) return false; while (req->bio) { struct bio *bio = req->bio; unsigned bio_bytes = min(bio->bi_iter.bi_size, nr_bytes); Loading
block/blk-merge.c +58 −0 Original line number Diff line number Diff line Loading @@ -492,6 +492,64 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq, } EXPORT_SYMBOL(blk_rq_map_sg); /* * map a request to scatterlist without combining PHY CONT * blocks, return number of sg entries setup. Caller * must make sure sg can hold rq->nr_phys_segments entries */ int blk_rq_map_sg_no_cluster(struct request_queue *q, struct request *rq, struct scatterlist *sglist) { struct bio_vec bvec, bvprv = { NULL }; struct req_iterator iter; struct scatterlist *sg; int nsegs, cluster = 0; nsegs = 0; /* * for each bio in rq */ sg = NULL; rq_for_each_segment(bvec, rq, iter) { __blk_segment_map_sg(q, &bvec, sglist, &bvprv, &sg, &nsegs, &cluster); } /* segments in rq */ if (!sg) return nsegs; if (unlikely(rq->cmd_flags & REQ_COPY_USER) && (blk_rq_bytes(rq) & q->dma_pad_mask)) { unsigned int pad_len = (q->dma_pad_mask & ~blk_rq_bytes(rq)) + 1; sg->length += pad_len; rq->extra_len += pad_len; } if (q->dma_drain_size && q->dma_drain_needed(rq)) { if (rq->cmd_flags & REQ_OP_WRITE) memset(q->dma_drain_buffer, 0, q->dma_drain_size); sg->page_link &= ~0x02; sg = sg_next(sg); sg_set_page(sg, virt_to_page(q->dma_drain_buffer), q->dma_drain_size, ((unsigned long)q->dma_drain_buffer) & (PAGE_SIZE - 1)); nsegs++; rq->extra_len += q->dma_drain_size; } if (sg) sg_mark_end(sg); return nsegs; } EXPORT_SYMBOL(blk_rq_map_sg_no_cluster); static inline int ll_new_hw_segment(struct request_queue *q, struct request *req, struct bio *bio) Loading
block/blk.h +0 −1 Original line number Diff line number Diff line Loading @@ -207,7 +207,6 @@ int attempt_back_merge(struct request_queue *q, struct request *rq); int attempt_front_merge(struct request_queue *q, struct request *rq); int blk_attempt_req_merge(struct request_queue *q, struct request *rq, struct request *next); void blk_recalc_rq_segments(struct request *rq); void blk_rq_set_mixed_merge(struct request *rq); bool blk_rq_merge_ok(struct request *rq, struct bio *bio); int blk_try_merge(struct request *rq, struct bio *bio); Loading
drivers/md/Kconfig +17 −0 Original line number Diff line number Diff line Loading @@ -277,6 +277,23 @@ config DM_CRYPT If unsure, say N. config DM_REQ_CRYPT tristate "Req Crypt target support" depends on BLK_DEV_DM select XTS select CRYPTO_XTS ---help--- This request based device-mapper target allows you to create a device that transparently encrypts the data on it. You'll need to activate the ciphers you're going to use in the cryptoapi configuration. The DM REQ CRYPT operates on requests (bigger payloads) to utilize crypto hardware better. To compile this code as a module, choose M here: the module will be called dm-req-crypt. If unsure, say N. config DM_SNAPSHOT tristate "Snapshot target" depends on BLK_DEV_DM Loading
drivers/md/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ obj-$(CONFIG_DM_CACHE_SMQ) += dm-cache-smq.o obj-$(CONFIG_DM_CACHE_CLEANER) += dm-cache-cleaner.o obj-$(CONFIG_DM_ERA) += dm-era.o obj-$(CONFIG_DM_LOG_WRITES) += dm-log-writes.o obj-$(CONFIG_DM_REQ_CRYPT) += dm-req-crypt.o obj-$(CONFIG_DM_ANDROID_VERITY) += dm-android-verity.o ifeq ($(CONFIG_DM_UEVENT),y) Loading