block: add bdrv_write_zeroes()
Signed-off-by: Peter Lieven <pl@kamp.de> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
		
							parent
							
								
									78f27bd02c
								
							
						
					
					
						commit
						4105eaaab9
					
				
							
								
								
									
										27
									
								
								block.c
								
								
								
								
							
							
						
						
									
										27
									
								
								block.c
								
								
								
								
							| 
						 | 
				
			
			@ -2162,6 +2162,7 @@ typedef struct RwCo {
 | 
			
		|||
    QEMUIOVector *qiov;
 | 
			
		||||
    bool is_write;
 | 
			
		||||
    int ret;
 | 
			
		||||
    BdrvRequestFlags flags;
 | 
			
		||||
} RwCo;
 | 
			
		||||
 | 
			
		||||
static void coroutine_fn bdrv_rw_co_entry(void *opaque)
 | 
			
		||||
| 
						 | 
				
			
			@ -2170,10 +2171,12 @@ static void coroutine_fn bdrv_rw_co_entry(void *opaque)
 | 
			
		|||
 | 
			
		||||
    if (!rwco->is_write) {
 | 
			
		||||
        rwco->ret = bdrv_co_do_readv(rwco->bs, rwco->sector_num,
 | 
			
		||||
                                     rwco->nb_sectors, rwco->qiov, 0);
 | 
			
		||||
                                     rwco->nb_sectors, rwco->qiov,
 | 
			
		||||
                                     rwco->flags);
 | 
			
		||||
    } else {
 | 
			
		||||
        rwco->ret = bdrv_co_do_writev(rwco->bs, rwco->sector_num,
 | 
			
		||||
                                      rwco->nb_sectors, rwco->qiov, 0);
 | 
			
		||||
                                      rwco->nb_sectors, rwco->qiov,
 | 
			
		||||
                                      rwco->flags);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2181,7 +2184,8 @@ static void coroutine_fn bdrv_rw_co_entry(void *opaque)
 | 
			
		|||
 * Process a vectored synchronous request using coroutines
 | 
			
		||||
 */
 | 
			
		||||
static int bdrv_rwv_co(BlockDriverState *bs, int64_t sector_num,
 | 
			
		||||
                       QEMUIOVector *qiov, bool is_write)
 | 
			
		||||
                       QEMUIOVector *qiov, bool is_write,
 | 
			
		||||
                       BdrvRequestFlags flags)
 | 
			
		||||
{
 | 
			
		||||
    Coroutine *co;
 | 
			
		||||
    RwCo rwco = {
 | 
			
		||||
| 
						 | 
				
			
			@ -2191,6 +2195,7 @@ static int bdrv_rwv_co(BlockDriverState *bs, int64_t sector_num,
 | 
			
		|||
        .qiov = qiov,
 | 
			
		||||
        .is_write = is_write,
 | 
			
		||||
        .ret = NOT_DONE,
 | 
			
		||||
        .flags = flags,
 | 
			
		||||
    };
 | 
			
		||||
    assert((qiov->size & (BDRV_SECTOR_SIZE - 1)) == 0);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2222,7 +2227,7 @@ static int bdrv_rwv_co(BlockDriverState *bs, int64_t sector_num,
 | 
			
		|||
 * Process a synchronous request using coroutines
 | 
			
		||||
 */
 | 
			
		||||
static int bdrv_rw_co(BlockDriverState *bs, int64_t sector_num, uint8_t *buf,
 | 
			
		||||
                      int nb_sectors, bool is_write)
 | 
			
		||||
                      int nb_sectors, bool is_write, BdrvRequestFlags flags)
 | 
			
		||||
{
 | 
			
		||||
    QEMUIOVector qiov;
 | 
			
		||||
    struct iovec iov = {
 | 
			
		||||
| 
						 | 
				
			
			@ -2231,14 +2236,14 @@ static int bdrv_rw_co(BlockDriverState *bs, int64_t sector_num, uint8_t *buf,
 | 
			
		|||
    };
 | 
			
		||||
 | 
			
		||||
    qemu_iovec_init_external(&qiov, &iov, 1);
 | 
			
		||||
    return bdrv_rwv_co(bs, sector_num, &qiov, is_write);
 | 
			
		||||
    return bdrv_rwv_co(bs, sector_num, &qiov, is_write, flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* return < 0 if error. See bdrv_write() for the return codes */
 | 
			
		||||
int bdrv_read(BlockDriverState *bs, int64_t sector_num,
 | 
			
		||||
              uint8_t *buf, int nb_sectors)
 | 
			
		||||
{
 | 
			
		||||
    return bdrv_rw_co(bs, sector_num, buf, nb_sectors, false);
 | 
			
		||||
    return bdrv_rw_co(bs, sector_num, buf, nb_sectors, false, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Just like bdrv_read(), but with I/O throttling temporarily disabled */
 | 
			
		||||
| 
						 | 
				
			
			@ -2264,12 +2269,18 @@ int bdrv_read_unthrottled(BlockDriverState *bs, int64_t sector_num,
 | 
			
		|||
int bdrv_write(BlockDriverState *bs, int64_t sector_num,
 | 
			
		||||
               const uint8_t *buf, int nb_sectors)
 | 
			
		||||
{
 | 
			
		||||
    return bdrv_rw_co(bs, sector_num, (uint8_t *)buf, nb_sectors, true);
 | 
			
		||||
    return bdrv_rw_co(bs, sector_num, (uint8_t *)buf, nb_sectors, true, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int bdrv_writev(BlockDriverState *bs, int64_t sector_num, QEMUIOVector *qiov)
 | 
			
		||||
{
 | 
			
		||||
    return bdrv_rwv_co(bs, sector_num, qiov, true);
 | 
			
		||||
    return bdrv_rwv_co(bs, sector_num, qiov, true, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int bdrv_write_zeroes(BlockDriverState *bs, int64_t sector_num, int nb_sectors)
 | 
			
		||||
{
 | 
			
		||||
    return bdrv_rw_co(bs, sector_num, NULL, nb_sectors, true,
 | 
			
		||||
                      BDRV_REQ_ZERO_WRITE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int bdrv_pread(BlockDriverState *bs, int64_t offset,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -157,6 +157,8 @@ int bdrv_read_unthrottled(BlockDriverState *bs, int64_t sector_num,
 | 
			
		|||
                          uint8_t *buf, int nb_sectors);
 | 
			
		||||
int bdrv_write(BlockDriverState *bs, int64_t sector_num,
 | 
			
		||||
               const uint8_t *buf, int nb_sectors);
 | 
			
		||||
int bdrv_write_zeroes(BlockDriverState *bs, int64_t sector_num,
 | 
			
		||||
               int nb_sectors);
 | 
			
		||||
int bdrv_writev(BlockDriverState *bs, int64_t sector_num, QEMUIOVector *qiov);
 | 
			
		||||
int bdrv_pread(BlockDriverState *bs, int64_t offset,
 | 
			
		||||
               void *buf, int count);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue