From: Paolo Bonzini <pbonzini@redhat.com>
To: Peter Lieven <pl@kamp.de>, 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:09:20 +0100 [thread overview]
Message-ID: <54522A70.7070206@redhat.com> (raw)
In-Reply-To: <54522467.9060008@kamp.de>
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;
}
Paolo
next prev parent reply other threads:[~2014-10-31 15:51 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 [this message]
2014-10-30 12:31 ` Fam Zheng
2014-10-30 12:55 ` Peter Lieven
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=54522A70.7070206@redhat.com \
--to=pbonzini@redhat.com \
--cc=famz@redhat.com \
--cc=kwolf@redhat.com \
--cc=pl@kamp.de \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.