From patchwork Fri Dec 17 10:41:15 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 75859 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id E2DA0B6EED for ; Fri, 17 Dec 2010 21:43:01 +1100 (EST) Received: from localhost ([127.0.0.1]:39843 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PTXm7-0000a7-6G for incoming@patchwork.ozlabs.org; Fri, 17 Dec 2010 05:42:59 -0500 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 Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id oBHAfF88002829 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Fri, 17 Dec 2010 11:41:16 +0100 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-7.2) id oBHAfFNX002828; Fri, 17 Dec 2010 11:41:15 +0100 Date: Fri, 17 Dec 2010 11:41:15 +0100 From: Christoph Hellwig To: Kevin Wolf 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-Disposition: inline In-Reply-To: <4D0B3C4D.6060907@redhat.com> User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) Cc: qemu-devel@nongnu.org Subject: [Qemu-devel] [PATCH v5] raw-posix: add discard support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@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