block: Do not cache device size for removable media

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>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Stefan Hajnoczi 2011-03-29 20:04:41 +01:00 committed by Kevin Wolf
parent b8c6d09589
commit 46a4e4e608
1 changed files with 5 additions and 7 deletions

12
block.c
View File

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