Revision b404f720
b/block.c | ||
---|---|---|
3144 | 3144 |
} |
3145 | 3145 |
|
3146 | 3146 |
/* |
3147 |
* Handle a write request in coroutine context
|
|
3147 |
* Forwards an already correctly aligned write request to the BlockDriver.
|
|
3148 | 3148 |
*/ |
3149 |
static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs, |
|
3150 |
int64_t sector_num, int nb_sectors, QEMUIOVector *qiov, |
|
3151 |
BdrvRequestFlags flags) |
|
3149 |
static int coroutine_fn bdrv_aligned_pwritev(BlockDriverState *bs, |
|
3150 |
int64_t offset, unsigned int bytes, QEMUIOVector *qiov, int flags) |
|
3152 | 3151 |
{ |
3153 | 3152 |
BlockDriver *drv = bs->drv; |
3154 | 3153 |
BdrvTrackedRequest req; |
3155 | 3154 |
int ret; |
3156 | 3155 |
|
3157 |
if (!bs->drv) { |
|
3158 |
return -ENOMEDIUM; |
|
3159 |
} |
|
3160 |
if (bs->read_only) { |
|
3161 |
return -EACCES; |
|
3162 |
} |
|
3163 |
if (bdrv_check_request(bs, sector_num, nb_sectors)) { |
|
3164 |
return -EIO; |
|
3165 |
} |
|
3166 |
|
|
3167 |
if (bs->copy_on_read_in_flight) { |
|
3168 |
wait_for_overlapping_requests(bs, sector_num, nb_sectors); |
|
3169 |
} |
|
3156 |
int64_t sector_num = offset >> BDRV_SECTOR_BITS; |
|
3157 |
unsigned int nb_sectors = bytes >> BDRV_SECTOR_BITS; |
|
3170 | 3158 |
|
3171 |
/* throttling disk I/O */ |
|
3172 |
if (bs->io_limits_enabled) { |
|
3173 |
bdrv_io_limits_intercept(bs, nb_sectors, true); |
|
3174 |
} |
|
3159 |
assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0); |
|
3160 |
assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0); |
|
3175 | 3161 |
|
3176 | 3162 |
tracked_request_begin(&req, bs, sector_num, nb_sectors, true); |
3177 | 3163 |
|
... | ... | |
3203 | 3189 |
return ret; |
3204 | 3190 |
} |
3205 | 3191 |
|
3192 |
/* |
|
3193 |
* Handle a write request in coroutine context |
|
3194 |
*/ |
|
3195 |
static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs, |
|
3196 |
int64_t sector_num, int nb_sectors, QEMUIOVector *qiov, |
|
3197 |
BdrvRequestFlags flags) |
|
3198 |
{ |
|
3199 |
int ret; |
|
3200 |
|
|
3201 |
if (!bs->drv) { |
|
3202 |
return -ENOMEDIUM; |
|
3203 |
} |
|
3204 |
if (bs->read_only) { |
|
3205 |
return -EACCES; |
|
3206 |
} |
|
3207 |
if (bdrv_check_request(bs, sector_num, nb_sectors)) { |
|
3208 |
return -EIO; |
|
3209 |
} |
|
3210 |
|
|
3211 |
if (bs->copy_on_read_in_flight) { |
|
3212 |
wait_for_overlapping_requests(bs, sector_num, nb_sectors); |
|
3213 |
} |
|
3214 |
|
|
3215 |
/* throttling disk I/O */ |
|
3216 |
if (bs->io_limits_enabled) { |
|
3217 |
bdrv_io_limits_intercept(bs, nb_sectors, true); |
|
3218 |
} |
|
3219 |
|
|
3220 |
ret = bdrv_aligned_pwritev(bs, sector_num << BDRV_SECTOR_BITS, |
|
3221 |
nb_sectors << BDRV_SECTOR_BITS, qiov, flags); |
|
3222 |
|
|
3223 |
return ret; |
|
3224 |
} |
|
3225 |
|
|
3206 | 3226 |
int coroutine_fn bdrv_co_writev(BlockDriverState *bs, int64_t sector_num, |
3207 | 3227 |
int nb_sectors, QEMUIOVector *qiov) |
3208 | 3228 |
{ |
Also available in: Unified diff