target/iblock: Add iblock_do_unmap() helper
Add helper iblock_do_unmap() to remove duplicated code in iblock_execute_write_same_unmap() and iblock_execute_unmap(). Cc: Christoph Hellwig <hch@lst.de> Cc: Martin K. Petersen <martin.petersen@oracle.com> Cc: Nicholas Bellinger <nab@linux-iscsi.org> Signed-off-by: Asias He <asias@redhat.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
43f55bbb14
commit
dbc21c5abb
1 changed files with 25 additions and 16 deletions
|
@ -379,6 +379,21 @@ iblock_execute_sync_cache(struct se_cmd *cmd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static sense_reason_t
|
||||||
|
iblock_do_unmap(struct se_cmd *cmd, struct block_device *bdev,
|
||||||
|
sector_t lba, sector_t nolb)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = blkdev_issue_discard(bdev, lba, nolb, GFP_KERNEL, 0);
|
||||||
|
if (ret < 0) {
|
||||||
|
pr_err("blkdev_issue_discard() failed: %d\n", ret);
|
||||||
|
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static sense_reason_t
|
static sense_reason_t
|
||||||
iblock_execute_unmap(struct se_cmd *cmd)
|
iblock_execute_unmap(struct se_cmd *cmd)
|
||||||
{
|
{
|
||||||
|
@ -389,7 +404,7 @@ iblock_execute_unmap(struct se_cmd *cmd)
|
||||||
int size;
|
int size;
|
||||||
u32 range;
|
u32 range;
|
||||||
sense_reason_t ret = 0;
|
sense_reason_t ret = 0;
|
||||||
int dl, bd_dl, err;
|
int dl, bd_dl;
|
||||||
|
|
||||||
/* We never set ANC_SUP */
|
/* We never set ANC_SUP */
|
||||||
if (cmd->t_task_cdb[1])
|
if (cmd->t_task_cdb[1])
|
||||||
|
@ -446,14 +461,9 @@ iblock_execute_unmap(struct se_cmd *cmd)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = blkdev_issue_discard(ib_dev->ibd_bd, lba, range,
|
ret = iblock_do_unmap(cmd, ib_dev->ibd_bd, lba, range);
|
||||||
GFP_KERNEL, 0);
|
if (ret)
|
||||||
if (err < 0) {
|
|
||||||
pr_err("blkdev_issue_discard() failed: %d\n",
|
|
||||||
err);
|
|
||||||
ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
|
||||||
goto err;
|
goto err;
|
||||||
}
|
|
||||||
|
|
||||||
ptr += 16;
|
ptr += 16;
|
||||||
size -= 16;
|
size -= 16;
|
||||||
|
@ -469,15 +479,14 @@ err:
|
||||||
static sense_reason_t
|
static sense_reason_t
|
||||||
iblock_execute_write_same_unmap(struct se_cmd *cmd)
|
iblock_execute_write_same_unmap(struct se_cmd *cmd)
|
||||||
{
|
{
|
||||||
struct iblock_dev *ib_dev = IBLOCK_DEV(cmd->se_dev);
|
struct block_device *bdev = IBLOCK_DEV(cmd->se_dev)->ibd_bd;
|
||||||
int rc;
|
sector_t lba = cmd->t_task_lba;
|
||||||
|
sector_t nolb = sbc_get_write_same_sectors(cmd);
|
||||||
|
int ret;
|
||||||
|
|
||||||
rc = blkdev_issue_discard(ib_dev->ibd_bd, cmd->t_task_lba,
|
ret = iblock_do_unmap(cmd, bdev, lba, nolb);
|
||||||
sbc_get_write_same_sectors(cmd), GFP_KERNEL, 0);
|
if (ret)
|
||||||
if (rc < 0) {
|
return ret;
|
||||||
pr_warn("blkdev_issue_discard() failed: %d\n", rc);
|
|
||||||
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
target_complete_cmd(cmd, GOOD);
|
target_complete_cmd(cmd, GOOD);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Reference in a new issue