sd: factor out a sd_set_special_bvec helper
Add a helper for setting up the special_bvec instead of open coding it in three place, and use the new bvec_set_page helper to initialize special_vec. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> Link: https://lore.kernel.org/r/20230203150634.3199647-5-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
666e6550cb
commit
f1e117cbb0
|
@ -831,6 +831,19 @@ static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode)
|
||||||
blk_queue_max_discard_sectors(q, max_blocks * (logical_block_size >> 9));
|
blk_queue_max_discard_sectors(q, max_blocks * (logical_block_size >> 9));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *sd_set_special_bvec(struct request *rq, unsigned int data_len)
|
||||||
|
{
|
||||||
|
struct page *page;
|
||||||
|
|
||||||
|
page = mempool_alloc(sd_page_pool, GFP_ATOMIC);
|
||||||
|
if (!page)
|
||||||
|
return NULL;
|
||||||
|
clear_highpage(page);
|
||||||
|
bvec_set_page(&rq->special_vec, page, data_len, 0);
|
||||||
|
rq->rq_flags |= RQF_SPECIAL_PAYLOAD;
|
||||||
|
return bvec_virt(&rq->special_vec);
|
||||||
|
}
|
||||||
|
|
||||||
static blk_status_t sd_setup_unmap_cmnd(struct scsi_cmnd *cmd)
|
static blk_status_t sd_setup_unmap_cmnd(struct scsi_cmnd *cmd)
|
||||||
{
|
{
|
||||||
struct scsi_device *sdp = cmd->device;
|
struct scsi_device *sdp = cmd->device;
|
||||||
|
@ -841,19 +854,14 @@ static blk_status_t sd_setup_unmap_cmnd(struct scsi_cmnd *cmd)
|
||||||
unsigned int data_len = 24;
|
unsigned int data_len = 24;
|
||||||
char *buf;
|
char *buf;
|
||||||
|
|
||||||
rq->special_vec.bv_page = mempool_alloc(sd_page_pool, GFP_ATOMIC);
|
buf = sd_set_special_bvec(rq, data_len);
|
||||||
if (!rq->special_vec.bv_page)
|
if (!buf)
|
||||||
return BLK_STS_RESOURCE;
|
return BLK_STS_RESOURCE;
|
||||||
clear_highpage(rq->special_vec.bv_page);
|
|
||||||
rq->special_vec.bv_offset = 0;
|
|
||||||
rq->special_vec.bv_len = data_len;
|
|
||||||
rq->rq_flags |= RQF_SPECIAL_PAYLOAD;
|
|
||||||
|
|
||||||
cmd->cmd_len = 10;
|
cmd->cmd_len = 10;
|
||||||
cmd->cmnd[0] = UNMAP;
|
cmd->cmnd[0] = UNMAP;
|
||||||
cmd->cmnd[8] = 24;
|
cmd->cmnd[8] = 24;
|
||||||
|
|
||||||
buf = bvec_virt(&rq->special_vec);
|
|
||||||
put_unaligned_be16(6 + 16, &buf[0]);
|
put_unaligned_be16(6 + 16, &buf[0]);
|
||||||
put_unaligned_be16(16, &buf[2]);
|
put_unaligned_be16(16, &buf[2]);
|
||||||
put_unaligned_be64(lba, &buf[8]);
|
put_unaligned_be64(lba, &buf[8]);
|
||||||
|
@ -876,13 +884,8 @@ static blk_status_t sd_setup_write_same16_cmnd(struct scsi_cmnd *cmd,
|
||||||
u32 nr_blocks = sectors_to_logical(sdp, blk_rq_sectors(rq));
|
u32 nr_blocks = sectors_to_logical(sdp, blk_rq_sectors(rq));
|
||||||
u32 data_len = sdp->sector_size;
|
u32 data_len = sdp->sector_size;
|
||||||
|
|
||||||
rq->special_vec.bv_page = mempool_alloc(sd_page_pool, GFP_ATOMIC);
|
if (!sd_set_special_bvec(rq, data_len))
|
||||||
if (!rq->special_vec.bv_page)
|
|
||||||
return BLK_STS_RESOURCE;
|
return BLK_STS_RESOURCE;
|
||||||
clear_highpage(rq->special_vec.bv_page);
|
|
||||||
rq->special_vec.bv_offset = 0;
|
|
||||||
rq->special_vec.bv_len = data_len;
|
|
||||||
rq->rq_flags |= RQF_SPECIAL_PAYLOAD;
|
|
||||||
|
|
||||||
cmd->cmd_len = 16;
|
cmd->cmd_len = 16;
|
||||||
cmd->cmnd[0] = WRITE_SAME_16;
|
cmd->cmnd[0] = WRITE_SAME_16;
|
||||||
|
@ -908,13 +911,8 @@ static blk_status_t sd_setup_write_same10_cmnd(struct scsi_cmnd *cmd,
|
||||||
u32 nr_blocks = sectors_to_logical(sdp, blk_rq_sectors(rq));
|
u32 nr_blocks = sectors_to_logical(sdp, blk_rq_sectors(rq));
|
||||||
u32 data_len = sdp->sector_size;
|
u32 data_len = sdp->sector_size;
|
||||||
|
|
||||||
rq->special_vec.bv_page = mempool_alloc(sd_page_pool, GFP_ATOMIC);
|
if (!sd_set_special_bvec(rq, data_len))
|
||||||
if (!rq->special_vec.bv_page)
|
|
||||||
return BLK_STS_RESOURCE;
|
return BLK_STS_RESOURCE;
|
||||||
clear_highpage(rq->special_vec.bv_page);
|
|
||||||
rq->special_vec.bv_offset = 0;
|
|
||||||
rq->special_vec.bv_len = data_len;
|
|
||||||
rq->rq_flags |= RQF_SPECIAL_PAYLOAD;
|
|
||||||
|
|
||||||
cmd->cmd_len = 10;
|
cmd->cmd_len = 10;
|
||||||
cmd->cmnd[0] = WRITE_SAME;
|
cmd->cmnd[0] = WRITE_SAME;
|
||||||
|
|
Loading…
Reference in New Issue