From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=45694 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PTXkV-0008EO-Id for qemu-devel@nongnu.org; Fri, 17 Dec 2010 05:41:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PTXkU-0008AE-7f for qemu-devel@nongnu.org; Fri, 17 Dec 2010 05:41:19 -0500 Received: from verein.lst.de ([213.95.11.210]:38421) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PTXkT-0008A2-UJ for qemu-devel@nongnu.org; Fri, 17 Dec 2010 05:41:18 -0500 Date: Fri, 17 Dec 2010 11:41:15 +0100 From: Christoph Hellwig Message-ID: <20101217104115.GA2647@lst.de> References: <20101210150038.GA30990@lst.de> <20101216183614.GA17260@lst.de> <20101216183656.GC17521@lst.de> <4D0B3C4D.6060907@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4D0B3C4D.6060907@redhat.com> Subject: [Qemu-devel] [PATCH v5] raw-posix: add discard support List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Kevin Wolf Cc: qemu-devel@nongnu.org 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-12-17 11:30:21.455262819 +0100 +++ qemu/block/raw-posix.c 2010-12-17 11:32:00.131003705 +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 + bool 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,37 @@ 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) { + DEBUG_BLOCK_PRINT("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) +{ +#ifdef CONFIG_XFS + BDRVRawState *s = bs->opaque; + + if (s->is_xfs) { + return xfs_discard(s, sector_num, nb_sectors); + } +#endif + + return 0; +} static QEMUOptionParameter raw_create_options[] = { { @@ -761,6 +805,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-12-17 11:30:21.468254368 +0100 +++ qemu/configure 2010-12-17 11:30:40.080023610 +0100 @@ -288,6 +288,7 @@ xen="" linux_aio="" attr="" vhost_net="" +xfs="" gprof="no" debug_tcg="no" @@ -1399,6 +1400,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 "xfs" + fi + xfs=no + fi +fi + +########################################## # vde libraries probe if test "$vde" != "no" ; then vde_libs="-lvdeplug" @@ -2403,6 +2425,7 @@ echo "Trace backend $trace_backend" echo "Trace output file $trace_file-" echo "spice support $spice" echo "rbd support $rbd" +echo "xfsctl support $xfs" if test $sdl_too_old = "yes"; then echo "-> Your SDL version is too old - please upgrade to have SDL support" @@ -2548,6 +2571,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