If we get a BLK_STS_RSV_CONFLICT report it to the initiator instead of
using the SAM_STAT_CHECK_CONDITION which gets translated to a generic
error that initiators don't know how to handle.

Signed-off-by: Mike Christie <[email protected]>
---
 drivers/target/target_core_iblock.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/target/target_core_iblock.c 
b/drivers/target/target_core_iblock.c
index e8cf201e59ca..2a964b57303a 100644
--- a/drivers/target/target_core_iblock.c
+++ b/drivers/target/target_core_iblock.c
@@ -309,7 +309,7 @@ static unsigned long long 
iblock_emulate_read_cap_with_block_size(
        return blocks_long;
 }
 
-static void iblock_complete_cmd(struct se_cmd *cmd)
+static void iblock_complete_cmd(struct se_cmd *cmd, blk_status_t blk_status)
 {
        struct iblock_req *ibr = cmd->priv;
        u8 status;
@@ -317,7 +317,9 @@ static void iblock_complete_cmd(struct se_cmd *cmd)
        if (!refcount_dec_and_test(&ibr->pending))
                return;
 
-       if (atomic_read(&ibr->ib_bio_err_cnt))
+       if (blk_status == BLK_STS_RSV_CONFLICT)
+               status = SAM_STAT_RESERVATION_CONFLICT;
+       else if (atomic_read(&ibr->ib_bio_err_cnt))
                status = SAM_STAT_CHECK_CONDITION;
        else
                status = SAM_STAT_GOOD;
@@ -330,6 +332,7 @@ static void iblock_bio_done(struct bio *bio)
 {
        struct se_cmd *cmd = bio->bi_private;
        struct iblock_req *ibr = cmd->priv;
+       blk_status_t blk_status = bio->bi_status;
 
        if (bio->bi_status) {
                pr_err("bio error: %p,  err: %d\n", bio, bio->bi_status);
@@ -342,7 +345,7 @@ static void iblock_bio_done(struct bio *bio)
 
        bio_put(bio);
 
-       iblock_complete_cmd(cmd);
+       iblock_complete_cmd(cmd, blk_status);
 }
 
 static struct bio *iblock_get_bio(struct se_cmd *cmd, sector_t lba, u32 sg_num,
@@ -755,7 +758,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist 
*sgl, u32 sgl_nents,
 
        if (!sgl_nents) {
                refcount_set(&ibr->pending, 1);
-               iblock_complete_cmd(cmd);
+               iblock_complete_cmd(cmd, BLK_STS_OK);
                return 0;
        }
 
@@ -813,7 +816,7 @@ iblock_execute_rw(struct se_cmd *cmd, struct scatterlist 
*sgl, u32 sgl_nents,
        }
 
        iblock_submit_bios(&list);
-       iblock_complete_cmd(cmd);
+       iblock_complete_cmd(cmd, BLK_STS_OK);
        return 0;
 
 fail_put_bios:
-- 
2.25.1

--
dm-devel mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/dm-devel

Reply via email to