From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=52618 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PO9NX-00011L-HD for qemu-devel@nongnu.org; Thu, 02 Dec 2010 08:39:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PO7sL-00011k-Md for qemu-devel@nongnu.org; Thu, 02 Dec 2010 07:03:03 -0500 Received: from mx1.redhat.com ([209.132.183.28]:9746) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PO7sL-00011W-7z for qemu-devel@nongnu.org; Thu, 02 Dec 2010 07:03:01 -0500 Message-ID: <4CF78B30.2080209@redhat.com> Date: Thu, 02 Dec 2010 13:04:00 +0100 From: Kevin Wolf MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH 5/5] raw-posix: add discard support References: <20101125135657.GA2814@lst.de> <20101201153504.GA6056@lst.de> <20101201153552.GE6310@lst.de> In-Reply-To: <20101201153552.GE6310@lst.de> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Christoph Hellwig Cc: qemu-devel@nongnu.org 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 > > 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 > #endif > > +#ifdef CONFIG_XFS > +#include > +#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 > +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