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:
parent
b8c6d09589
commit
46a4e4e608
12
block.c
12
block.c
|
@ -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
|
|
||||||
total_sectors. */
|
|
||||||
if (!bs->growable || !drv->bdrv_getlength) {
|
|
||||||
return bs->total_sectors * BDRV_SECTOR_SIZE;
|
|
||||||
}
|
|
||||||
return drv->bdrv_getlength(bs);
|
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 */
|
||||||
|
|
Loading…
Reference in a new issue