block: add discard support
Add a new bdrv_discard method to free blocks in a mapping image, and a new drive property to set the granularity for these discard. If no discard granularity support is set discard support is disabled. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									61d9d6b091
								
							
						
					
					
						commit
						bb8bf76fb1
					
				
							
								
								
									
										11
									
								
								block.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								block.c
									
									
									
									
									
								
							@ -1515,6 +1515,17 @@ int bdrv_has_zero_init(BlockDriverState *bs)
 | 
				
			|||||||
    return 1;
 | 
					    return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int bdrv_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!bs->drv) {
 | 
				
			||||||
 | 
					        return -ENOMEDIUM;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!bs->drv->bdrv_discard) {
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return bs->drv->bdrv_discard(bs, sector_num, nb_sectors);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Returns true iff the specified sector is present in the disk image. Drivers
 | 
					 * Returns true iff the specified sector is present in the disk image. Drivers
 | 
				
			||||||
 * not implementing the functionality are assumed to not support backing files,
 | 
					 * not implementing the functionality are assumed to not support backing files,
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										1
									
								
								block.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								block.h
									
									
									
									
									
								
							@ -146,6 +146,7 @@ int bdrv_flush(BlockDriverState *bs);
 | 
				
			|||||||
void bdrv_flush_all(void);
 | 
					void bdrv_flush_all(void);
 | 
				
			||||||
void bdrv_close_all(void);
 | 
					void bdrv_close_all(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int bdrv_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors);
 | 
				
			||||||
int bdrv_has_zero_init(BlockDriverState *bs);
 | 
					int bdrv_has_zero_init(BlockDriverState *bs);
 | 
				
			||||||
int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
 | 
					int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
 | 
				
			||||||
	int *pnum);
 | 
						int *pnum);
 | 
				
			||||||
 | 
				
			|||||||
@ -65,6 +65,11 @@ static int raw_probe(const uint8_t *buf, int buf_size, const char *filename)
 | 
				
			|||||||
   return 1; /* everything can be opened as raw image */
 | 
					   return 1; /* everything can be opened as raw image */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int raw_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return bdrv_discard(bs->file, sector_num, nb_sectors);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int raw_is_inserted(BlockDriverState *bs)
 | 
					static int raw_is_inserted(BlockDriverState *bs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return bdrv_is_inserted(bs->file);
 | 
					    return bdrv_is_inserted(bs->file);
 | 
				
			||||||
@ -130,6 +135,7 @@ static BlockDriver bdrv_raw = {
 | 
				
			|||||||
    .bdrv_aio_readv     = raw_aio_readv,
 | 
					    .bdrv_aio_readv     = raw_aio_readv,
 | 
				
			||||||
    .bdrv_aio_writev    = raw_aio_writev,
 | 
					    .bdrv_aio_writev    = raw_aio_writev,
 | 
				
			||||||
    .bdrv_aio_flush     = raw_aio_flush,
 | 
					    .bdrv_aio_flush     = raw_aio_flush,
 | 
				
			||||||
 | 
					    .bdrv_discard       = raw_discard,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .bdrv_is_inserted   = raw_is_inserted,
 | 
					    .bdrv_is_inserted   = raw_is_inserted,
 | 
				
			||||||
    .bdrv_eject         = raw_eject,
 | 
					    .bdrv_eject         = raw_eject,
 | 
				
			||||||
 | 
				
			|||||||
@ -72,6 +72,8 @@ struct BlockDriver {
 | 
				
			|||||||
        BlockDriverCompletionFunc *cb, void *opaque);
 | 
					        BlockDriverCompletionFunc *cb, void *opaque);
 | 
				
			||||||
    BlockDriverAIOCB *(*bdrv_aio_flush)(BlockDriverState *bs,
 | 
					    BlockDriverAIOCB *(*bdrv_aio_flush)(BlockDriverState *bs,
 | 
				
			||||||
        BlockDriverCompletionFunc *cb, void *opaque);
 | 
					        BlockDriverCompletionFunc *cb, void *opaque);
 | 
				
			||||||
 | 
					    int (*bdrv_discard)(BlockDriverState *bs, int64_t sector_num,
 | 
				
			||||||
 | 
					                        int nb_sectors);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int (*bdrv_aio_multiwrite)(BlockDriverState *bs, BlockRequest *reqs,
 | 
					    int (*bdrv_aio_multiwrite)(BlockDriverState *bs, BlockRequest *reqs,
 | 
				
			||||||
        int num_reqs);
 | 
					        int num_reqs);
 | 
				
			||||||
@ -227,6 +229,7 @@ typedef struct BlockConf {
 | 
				
			|||||||
    uint16_t min_io_size;
 | 
					    uint16_t min_io_size;
 | 
				
			||||||
    uint32_t opt_io_size;
 | 
					    uint32_t opt_io_size;
 | 
				
			||||||
    int32_t bootindex;
 | 
					    int32_t bootindex;
 | 
				
			||||||
 | 
					    uint32_t discard_granularity;
 | 
				
			||||||
} BlockConf;
 | 
					} BlockConf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline unsigned int get_physical_block_exp(BlockConf *conf)
 | 
					static inline unsigned int get_physical_block_exp(BlockConf *conf)
 | 
				
			||||||
@ -250,6 +253,8 @@ static inline unsigned int get_physical_block_exp(BlockConf *conf)
 | 
				
			|||||||
                       _conf.physical_block_size, 512),                 \
 | 
					                       _conf.physical_block_size, 512),                 \
 | 
				
			||||||
    DEFINE_PROP_UINT16("min_io_size", _state, _conf.min_io_size, 0),  \
 | 
					    DEFINE_PROP_UINT16("min_io_size", _state, _conf.min_io_size, 0),  \
 | 
				
			||||||
    DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 0),    \
 | 
					    DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 0),    \
 | 
				
			||||||
    DEFINE_PROP_INT32("bootindex", _state, _conf.bootindex, -1)         \
 | 
					    DEFINE_PROP_INT32("bootindex", _state, _conf.bootindex, -1),        \
 | 
				
			||||||
 | 
					    DEFINE_PROP_UINT32("discard_granularity", _state, \
 | 
				
			||||||
 | 
					                       _conf.discard_granularity, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* BLOCK_INT_H */
 | 
					#endif /* BLOCK_INT_H */
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user