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 <h...@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