Patchwork [1/2] ISCSI: Set number of blocks to 0 for blank CDROM devices

login
register
mail settings
Submitter ronniesahlberg@gmail.com
Date Aug. 17, 2012, 2:36 a.m.
Message ID <1345170981-7738-2-git-send-email-ronniesahlberg@gmail.com>
Download mbox | patch
Permalink /patch/178134/
State New
Headers show

Comments

ronniesahlberg@gmail.com - Aug. 17, 2012, 2:36 a.m.
The number of blocks of the device is used to compute the device size
in bdrv_getlength()/iscsi_getlength().
For MMC devices, the ReturnedLogicalBlockAddress in the READCAPACITY10
has a special meaning when it is 0.
In this case it does not mean that LBA 0 is the last accessible LBA,
and thus the device has 1 readable block, but instead it means that the
disc is blank and there are no readable blocks.

This change ensures that when the iSCSI LUN is loaded with a blank
DVD-R disk or similar that bdrv_getlength() will return the correct
size of the device as 0 bytes.

Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
---
 block/iscsi.c |    7 ++++++-
 1 files changed, 6 insertions(+), 1 deletions(-)
Paolo Bonzini - Aug. 18, 2012, 9:57 p.m.
Il 17/08/2012 04:36, Ronnie Sahlberg ha scritto:
> The number of blocks of the device is used to compute the device size
> in bdrv_getlength()/iscsi_getlength().
> For MMC devices, the ReturnedLogicalBlockAddress in the READCAPACITY10
> has a special meaning when it is 0.
> In this case it does not mean that LBA 0 is the last accessible LBA,
> and thus the device has 1 readable block, but instead it means that the
> disc is blank and there are no readable blocks.
> 
> This change ensures that when the iSCSI LUN is loaded with a blank
> DVD-R disk or similar that bdrv_getlength() will return the correct
> size of the device as 0 bytes.
> 
> Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
> ---
>  block/iscsi.c |    7 ++++++-
>  1 files changed, 6 insertions(+), 1 deletions(-)
> 
> diff --git a/block/iscsi.c b/block/iscsi.c
> index bb9cf82..fb420ea 100644
> --- a/block/iscsi.c
> +++ b/block/iscsi.c
> @@ -717,7 +717,12 @@ iscsi_readcapacity10_cb(struct iscsi_context *iscsi, int status,
>      }
>  
>      itask->iscsilun->block_size = rc10->block_size;
> -    itask->iscsilun->num_blocks = rc10->lba + 1;
> +    if (rc10->lba == 0) {
> +        /* blank disk loaded */
> +        itask->iscsilun->num_blocks = 0;
> +    } else {
> +        itask->iscsilun->num_blocks = rc10->lba + 1;
> +    }
>      itask->bs->total_sectors    = itask->iscsilun->num_blocks *
>                                 itask->iscsilun->block_size / BDRV_SECTOR_SIZE ;
>  
> 

Thanks, applied to SCSI branch.  We'll see whether this hits 1.2.

Paolo
ronniesahlberg@gmail.com - Aug. 18, 2012, 10:06 p.m.
On Sun, Aug 19, 2012 at 7:57 AM, Paolo Bonzini <pbonzini@redhat.com> wrote:
> Il 17/08/2012 04:36, Ronnie Sahlberg ha scritto:
>> The number of blocks of the device is used to compute the device size
>> in bdrv_getlength()/iscsi_getlength().
>> For MMC devices, the ReturnedLogicalBlockAddress in the READCAPACITY10
>> has a special meaning when it is 0.
>> In this case it does not mean that LBA 0 is the last accessible LBA,
>> and thus the device has 1 readable block, but instead it means that the
>> disc is blank and there are no readable blocks.
>>
>> This change ensures that when the iSCSI LUN is loaded with a blank
>> DVD-R disk or similar that bdrv_getlength() will return the correct
>> size of the device as 0 bytes.
>>
>> Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
>> ---
>>  block/iscsi.c |    7 ++++++-
>>  1 files changed, 6 insertions(+), 1 deletions(-)
>>
>> diff --git a/block/iscsi.c b/block/iscsi.c
>> index bb9cf82..fb420ea 100644
>> --- a/block/iscsi.c
>> +++ b/block/iscsi.c
>> @@ -717,7 +717,12 @@ iscsi_readcapacity10_cb(struct iscsi_context *iscsi, int status,
>>      }
>>
>>      itask->iscsilun->block_size = rc10->block_size;
>> -    itask->iscsilun->num_blocks = rc10->lba + 1;
>> +    if (rc10->lba == 0) {
>> +        /* blank disk loaded */
>> +        itask->iscsilun->num_blocks = 0;
>> +    } else {
>> +        itask->iscsilun->num_blocks = rc10->lba + 1;
>> +    }
>>      itask->bs->total_sectors    = itask->iscsilun->num_blocks *
>>                                 itask->iscsilun->block_size / BDRV_SECTOR_SIZE ;
>>
>>
>
> Thanks, applied to SCSI branch.  We'll see whether this hits 1.2.

This patch only matters for the use case of having empty/blank media
loaded into an iscsi cdrom.
I doubt being able to "burn" data to an iscsi drive is very important or urgent,
so it is fine with me to delay until post 1.2

regards
ronnie sahlberg

Patch

diff --git a/block/iscsi.c b/block/iscsi.c
index bb9cf82..fb420ea 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -717,7 +717,12 @@  iscsi_readcapacity10_cb(struct iscsi_context *iscsi, int status,
     }
 
     itask->iscsilun->block_size = rc10->block_size;
-    itask->iscsilun->num_blocks = rc10->lba + 1;
+    if (rc10->lba == 0) {
+        /* blank disk loaded */
+        itask->iscsilun->num_blocks = 0;
+    } else {
+        itask->iscsilun->num_blocks = rc10->lba + 1;
+    }
     itask->bs->total_sectors    = itask->iscsilun->num_blocks *
                                itask->iscsilun->block_size / BDRV_SECTOR_SIZE ;