[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-block] [PATCH] send readcapacity10 when readcapacity16 failed

From: ronnie sahlberg
Subject: Re: [Qemu-block] [PATCH] send readcapacity10 when readcapacity16 failed
Date: Tue, 5 Jan 2016 11:57:17 -0800

MMC devices:
READ CAPACITY 10 support is mandatory.
No support for READ CAPACITY 16

SBC devices:
READ CAPACITY 10 is mandatory
READ CAPACITY 16 support is only required when you have thin provisioning or protection information (or if the device is >2^32 blocks)
Almost all, but apparently not all, SBC devices support both.

For SBC devices you probably want to start with RC16 and only fallback to RC10 if you get INVALID_OPCODE.
You start with RC16 since this is the way to discover if you have thin provisioning or special protection information.

For MMC devices you could try the "try RC16 first and fallback to RC10" but as probably almost no MMC devices support RC16 it makes little sense to do so.

On Tue, Jan 5, 2016 at 11:42 AM, John Snow <address@hidden> wrote:

On 12/28/2015 10:32 PM, Zhu Lingshan wrote:
> When play with Dell MD3000 target, for sure it
> is a TYPE_DISK, but readcapacity16 would fail.
> Then we find that readcapacity10 succeeded. It
> looks like the target just support readcapacity10
> even through it is a TYPE_DISK or have some
> TYPE_ROM characteristics.
> This patch can give a chance to send
> readcapacity16 when readcapacity10 failed.
> This patch is not harmful to original pathes
> Signed-off-by: Zhu Lingshan <address@hidden>
> ---
>  block/iscsi.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> diff --git a/block/iscsi.c b/block/iscsi.c
> index bd1f1bf..c8d167f 100644
> --- a/block/iscsi.c
> +++ b/block/iscsi.c
> @@ -1243,8 +1243,9 @@ static void iscsi_readcapacity_sync(IscsiLun *iscsilun, Error **errp)
>                      iscsilun->lbprz = !!rc16->lbprz;
>                      iscsilun->use_16_for_rw = (rc16->returned_lba > 0xffffffff);
>                  }
> +                break;
>              }
> -            break;
> +        //fall through to try readcapacity10 instead
>          case TYPE_ROM:
>              task = iscsi_readcapacity10_sync(iscsilun->iscsi, iscsilun->lun, 0, 0);
>              if (task != NULL && task->status == SCSI_STATUS_GOOD) {

For the uninitiated, why does readcapacity16 fail?

My gut feeling is that this is a hack, because:

- Either readcapacity16 should work, or
- We shouldn't be choosing 10/16 based on the target type to begin with

but I don't know much about iSCSI, so maybe You, Paolo or Peter could
fill me in.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]