| From foo@baz Wed Aug 22 09:42:09 CEST 2018 |
| From: Zhouyang Jia <jiazhouyang09@gmail.com> |
| Date: Sat, 16 Jun 2018 01:05:01 +0800 |
| Subject: scsi: xen-scsifront: add error handling for xenbus_printf |
| |
| From: Zhouyang Jia <jiazhouyang09@gmail.com> |
| |
| [ Upstream commit 93efbd39870474cc536b9caf4a6efeb03b0bc56f ] |
| |
| When xenbus_printf fails, the lack of error-handling code may |
| cause unexpected results. |
| |
| This patch adds error-handling code after calling xenbus_printf. |
| |
| Signed-off-by: Zhouyang Jia <jiazhouyang09@gmail.com> |
| Reviewed-by: Juergen Gross <jgross@suse.com> |
| Signed-off-by: Juergen Gross <jgross@suse.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/scsi/xen-scsifront.c | 33 ++++++++++++++++++++++++++------- |
| 1 file changed, 26 insertions(+), 7 deletions(-) |
| |
| --- a/drivers/scsi/xen-scsifront.c |
| +++ b/drivers/scsi/xen-scsifront.c |
| @@ -676,10 +676,17 @@ static int scsifront_dev_reset_handler(s |
| static int scsifront_sdev_configure(struct scsi_device *sdev) |
| { |
| struct vscsifrnt_info *info = shost_priv(sdev->host); |
| + int err; |
| |
| - if (info && current == info->curr) |
| - xenbus_printf(XBT_NIL, info->dev->nodename, |
| + if (info && current == info->curr) { |
| + err = xenbus_printf(XBT_NIL, info->dev->nodename, |
| info->dev_state_path, "%d", XenbusStateConnected); |
| + if (err) { |
| + xenbus_dev_error(info->dev, err, |
| + "%s: writing dev_state_path", __func__); |
| + return err; |
| + } |
| + } |
| |
| return 0; |
| } |
| @@ -687,10 +694,15 @@ static int scsifront_sdev_configure(stru |
| static void scsifront_sdev_destroy(struct scsi_device *sdev) |
| { |
| struct vscsifrnt_info *info = shost_priv(sdev->host); |
| + int err; |
| |
| - if (info && current == info->curr) |
| - xenbus_printf(XBT_NIL, info->dev->nodename, |
| + if (info && current == info->curr) { |
| + err = xenbus_printf(XBT_NIL, info->dev->nodename, |
| info->dev_state_path, "%d", XenbusStateClosed); |
| + if (err) |
| + xenbus_dev_error(info->dev, err, |
| + "%s: writing dev_state_path", __func__); |
| + } |
| } |
| |
| static struct scsi_host_template scsifront_sht = { |
| @@ -1025,9 +1037,12 @@ static void scsifront_do_lun_hotplug(str |
| |
| if (scsi_add_device(info->host, chn, tgt, lun)) { |
| dev_err(&dev->dev, "scsi_add_device\n"); |
| - xenbus_printf(XBT_NIL, dev->nodename, |
| + err = xenbus_printf(XBT_NIL, dev->nodename, |
| info->dev_state_path, |
| "%d", XenbusStateClosed); |
| + if (err) |
| + xenbus_dev_error(dev, err, |
| + "%s: writing dev_state_path", __func__); |
| } |
| break; |
| case VSCSIFRONT_OP_DEL_LUN: |
| @@ -1041,10 +1056,14 @@ static void scsifront_do_lun_hotplug(str |
| } |
| break; |
| case VSCSIFRONT_OP_READD_LUN: |
| - if (device_state == XenbusStateConnected) |
| - xenbus_printf(XBT_NIL, dev->nodename, |
| + if (device_state == XenbusStateConnected) { |
| + err = xenbus_printf(XBT_NIL, dev->nodename, |
| info->dev_state_path, |
| "%d", XenbusStateConnected); |
| + if (err) |
| + xenbus_dev_error(dev, err, |
| + "%s: writing dev_state_path", __func__); |
| + } |
| break; |
| default: |
| break; |