mirror of https://github.com/xqemu/xqemu.git
block: Introduce blk_set_allow_write_beyond_eof()
We check that the guest can't write beyond the end of its disk, but for other internal users it can make sense to allow growing a file. Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
6340472c54
commit
c10c9d9615
|
@ -50,6 +50,8 @@ struct BlockBackend {
|
||||||
bool iostatus_enabled;
|
bool iostatus_enabled;
|
||||||
BlockDeviceIoStatus iostatus;
|
BlockDeviceIoStatus iostatus;
|
||||||
|
|
||||||
|
bool allow_write_beyond_eof;
|
||||||
|
|
||||||
NotifierList remove_bs_notifiers, insert_bs_notifiers;
|
NotifierList remove_bs_notifiers, insert_bs_notifiers;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -579,6 +581,11 @@ void blk_iostatus_set_err(BlockBackend *blk, int error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void blk_set_allow_write_beyond_eof(BlockBackend *blk, bool allow)
|
||||||
|
{
|
||||||
|
blk->allow_write_beyond_eof = allow;
|
||||||
|
}
|
||||||
|
|
||||||
static int blk_check_byte_request(BlockBackend *blk, int64_t offset,
|
static int blk_check_byte_request(BlockBackend *blk, int64_t offset,
|
||||||
size_t size)
|
size_t size)
|
||||||
{
|
{
|
||||||
|
@ -592,18 +599,20 @@ static int blk_check_byte_request(BlockBackend *blk, int64_t offset,
|
||||||
return -ENOMEDIUM;
|
return -ENOMEDIUM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (offset < 0) {
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!blk->allow_write_beyond_eof) {
|
||||||
len = blk_getlength(blk);
|
len = blk_getlength(blk);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (offset < 0) {
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (offset > len || len - offset < size) {
|
if (offset > len || len - offset < size) {
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,6 +78,7 @@ void blk_insert_bs(BlockBackend *blk, BlockDriverState *bs);
|
||||||
|
|
||||||
void blk_hide_on_behalf_of_hmp_drive_del(BlockBackend *blk);
|
void blk_hide_on_behalf_of_hmp_drive_del(BlockBackend *blk);
|
||||||
|
|
||||||
|
void blk_set_allow_write_beyond_eof(BlockBackend *blk, bool allow);
|
||||||
void blk_iostatus_enable(BlockBackend *blk);
|
void blk_iostatus_enable(BlockBackend *blk);
|
||||||
bool blk_iostatus_is_enabled(const BlockBackend *blk);
|
bool blk_iostatus_is_enabled(const BlockBackend *blk);
|
||||||
BlockDeviceIoStatus blk_iostatus(const BlockBackend *blk);
|
BlockDeviceIoStatus blk_iostatus(const BlockBackend *blk);
|
||||||
|
|
Loading…
Reference in New Issue