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