]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
block: provide a request helper for user integrity segments
authorKeith Busch <kbusch@kernel.org>
Fri, 13 Sep 2024 18:28:50 +0000 (11:28 -0700)
committerJens Axboe <axboe@kernel.dk>
Fri, 13 Sep 2024 18:31:45 +0000 (12:31 -0600)
Provide a helper to keep the request flags and nr_integrity_segments in
sync with the bio's integrity payload. This is an integrity equivalent
to the normal data helper function, 'blk_rq_map_user()'.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: Kanchan Joshi <joshi.k@samsung.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Link: https://lore.kernel.org/r/20240913182854.2445457-6-kbusch@meta.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bio-integrity.c
block/blk-integrity.c
drivers/nvme/host/ioctl.c
include/linux/blk-integrity.h

index 8d1fb38f745f9d8aadfb75d852380f08c1950fa8..357a022eed4118978a54ad3d07a1ca03bda5c745 100644 (file)
@@ -371,7 +371,6 @@ free_bvec:
                kfree(bvec);
        return ret;
 }
-EXPORT_SYMBOL_GPL(bio_integrity_map_user);
 
 /**
  * bio_integrity_prep - Prepare bio for integrity I/O
index 84065691aaed0419cb8282c2bd32fa287442454d..ddc742d58330b16770ae4ed753b54d97cd254b07 100644 (file)
@@ -107,6 +107,20 @@ new_segment:
 }
 EXPORT_SYMBOL(blk_rq_map_integrity_sg);
 
+int blk_rq_integrity_map_user(struct request *rq, void __user *ubuf,
+                             ssize_t bytes, u32 seed)
+{
+       int ret = bio_integrity_map_user(rq->bio, ubuf, bytes, seed);
+
+       if (ret)
+               return ret;
+
+       rq->nr_integrity_segments = blk_rq_count_integrity_sg(rq->q, rq->bio);
+       rq->cmd_flags |= REQ_INTEGRITY;
+       return 0;
+}
+EXPORT_SYMBOL_GPL(blk_rq_integrity_map_user);
+
 bool blk_integrity_merge_rq(struct request_queue *q, struct request *req,
                            struct request *next)
 {
index 1d769c842fbf53eab68b33e96099b1054319fa14..b9b79ccfabf8ab17f7fe4370779d4e2f79822802 100644 (file)
@@ -3,7 +3,6 @@
  * Copyright (c) 2011-2014, Intel Corporation.
  * Copyright (c) 2017-2021 Christoph Hellwig.
  */
-#include <linux/bio-integrity.h>
 #include <linux/blk-integrity.h>
 #include <linux/ptrace.h>      /* for force_successful_syscall_return */
 #include <linux/nvme_ioctl.h>
@@ -153,11 +152,10 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer,
                bio_set_dev(bio, bdev);
 
        if (has_metadata) {
-               ret = bio_integrity_map_user(bio, meta_buffer, meta_len,
-                                            meta_seed);
+               ret = blk_rq_integrity_map_user(req, meta_buffer, meta_len,
+                                               meta_seed);
                if (ret)
                        goto out_unmap;
-               req->cmd_flags |= REQ_INTEGRITY;
        }
 
        return ret;
index de98049b7ded91df8a0986e22cf1b77c2b0d3f98..793dbb1e0672dc3dd15496caf489413e93de6fe3 100644 (file)
@@ -28,6 +28,8 @@ static inline bool queue_limits_stack_integrity_bdev(struct queue_limits *t,
 int blk_rq_map_integrity_sg(struct request_queue *, struct bio *,
                                   struct scatterlist *);
 int blk_rq_count_integrity_sg(struct request_queue *, struct bio *);
+int blk_rq_integrity_map_user(struct request *rq, void __user *ubuf,
+                             ssize_t bytes, u32 seed);
 
 static inline bool
 blk_integrity_queue_supports_integrity(struct request_queue *q)
@@ -102,6 +104,13 @@ static inline int blk_rq_map_integrity_sg(struct request_queue *q,
 {
        return 0;
 }
+static inline int blk_rq_integrity_map_user(struct request *rq,
+                                           void __user *ubuf,
+                                           ssize_t bytes,
+                                           u32 seed)
+{
+       return -EINVAL;
+}
 static inline struct blk_integrity *bdev_get_integrity(struct block_device *b)
 {
        return NULL;