mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-24 03:59:52 +00:00
iscsi: Handle write protected case in reopen
Save the write protected flag and check before reopen. Signed-off-by: Fam Zheng <famz@redhat.com> Message-Id: <1424839208-5195-1-git-send-email-famz@redhat.com> [Fixed typo in the name of the new field. - Paolo] Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
8af738b3ee
commit
43ae8fb10c
@ -65,6 +65,7 @@ typedef struct IscsiLun {
|
|||||||
unsigned long *allocationmap;
|
unsigned long *allocationmap;
|
||||||
int cluster_sectors;
|
int cluster_sectors;
|
||||||
bool use_16_for_rw;
|
bool use_16_for_rw;
|
||||||
|
bool write_protected;
|
||||||
} IscsiLun;
|
} IscsiLun;
|
||||||
|
|
||||||
typedef struct IscsiTask {
|
typedef struct IscsiTask {
|
||||||
@ -1268,10 +1269,6 @@ out:
|
|||||||
/*
|
/*
|
||||||
* We support iscsi url's on the form
|
* We support iscsi url's on the form
|
||||||
* iscsi://[<username>%<password>@]<host>[:<port>]/<targetname>/<lun>
|
* iscsi://[<username>%<password>@]<host>[:<port>]/<targetname>/<lun>
|
||||||
*
|
|
||||||
* 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,
|
static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
@ -1385,9 +1382,10 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
|
|||||||
scsi_free_scsi_task(task);
|
scsi_free_scsi_task(task);
|
||||||
task = NULL;
|
task = NULL;
|
||||||
|
|
||||||
|
iscsilun->write_protected = iscsi_is_write_protected(iscsilun);
|
||||||
/* Check the write protect flag of the LUN if we want to write */
|
/* Check the write protect flag of the LUN if we want to write */
|
||||||
if (iscsilun->type == TYPE_DISK && (flags & BDRV_O_RDWR) &&
|
if (iscsilun->type == TYPE_DISK && (flags & BDRV_O_RDWR) &&
|
||||||
iscsi_is_write_protected(iscsilun)) {
|
iscsilun->write_protected) {
|
||||||
error_setg(errp, "Cannot open a write protected LUN as read-write");
|
error_setg(errp, "Cannot open a write protected LUN as read-write");
|
||||||
ret = -EACCES;
|
ret = -EACCES;
|
||||||
goto out;
|
goto out;
|
||||||
@ -1541,13 +1539,17 @@ static void iscsi_refresh_limits(BlockDriverState *bs, Error **errp)
|
|||||||
sector_limits_lun2qemu(iscsilun->bl.opt_xfer_len, iscsilun);
|
sector_limits_lun2qemu(iscsilun->bl.opt_xfer_len, iscsilun);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Since iscsi_open() ignores bdrv_flags, there is nothing to do here in
|
/* Note that this will not re-establish a connection with an iSCSI target - it
|
||||||
* prepare. Note that this will not re-establish a connection with an iSCSI
|
* is effectively a NOP. */
|
||||||
* target - it is effectively a NOP. */
|
|
||||||
static int iscsi_reopen_prepare(BDRVReopenState *state,
|
static int iscsi_reopen_prepare(BDRVReopenState *state,
|
||||||
BlockReopenQueue *queue, Error **errp)
|
BlockReopenQueue *queue, Error **errp)
|
||||||
{
|
{
|
||||||
/* NOP */
|
IscsiLun *iscsilun = state->bs->opaque;
|
||||||
|
|
||||||
|
if (state->flags & BDRV_O_RDWR && iscsilun->write_protected) {
|
||||||
|
error_setg(errp, "Cannot open a write protected LUN as read-write");
|
||||||
|
return -EACCES;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user