Message ID | 20101201153552.GE6310@lst.de |
---|---|
State | New |
Headers | show |
Am 01.12.2010 16:35, schrieb Christoph Hellwig: > Add support to discard blocks in a raw image residing on an XFS filesystem > by calling the XFS_IOC_UNRESVSP64 ioctl to punch holes. Support for other > hole punching mechanisms can be added when they become available. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > > Index: qemu/block/raw-posix.c > =================================================================== > --- qemu.orig/block/raw-posix.c 2010-11-25 12:51:18.474004263 +0100 > +++ qemu/block/raw-posix.c 2010-11-25 13:00:42.220003844 +0100 > @@ -69,6 +69,10 @@ > #include <sys/diskslice.h> > #endif > > +#ifdef CONFIG_XFS > +#include <xfs/xfs.h> > +#endif > + > //#define DEBUG_FLOPPY > > //#define DEBUG_BLOCK > @@ -120,6 +124,9 @@ typedef struct BDRVRawState { > #endif > uint8_t *aligned_buf; > unsigned aligned_buf_size; > +#ifdef CONFIG_XFS > + int is_xfs : 1; > +#endif Why not bool? > } BDRVRawState; > > static int fd_open(BlockDriverState *bs); > @@ -196,6 +203,12 @@ static int raw_open_common(BlockDriverSt > #endif > } > > +#ifdef CONFIG_XFS > + if (platform_test_xfs_fd(s->fd)) { > + s->is_xfs = 1; > + } > +#endif > + > return 0; > > out_free_buf: > @@ -740,6 +753,36 @@ static int raw_flush(BlockDriverState *b > return qemu_fdatasync(s->fd); > } > > +#ifdef CONFIG_XFS > +static int xfs_discard(BDRVRawState *s, int64_t sector_num, int nb_sectors) > +{ > + struct xfs_flock64 fl; > + > + memset(&fl, 0, sizeof(fl)); > + fl.l_whence = SEEK_SET; > + fl.l_start = sector_num << 9; > + fl.l_len = (int64_t)nb_sectors << 9; > + > + if (xfsctl(NULL, s->fd, XFS_IOC_UNRESVSP64, &fl) < 0) { > + printf("cannot punch hole (%s)\n", strerror(errno)); > + return -errno; > + } > + > + return 0; > +} > +#endif > + > +static int raw_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors) > +{ > + BDRVRawState *s = bs->opaque; > + > +#ifdef CONFIG_XFS > + if (s->is_xfs) > + return xfs_discard(s, sector_num, nb_sectors); Braces > +#endif > + > + return 0; > +} This doesn't compile without XFS: cc1: warnings being treated as errors block/raw-posix.c: In function 'raw_discard': block/raw-posix.c:777: error: unused variable 's' > > static QEMUOptionParameter raw_create_options[] = { > { > @@ -761,6 +804,7 @@ static BlockDriver bdrv_file = { > .bdrv_close = raw_close, > .bdrv_create = raw_create, > .bdrv_flush = raw_flush, > + .bdrv_discard = raw_discard, > > .bdrv_aio_readv = raw_aio_readv, > .bdrv_aio_writev = raw_aio_writev, > Index: qemu/configure > =================================================================== > --- qemu.orig/configure 2010-11-25 12:51:18.484004891 +0100 > +++ qemu/configure 2010-11-25 13:00:42.222004263 +0100 > @@ -288,6 +288,7 @@ xen="" > linux_aio="" > attr="" > vhost_net="" > +xfs="" > > gprof="no" > debug_tcg="no" > @@ -1393,6 +1394,27 @@ EOF > fi > > ########################################## > +# xfsctl() probe, used for raw-posix > +if test "$xfs" != "no" ; then > + cat > $TMPC << EOF > +#include <xfs/xfs.h> > +int main(void) > +{ > + xfsctl(NULL, 0, 0, NULL); > + return 0; > +} > +EOF > + if compile_prog "" "" ; then > + xfs="yes" > + else > + if test "$xfs" = "yes" ; then > + feature_not_found "uuid" s/uuid/xfs/ Kevin
Index: qemu/block/raw-posix.c =================================================================== --- qemu.orig/block/raw-posix.c 2010-11-25 12:51:18.474004263 +0100 +++ qemu/block/raw-posix.c 2010-11-25 13:00:42.220003844 +0100 @@ -69,6 +69,10 @@ #include <sys/diskslice.h> #endif +#ifdef CONFIG_XFS +#include <xfs/xfs.h> +#endif + //#define DEBUG_FLOPPY //#define DEBUG_BLOCK @@ -120,6 +124,9 @@ typedef struct BDRVRawState { #endif uint8_t *aligned_buf; unsigned aligned_buf_size; +#ifdef CONFIG_XFS + int is_xfs : 1; +#endif } BDRVRawState; static int fd_open(BlockDriverState *bs); @@ -196,6 +203,12 @@ static int raw_open_common(BlockDriverSt #endif } +#ifdef CONFIG_XFS + if (platform_test_xfs_fd(s->fd)) { + s->is_xfs = 1; + } +#endif + return 0; out_free_buf: @@ -740,6 +753,36 @@ static int raw_flush(BlockDriverState *b return qemu_fdatasync(s->fd); } +#ifdef CONFIG_XFS +static int xfs_discard(BDRVRawState *s, int64_t sector_num, int nb_sectors) +{ + struct xfs_flock64 fl; + + memset(&fl, 0, sizeof(fl)); + fl.l_whence = SEEK_SET; + fl.l_start = sector_num << 9; + fl.l_len = (int64_t)nb_sectors << 9; + + if (xfsctl(NULL, s->fd, XFS_IOC_UNRESVSP64, &fl) < 0) { + printf("cannot punch hole (%s)\n", strerror(errno)); + return -errno; + } + + return 0; +} +#endif + +static int raw_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors) +{ + BDRVRawState *s = bs->opaque; + +#ifdef CONFIG_XFS + if (s->is_xfs) + return xfs_discard(s, sector_num, nb_sectors); +#endif + + return 0; +} static QEMUOptionParameter raw_create_options[] = { { @@ -761,6 +804,7 @@ static BlockDriver bdrv_file = { .bdrv_close = raw_close, .bdrv_create = raw_create, .bdrv_flush = raw_flush, + .bdrv_discard = raw_discard, .bdrv_aio_readv = raw_aio_readv, .bdrv_aio_writev = raw_aio_writev, Index: qemu/configure =================================================================== --- qemu.orig/configure 2010-11-25 12:51:18.484004891 +0100 +++ qemu/configure 2010-11-25 13:00:42.222004263 +0100 @@ -288,6 +288,7 @@ xen="" linux_aio="" attr="" vhost_net="" +xfs="" gprof="no" debug_tcg="no" @@ -1393,6 +1394,27 @@ EOF fi ########################################## +# xfsctl() probe, used for raw-posix +if test "$xfs" != "no" ; then + cat > $TMPC << EOF +#include <xfs/xfs.h> +int main(void) +{ + xfsctl(NULL, 0, 0, NULL); + return 0; +} +EOF + if compile_prog "" "" ; then + xfs="yes" + else + if test "$xfs" = "yes" ; then + feature_not_found "uuid" + fi + xfs=no + fi +fi + +########################################## # vde libraries probe if test "$vde" != "no" ; then vde_libs="-lvdeplug" @@ -2354,6 +2376,7 @@ echo "vhost-net support $vhost_net" echo "Trace backend $trace_backend" echo "Trace output file $trace_file-<pid>" echo "spice support $spice" +echo "xfsctl support $xfs" if test $sdl_too_old = "yes"; then echo "-> Your SDL version is too old - please upgrade to have SDL support" @@ -2499,6 +2522,9 @@ fi if test "$uuid" = "yes" ; then echo "CONFIG_UUID=y" >> $config_host_mak fi +if test "$xfs" = "yes" ; then + echo "CONFIG_XFS=y" >> $config_host_mak +fi qemu_version=`head $source_path/VERSION` echo "VERSION=$qemu_version" >>$config_host_mak echo "PKGVERSION=$pkgversion" >>$config_host_mak
Add support to discard blocks in a raw image residing on an XFS filesystem by calling the XFS_IOC_UNRESVSP64 ioctl to punch holes. Support for other hole punching mechanisms can be added when they become available. Signed-off-by: Christoph Hellwig <hch@lst.de>