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
prev 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).