From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57560) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YRLmM-0001kg-H2 for qemu-devel@nongnu.org; Fri, 27 Feb 2015 09:20:35 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YRLmJ-0000jg-44 for qemu-devel@nongnu.org; Fri, 27 Feb 2015 09:20:34 -0500 Received: from mx1.redhat.com ([209.132.183.28]:37569) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YRLmI-0000jb-RJ for qemu-devel@nongnu.org; Fri, 27 Feb 2015 09:20:31 -0500 Message-ID: <54F07D20.6090800@redhat.com> Date: Fri, 27 Feb 2015 15:20:16 +0100 From: Paolo Bonzini MIME-Version: 1.0 References: <1424839208-5195-1-git-send-email-famz@redhat.com> In-Reply-To: <1424839208-5195-1-git-send-email-famz@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH] iscsi: Handle write protected case in reopen List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Fam Zheng , qemu-devel@nongnu.org Cc: Kevin Wolf , Peter Lieven , Stefan Hajnoczi , Ronnie Sahlberg On 25/02/2015 05:40, Fam Zheng wrote: > Save the write protected flag and check before reopen. > > Signed-off-by: Fam Zheng > --- > block/iscsi.c | 20 +++++++++++--------- > 1 file changed, 11 insertions(+), 9 deletions(-) > > diff --git a/block/iscsi.c b/block/iscsi.c > index 12ddbfb..00041bf 100644 > --- a/block/iscsi.c > +++ b/block/iscsi.c > @@ -65,6 +65,7 @@ typedef struct IscsiLun { > unsigned long *allocationmap; > int cluster_sectors; > bool use_16_for_rw; > + bool write_proteced; Corrected to "write_protecTed" and applied. Paolo > } IscsiLun; > > typedef struct IscsiTask { > @@ -1268,10 +1269,6 @@ out: > /* > * We support iscsi url's on the form > * iscsi://[%@][:]// > - * > - * Note: flags are currently not used by iscsi_open. If this function > - * is changed such that flags are used, please examine iscsi_reopen_prepare() > - * to see if needs to be changed as well. > */ > static int iscsi_open(BlockDriverState *bs, QDict *options, int flags, > Error **errp) > @@ -1385,9 +1382,10 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags, > scsi_free_scsi_task(task); > task = NULL; > > + iscsilun->write_proteced = iscsi_is_write_protected(iscsilun); > /* Check the write protect flag of the LUN if we want to write */ > if (iscsilun->type == TYPE_DISK && (flags & BDRV_O_RDWR) && > - iscsi_is_write_protected(iscsilun)) { > + iscsilun->write_proteced) { > error_setg(errp, "Cannot open a write protected LUN as read-write"); > ret = -EACCES; > goto out; > @@ -1541,13 +1539,17 @@ static void iscsi_refresh_limits(BlockDriverState *bs, Error **errp) > sector_limits_lun2qemu(iscsilun->bl.opt_xfer_len, iscsilun); > } > > -/* Since iscsi_open() ignores bdrv_flags, there is nothing to do here in > - * prepare. Note that this will not re-establish a connection with an iSCSI > - * target - it is effectively a NOP. */ > +/* Note that this will not re-establish a connection with an iSCSI target - it > + * is effectively a NOP. */ > static int iscsi_reopen_prepare(BDRVReopenState *state, > BlockReopenQueue *queue, Error **errp) > { > - /* NOP */ > + IscsiLun *iscsilun = state->bs->opaque; > + > + if (state->flags & BDRV_O_RDWR && iscsilun->write_proteced) { > + error_setg(errp, "Cannot open a write protected LUN as read-write"); > + return -EACCES; > + } > return 0; > } > >