qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Peter Lieven <pl@kamp.de>
To: Paolo Bonzini <pbonzini@redhat.com>, Fam Zheng <famz@redhat.com>,
	qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Ronnie Sahlberg <ronniesahlberg@gmail.com>
Subject: Re: [Qemu-devel] [PATCH v2] iscsi: Refuse to open as writable if the LUN is write protected
Date: Thu, 30 Oct 2014 13:55:24 +0100	[thread overview]
Message-ID: <5452353C.4060706@kamp.de> (raw)
In-Reply-To: <54522A70.7070206@redhat.com>

On 30.10.2014 13:09, Paolo Bonzini wrote:
>
> On 10/30/2014 12:43 PM, Peter Lieven wrote:
>> On 30.10.2014 12:23, Fam Zheng wrote:
>>> Before, when a write protected iSCSI target is attached as scsi-disk
>>> with BDRV_O_RDWR, we report it as writable, while in fact all writes
>>> will fail.
>>>
>>> One way to improve this is to report write protect flag as true to
>>> guest, but a even better way is to refuse using a write protected LUN to
>>> guest.
>>>
>>> Target write protect flag is checked with a mode sense query.
>>>
>>> Signed-off-by: Fam Zheng <famz@redhat.com>
>>> ---
>>> v2: Improve error message.
>>>       Fall back to a warning if mode sense failed.
>>>       Check unmarshal return value.
>>> ---
>>>    block/iscsi.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
>>>    1 file changed, 46 insertions(+)
>>>
>>> diff --git a/block/iscsi.c b/block/iscsi.c
>>> index 233f462..dcacbca 100644
>>> --- a/block/iscsi.c
>>> +++ b/block/iscsi.c
>>> @@ -1219,6 +1219,44 @@ static void
>>> iscsi_attach_aio_context(BlockDriverState *bs,
>>>                  qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + NOP_INTERVAL);
>>>    }
>>>    +static bool iscsi_is_write_protected(IscsiLun *iscsilun)
>>> +{
>>> +    struct scsi_task *task;
>>> +    struct scsi_mode_sense *ms = NULL;
>>> +
>>> +    task = iscsi_modesense6_sync(iscsilun->iscsi, iscsilun->lun,
>>> +            1, SCSI_MODESENSE_PC_CURRENT,
>>> +            0x3F,
>>> +            0, 255);
>>> +
>>> +    if (task == NULL) {
>>> +        error_report("Failed to send MODE_SENSE6 command: %s",
>>> +                     iscsi_get_error(iscsilun->iscsi));
>>> +        goto out;
>>> +    }
>>> +
>>> +    if (task->status != SCSI_STATUS_GOOD) {
>>> +        error_report("MODE_SENSE6 failed: %s",
>>> +                     iscsi_get_error(iscsilun->iscsi));
>>> +        goto out;
>>> +    }
>>> +    ms = scsi_datain_unmarshall(task);
>>> +    if (!ms) {
>>> +        error_report("MODE_SENSE6 failed: %s",
>>> +                     iscsi_get_error(iscsilun->iscsi));
>>> +        goto out;
>>> +    }
>>> +out:
>>> +    if (task) {
>>> +        scsi_free_scsi_task(task);
>>> +    }
>>> +    if (!ms) {
>> ms points to freed memory after scsi_free_scsi_task.
>> furthermore the requests likely fails with task->status != SCSI_STATUS_GOOD
>> if the modesense implementation is broken etc.
> This is a mix of your and Fam's code.  Looks good?
>
> static bool iscsi_is_write_protected(IscsiLun *iscsilun)
> {
>      struct scsi_task *task;
>      struct scsi_mode_sense *ms = NULL;
>      bool wrprotected = false;
>
>      task = iscsi_modesense6_sync(iscsilun->iscsi, iscsilun->lun,
>                                   1, SCSI_MODESENSE_PC_CURRENT,
>                                   0x3F, 0, 255);
>      if (task == NULL) {
>          error_report("Failed to send MODE_SENSE(6) command: %s",
>                       iscsi_get_error(iscsilun->iscsi));
>          goto out;
>      }
>
>      if (task->status != SCSI_STATUS_GOOD) {
>          error_report("MODE_SENSE(6) failed: %s",
>                       iscsi_get_error(iscsilun->iscsi));
>          goto out;
>      }
>      ms = scsi_datain_unmarshall(task);
>      if (!ms) {
>          error_report("Failed to unmarshall MODE_SENSE(6) data: %s",
>                       iscsi_get_error(iscsilun->iscsi));
>          goto out;
>      }
>      wrprotected = ms->device_specific_parameter & 0x80;
>
> out:
>      if (task) {
>          scsi_free_scsi_task(task);
>      }
>      return wrprotected;
> }

i would add the prefix "iSCSI: " to the error_reports as we
have it for other outputs. (noticed this after writing my mail).

Otherwise looks good.

Reviewed-by: Peter Lieven <pl@kamp.de>

and actually also

Tested-by: Peter Lieven <pl@kamp.de>

Peter

      parent reply	other threads:[~2014-10-31 15:52 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-30 11:23 [Qemu-devel] [PATCH v2] iscsi: Refuse to open as writable if the LUN is write protected Fam Zheng
2014-10-30 11:43 ` Peter Lieven
2014-10-30 12:09   ` Paolo Bonzini
2014-10-30 12:31     ` Fam Zheng
2014-10-30 12:55     ` Peter Lieven [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5452353C.4060706@kamp.de \
    --to=pl@kamp.de \
    --cc=famz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=ronniesahlberg@gmail.com \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).