|
@@ -2632,7 +2632,7 @@ int bdrv_flush(BlockDriverState *bs)
|
|
typedef struct DiscardCo {
|
|
typedef struct DiscardCo {
|
|
BdrvChild *child;
|
|
BdrvChild *child;
|
|
int64_t offset;
|
|
int64_t offset;
|
|
- int bytes;
|
|
|
|
|
|
+ int64_t bytes;
|
|
int ret;
|
|
int ret;
|
|
} DiscardCo;
|
|
} DiscardCo;
|
|
static void coroutine_fn bdrv_pdiscard_co_entry(void *opaque)
|
|
static void coroutine_fn bdrv_pdiscard_co_entry(void *opaque)
|
|
@@ -2643,14 +2643,15 @@ static void coroutine_fn bdrv_pdiscard_co_entry(void *opaque)
|
|
aio_wait_kick();
|
|
aio_wait_kick();
|
|
}
|
|
}
|
|
|
|
|
|
-int coroutine_fn bdrv_co_pdiscard(BdrvChild *child, int64_t offset, int bytes)
|
|
|
|
|
|
+int coroutine_fn bdrv_co_pdiscard(BdrvChild *child, int64_t offset,
|
|
|
|
+ int64_t bytes)
|
|
{
|
|
{
|
|
BdrvTrackedRequest req;
|
|
BdrvTrackedRequest req;
|
|
int max_pdiscard, ret;
|
|
int max_pdiscard, ret;
|
|
int head, tail, align;
|
|
int head, tail, align;
|
|
BlockDriverState *bs = child->bs;
|
|
BlockDriverState *bs = child->bs;
|
|
|
|
|
|
- if (!bs || !bs->drv) {
|
|
|
|
|
|
+ if (!bs || !bs->drv || !bdrv_is_inserted(bs)) {
|
|
return -ENOMEDIUM;
|
|
return -ENOMEDIUM;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2658,9 +2659,8 @@ int coroutine_fn bdrv_co_pdiscard(BdrvChild *child, int64_t offset, int bytes)
|
|
return -EPERM;
|
|
return -EPERM;
|
|
}
|
|
}
|
|
|
|
|
|
- ret = bdrv_check_byte_request(bs, offset, bytes);
|
|
|
|
- if (ret < 0) {
|
|
|
|
- return ret;
|
|
|
|
|
|
+ if (offset < 0 || bytes < 0 || bytes > INT64_MAX - offset) {
|
|
|
|
+ return -EIO;
|
|
}
|
|
}
|
|
|
|
|
|
/* Do nothing if disabled. */
|
|
/* Do nothing if disabled. */
|
|
@@ -2695,7 +2695,7 @@ int coroutine_fn bdrv_co_pdiscard(BdrvChild *child, int64_t offset, int bytes)
|
|
assert(max_pdiscard >= bs->bl.request_alignment);
|
|
assert(max_pdiscard >= bs->bl.request_alignment);
|
|
|
|
|
|
while (bytes > 0) {
|
|
while (bytes > 0) {
|
|
- int num = bytes;
|
|
|
|
|
|
+ int64_t num = bytes;
|
|
|
|
|
|
if (head) {
|
|
if (head) {
|
|
/* Make small requests to get to alignment boundaries. */
|
|
/* Make small requests to get to alignment boundaries. */
|
|
@@ -2757,7 +2757,7 @@ out:
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-int bdrv_pdiscard(BdrvChild *child, int64_t offset, int bytes)
|
|
|
|
|
|
+int bdrv_pdiscard(BdrvChild *child, int64_t offset, int64_t bytes)
|
|
{
|
|
{
|
|
Coroutine *co;
|
|
Coroutine *co;
|
|
DiscardCo rwco = {
|
|
DiscardCo rwco = {
|