diff mbox

[2/3] block: Do not cache device size for removable media

Message ID 1300902055-25850-3-git-send-email-stefanha@linux.vnet.ibm.com
State New
Headers show

Commit Message

Stefan Hajnoczi March 23, 2011, 5:40 p.m. UTC
The block layer caches the device size to avoid doing lseek(fd, 0,
SEEK_END) every time this value is needed.  For removable media the
device size becomes stale if a new medium is inserted.  This patch
simply prevents device size caching for removable media.

A smarter solution is to update the cached device size when a new medium
is inserted.  Given that there are currently bugs with CD-ROM media
change I do not want to implement that approach until we've gotten
things correct first.

Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
---
 block.c |   12 +++++-------
 1 files changed, 5 insertions(+), 7 deletions(-)

Comments

Juan Quintela March 23, 2011, 8:18 p.m. UTC | #1
Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> wrote:
> The block layer caches the device size to avoid doing lseek(fd, 0,
> SEEK_END) every time this value is needed.  For removable media the
> device size becomes stale if a new medium is inserted.  This patch
> simply prevents device size caching for removable media.
>
> A smarter solution is to update the cached device size when a new medium
> is inserted.  Given that there are currently bugs with CD-ROM media
> change I do not want to implement that approach until we've gotten
> things correct first.
>
> Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
> ---
>  block.c |   12 +++++-------
>  1 files changed, 5 insertions(+), 7 deletions(-)
>
> diff --git a/block.c b/block.c
> index 8f224b4..89f6ded 100644
> --- a/block.c
> +++ b/block.c
> @@ -1153,14 +1153,12 @@ int64_t bdrv_getlength(BlockDriverState *bs)
>      if (!drv)
>          return -ENOMEDIUM;
>  
> -    /* Fixed size devices use the total_sectors value for speed instead of
> -       issuing a length query (like lseek) on each call.  Also, legacy block
> -       drivers don't provide a bdrv_getlength function and must use
> -       total_sectors. */
> -    if (!bs->growable || !drv->bdrv_getlength) {

       if (!bs->growable || !bs->removable|| !drv->bdrv_getlength) {

changing just the test don't give exactly the same result?

> -        return bs->total_sectors * BDRV_SECTOR_SIZE;
> -    }
> -    return drv->bdrv_getlength(bs);
> +    if (bs->growable || bs->removable) {
> +        if (drv->bdrv_getlength) {
> +            return drv->bdrv_getlength(bs);
> +        }
> +    }
> +    return bs->total_sectors * BDRV_SECTOR_SIZE;
>  }
>  
>  /* return 0 as number of sectors if no device present or error */
Stefan Hajnoczi March 23, 2011, 8:46 p.m. UTC | #2
On Wed, Mar 23, 2011 at 8:18 PM, Juan Quintela <quintela@redhat.com> wrote:
> Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> wrote:
>> diff --git a/block.c b/block.c
>> index 8f224b4..89f6ded 100644
>> --- a/block.c
>> +++ b/block.c
>> @@ -1153,14 +1153,12 @@ int64_t bdrv_getlength(BlockDriverState *bs)
>>      if (!drv)
>>          return -ENOMEDIUM;
>>
>> -    /* Fixed size devices use the total_sectors value for speed instead of
>> -       issuing a length query (like lseek) on each call.  Also, legacy block
>> -       drivers don't provide a bdrv_getlength function and must use
>> -       total_sectors. */
>> -    if (!bs->growable || !drv->bdrv_getlength) {
>
>       if (!bs->growable || !bs->removable|| !drv->bdrv_getlength) {
>
> changing just the test don't give exactly the same result?

I didn't like the inverted logic.  I think it's clearer this way.

Stefan
diff mbox

Patch

diff --git a/block.c b/block.c
index 8f224b4..89f6ded 100644
--- a/block.c
+++ b/block.c
@@ -1153,14 +1153,12 @@  int64_t bdrv_getlength(BlockDriverState *bs)
     if (!drv)
         return -ENOMEDIUM;
 
-    /* Fixed size devices use the total_sectors value for speed instead of
-       issuing a length query (like lseek) on each call.  Also, legacy block
-       drivers don't provide a bdrv_getlength function and must use
-       total_sectors. */
-    if (!bs->growable || !drv->bdrv_getlength) {
-        return bs->total_sectors * BDRV_SECTOR_SIZE;
-    }
-    return drv->bdrv_getlength(bs);
+    if (bs->growable || bs->removable) {
+        if (drv->bdrv_getlength) {
+            return drv->bdrv_getlength(bs);
+        }
+    }
+    return bs->total_sectors * BDRV_SECTOR_SIZE;
 }
 
 /* return 0 as number of sectors if no device present or error */