mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
block: provide a request helper for user integrity segments
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>
This commit is contained in:
parent
0d7cb52fe4
commit
d2c5b1facc
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user