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…
Reference in New Issue
Block a user