diff mbox series

scsi: fix bug scsi resp sense is 0 when expand disk

Message ID 20210629071226.3890105-1-wangjie88@huawei.com (mailing list archive)
State New, archived
Headers show
Series scsi: fix bug scsi resp sense is 0 when expand disk | expand

Commit Message

Jie Wang June 29, 2021, 7:12 a.m. UTC
A large number of I/Os are delivered during disk capacity expansion.
Many I/Os are extracted from the Vring ring, and each one registers
reqops_unit_attention when new scsi req.
If the first registered req takes the ua, the ua is cleared
and other registered req is return 0 sense.

Let's add req_has_ua to avoid this kind of thing.

Signed-off-by: suruifeng <suruifeng@huawei.com>
Signed-off-by: Jie Wang <wangjie88@huawei.com>
---
 hw/scsi/scsi-bus.c     | 10 ++++++++--
 include/hw/scsi/scsi.h |  1 +
 2 files changed, 9 insertions(+), 2 deletions(-)

Comments

Jie Wang July 1, 2021, 1:21 a.m. UTC | #1
ping.

On 2021/6/29 15:12, Jie Wang wrote:
> A large number of I/Os are delivered during disk capacity expansion.
> Many I/Os are extracted from the Vring ring, and each one registers
> reqops_unit_attention when new scsi req.
> If the first registered req takes the ua, the ua is cleared
> and other registered req is return 0 sense.
> 
> Let's add req_has_ua to avoid this kind of thing.
> 
> Signed-off-by: suruifeng <suruifeng@huawei.com>
> Signed-off-by: Jie Wang <wangjie88@huawei.com>
> ---
>  hw/scsi/scsi-bus.c     | 10 ++++++++--
>  include/hw/scsi/scsi.h |  1 +
>  2 files changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
> index 2a0a98cac9..20ec4a5f74 100644
> --- a/hw/scsi/scsi-bus.c
> +++ b/hw/scsi/scsi-bus.c
> @@ -722,7 +722,13 @@ SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag, uint32_t lun,
>            * If we already have a pending unit attention condition,
>            * report this one before triggering another one.
>            */
> -         !(buf[0] == REQUEST_SENSE && d->sense_is_ua))) {
> +         !(buf[0] == REQUEST_SENSE && d->sense_is_ua)) &&
> +         /*
> +          * If we already have a req register ua ops,
> +          * other req can not register.
> +          */
> +         !d->req_has_ua) {
> +        d->req_has_ua = true;
>          ops = &reqops_unit_attention;
>      } else if (lun != d->lun ||
>                 buf[0] == REPORT_LUNS ||
> @@ -822,7 +828,7 @@ static void scsi_clear_unit_attention(SCSIRequest *req)
>            ua->ascq == SENSE_CODE(REPORTED_LUNS_CHANGED).ascq)) {
>          return;
>      }
> -
> +    req->dev->req_has_ua = false;
>      *ua = SENSE_CODE(NO_SENSE);
>  }
>  
> diff --git a/include/hw/scsi/scsi.h b/include/hw/scsi/scsi.h
> index 0b726bc78c..3d0cda68f6 100644
> --- a/include/hw/scsi/scsi.h
> +++ b/include/hw/scsi/scsi.h
> @@ -74,6 +74,7 @@ struct SCSIDevice
>      BlockConf conf;
>      SCSISense unit_attention;
>      bool sense_is_ua;
> +    bool req_has_ua;
>      uint8_t sense[SCSI_SENSE_BUF_SIZE];
>      uint32_t sense_len;
>      QTAILQ_HEAD(, SCSIRequest) requests;
>
diff mbox series

Patch

diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index 2a0a98cac9..20ec4a5f74 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -722,7 +722,13 @@  SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag, uint32_t lun,
           * If we already have a pending unit attention condition,
           * report this one before triggering another one.
           */
-         !(buf[0] == REQUEST_SENSE && d->sense_is_ua))) {
+         !(buf[0] == REQUEST_SENSE && d->sense_is_ua)) &&
+         /*
+          * If we already have a req register ua ops,
+          * other req can not register.
+          */
+         !d->req_has_ua) {
+        d->req_has_ua = true;
         ops = &reqops_unit_attention;
     } else if (lun != d->lun ||
                buf[0] == REPORT_LUNS ||
@@ -822,7 +828,7 @@  static void scsi_clear_unit_attention(SCSIRequest *req)
           ua->ascq == SENSE_CODE(REPORTED_LUNS_CHANGED).ascq)) {
         return;
     }
-
+    req->dev->req_has_ua = false;
     *ua = SENSE_CODE(NO_SENSE);
 }
 
diff --git a/include/hw/scsi/scsi.h b/include/hw/scsi/scsi.h
index 0b726bc78c..3d0cda68f6 100644
--- a/include/hw/scsi/scsi.h
+++ b/include/hw/scsi/scsi.h
@@ -74,6 +74,7 @@  struct SCSIDevice
     BlockConf conf;
     SCSISense unit_attention;
     bool sense_is_ua;
+    bool req_has_ua;
     uint8_t sense[SCSI_SENSE_BUF_SIZE];
     uint32_t sense_len;
     QTAILQ_HEAD(, SCSIRequest) requests;