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;
 | 
					    QEMUIOVector *qiov;
 | 
				
			||||||
    bool is_write;
 | 
					    bool is_write;
 | 
				
			||||||
    int ret;
 | 
					    int ret;
 | 
				
			||||||
 | 
					    BdrvRequestFlags flags;
 | 
				
			||||||
} RwCo;
 | 
					} RwCo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void coroutine_fn bdrv_rw_co_entry(void *opaque)
 | 
					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) {
 | 
					    if (!rwco->is_write) {
 | 
				
			||||||
        rwco->ret = bdrv_co_do_readv(rwco->bs, rwco->sector_num,
 | 
					        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 {
 | 
					    } else {
 | 
				
			||||||
        rwco->ret = bdrv_co_do_writev(rwco->bs, rwco->sector_num,
 | 
					        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
 | 
					 * Process a vectored synchronous request using coroutines
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static int bdrv_rwv_co(BlockDriverState *bs, int64_t sector_num,
 | 
					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;
 | 
					    Coroutine *co;
 | 
				
			||||||
    RwCo rwco = {
 | 
					    RwCo rwco = {
 | 
				
			||||||
@ -2191,6 +2195,7 @@ static int bdrv_rwv_co(BlockDriverState *bs, int64_t sector_num,
 | 
				
			|||||||
        .qiov = qiov,
 | 
					        .qiov = qiov,
 | 
				
			||||||
        .is_write = is_write,
 | 
					        .is_write = is_write,
 | 
				
			||||||
        .ret = NOT_DONE,
 | 
					        .ret = NOT_DONE,
 | 
				
			||||||
 | 
					        .flags = flags,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    assert((qiov->size & (BDRV_SECTOR_SIZE - 1)) == 0);
 | 
					    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
 | 
					 * Process a synchronous request using coroutines
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static int bdrv_rw_co(BlockDriverState *bs, int64_t sector_num, uint8_t *buf,
 | 
					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;
 | 
					    QEMUIOVector qiov;
 | 
				
			||||||
    struct iovec iov = {
 | 
					    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);
 | 
					    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 */
 | 
					/* return < 0 if error. See bdrv_write() for the return codes */
 | 
				
			||||||
int bdrv_read(BlockDriverState *bs, int64_t sector_num,
 | 
					int bdrv_read(BlockDriverState *bs, int64_t sector_num,
 | 
				
			||||||
              uint8_t *buf, int nb_sectors)
 | 
					              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 */
 | 
					/* 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,
 | 
					int bdrv_write(BlockDriverState *bs, int64_t sector_num,
 | 
				
			||||||
               const uint8_t *buf, int nb_sectors)
 | 
					               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)
 | 
					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,
 | 
					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);
 | 
					                          uint8_t *buf, int nb_sectors);
 | 
				
			||||||
int bdrv_write(BlockDriverState *bs, int64_t sector_num,
 | 
					int bdrv_write(BlockDriverState *bs, int64_t sector_num,
 | 
				
			||||||
               const uint8_t *buf, int nb_sectors);
 | 
					               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_writev(BlockDriverState *bs, int64_t sector_num, QEMUIOVector *qiov);
 | 
				
			||||||
int bdrv_pread(BlockDriverState *bs, int64_t offset,
 | 
					int bdrv_pread(BlockDriverState *bs, int64_t offset,
 | 
				
			||||||
               void *buf, int count);
 | 
					               void *buf, int count);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user