diff options
author | Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> | 2011-03-29 20:04:41 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2011-04-07 13:51:47 +0200 |
commit | 46a4e4e6085c1e5ae498e350009ff6d321d9ee67 (patch) | |
tree | 7fed98f269c27d26b150bf5576b86b513bb02af0 | |
parent | b8c6d0958943c96ca9401961a1200568c7ec0268 (diff) |
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>
-rw-r--r-- | block.c | 14 |
1 files changed, 6 insertions, 8 deletions
@@ -1161,14 +1161,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 */ |