From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KENHy-0007dL-Gt for qemu-devel@nongnu.org; Thu, 03 Jul 2008 07:47:50 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KENHx-0007bg-9M for qemu-devel@nongnu.org; Thu, 03 Jul 2008 07:47:49 -0400 Received: from [199.232.76.173] (port=33067 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KENHw-0007bG-Tr for qemu-devel@nongnu.org; Thu, 03 Jul 2008 07:47:48 -0400 Received: from savannah.gnu.org ([199.232.41.3]:49087 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KENHw-0008DS-JI for qemu-devel@nongnu.org; Thu, 03 Jul 2008 07:47:48 -0400 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1KENHv-0004lm-GW for qemu-devel@nongnu.org; Thu, 03 Jul 2008 11:47:47 +0000 Received: from ths by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1KENHv-0004li-9c for qemu-devel@nongnu.org; Thu, 03 Jul 2008 11:47:47 +0000 MIME-Version: 1.0 Errors-To: ths Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Thiemo Seufer Message-Id: Date: Thu, 03 Jul 2008 11:47:47 +0000 Subject: [Qemu-devel] [4836] Add a parameter to disable host cache, by Laurent Vivier. Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 4836 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=4836 Author: ths Date: 2008-07-03 11:47:46 +0000 (Thu, 03 Jul 2008) Log Message: ----------- Add a parameter to disable host cache, by Laurent Vivier. Modified Paths: -------------- trunk/Makefile trunk/block-raw-posix.c trunk/nbd.c trunk/nbd.h trunk/qemu-nbd.c trunk/qemu-nbd.texi Modified: trunk/Makefile =================================================================== --- trunk/Makefile 2008-07-03 11:29:15 UTC (rev 4835) +++ trunk/Makefile 2008-07-03 11:47:46 UTC (rev 4836) @@ -177,8 +177,11 @@ %.o: %.c $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< +qemu-nbd-%.o: %.c + $(CC) $(CFLAGS) $(CPPFLAGS) -DQEMU_NBD -c -o $@ $< + qemu-nbd$(EXESUF): qemu-nbd.o nbd.o qemu-img-block.o \ - $(QEMU_IMG_BLOCK_OBJS) + osdep.o qemu-nbd-block-raw-posix.o $(BLOCK_OBJS) $(CC) $(LDFLAGS) -o $@ $^ -lz $(LIBS) # dyngen host tool Modified: trunk/block-raw-posix.c =================================================================== --- trunk/block-raw-posix.c 2008-07-03 11:29:15 UTC (rev 4835) +++ trunk/block-raw-posix.c 2008-07-03 11:47:46 UTC (rev 4836) @@ -22,7 +22,7 @@ * THE SOFTWARE. */ #include "qemu-common.h" -#ifndef QEMU_IMG +#if !defined(QEMU_IMG) && !defined(QEMU_NBD) #include "qemu-timer.h" #include "exec-all.h" #endif @@ -59,7 +59,7 @@ //#define DEBUG_FLOPPY //#define DEBUG_BLOCK -#if defined(DEBUG_BLOCK) && !defined(QEMU_IMG) +#if defined(DEBUG_BLOCK) && !defined(QEMU_IMG) && !defined(QEMU_NBD) #define DEBUG_BLOCK_PRINT(formatCstr, args...) do { if (loglevel != 0) \ { fprintf(logfile, formatCstr, ##args); fflush(logfile); } } while (0) #else @@ -434,7 +434,7 @@ static void aio_signal_handler(int signum) { -#ifndef QEMU_IMG +#if !defined(QEMU_IMG) && !defined(QEMU_NBD) CPUState *env = cpu_single_env; if (env) { /* stop the currently executing cpu because a timer occured */ @@ -544,7 +544,7 @@ sigset_t set; int nb_sigs; -#ifndef QEMU_IMG +#if !defined(QEMU_IMG) && !defined(QEMU_NBD) if (qemu_bh_poll()) return; #endif @@ -586,7 +586,7 @@ return acb; } -#ifndef QEMU_IMG +#if !defined(QEMU_IMG) && !defined(QEMU_NBD) static void raw_aio_em_cb(void* opaque) { RawAIOCB *acb = opaque; @@ -605,7 +605,7 @@ * If O_DIRECT is used and the buffer is not aligned fall back * to synchronous IO. */ -#if defined(O_DIRECT) && !defined(QEMU_IMG) +#if defined(O_DIRECT) && !defined(QEMU_IMG) && !defined(QEMU_NBD) BDRVRawState *s = bs->opaque; if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) { @@ -638,7 +638,7 @@ * If O_DIRECT is used and the buffer is not aligned fall back * to synchronous IO. */ -#if defined(O_DIRECT) && !defined(QEMU_IMG) +#if defined(O_DIRECT) && !defined(QEMU_IMG) && !defined(QEMU_NBD) BDRVRawState *s = bs->opaque; if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) { @@ -941,7 +941,7 @@ return 0; } -#if defined(__linux__) && !defined(QEMU_IMG) +#if defined(__linux__) && !defined(QEMU_IMG) && !defined(QEMU_NBD) /* Note: we do not have a reliable method to detect if the floppy is present. The current method is to try to open the floppy at every Modified: trunk/nbd.c =================================================================== --- trunk/nbd.c 2008-07-03 11:29:15 UTC (rev 4835) +++ trunk/nbd.c 2008-07-03 11:47:46 UTC (rev 4836) @@ -404,13 +404,9 @@ return ret; } -int nbd_trip(BlockDriverState *bs, int csock, off_t size, uint64_t dev_offset, off_t *offset, bool readonly) +int nbd_trip(BlockDriverState *bs, int csock, off_t size, uint64_t dev_offset, + off_t *offset, bool readonly, uint8_t *data, int data_size) { -#ifndef _REENTRANT - static uint8_t data[1024 * 1024]; // keep this off of the stack -#else - uint8_t data[1024 * 1024]; -#endif uint8_t buf[4 + 4 + 8 + 8 + 4]; uint32_t magic; uint32_t type; @@ -449,9 +445,9 @@ return -1; } - if (len > sizeof(data)) { - LOG("len (%u) is larger than max len (%lu)", - len, (unsigned long)sizeof(data)); + if (len > data_size) { + LOG("len (%u) is larger than max len (%u)", + len, data_size); errno = EINVAL; return -1; } Modified: trunk/nbd.h =================================================================== --- trunk/nbd.h 2008-07-03 11:29:15 UTC (rev 4835) +++ trunk/nbd.h 2008-07-03 11:47:46 UTC (rev 4836) @@ -33,7 +33,8 @@ int nbd_negotiate(BlockDriverState *bs, int csock, off_t size); int nbd_receive_negotiate(int csock, off_t *size, size_t *blocksize); int nbd_init(int fd, int csock, off_t size, size_t blocksize); -int nbd_trip(BlockDriverState *bs, int csock, off_t size, uint64_t dev_offset, off_t *offset, bool readonly); +int nbd_trip(BlockDriverState *bs, int csock, off_t size, uint64_t dev_offset, + off_t *offset, bool readonly, uint8_t *data, int data_size); int nbd_client(int fd, int csock); int nbd_disconnect(int fd); Modified: trunk/qemu-nbd.c =================================================================== --- trunk/qemu-nbd.c 2008-07-03 11:29:15 UTC (rev 4835) +++ trunk/qemu-nbd.c 2008-07-03 11:47:46 UTC (rev 4836) @@ -34,6 +34,8 @@ #define SOCKET_PATH "/var/lock/qemu-nbd-%s" +#define NBD_BUFFER_SIZE (1024*1024) + int verbose; static void usage(const char *name) @@ -49,6 +51,8 @@ " (default '"SOCKET_PATH"')\n" " -r, --read-only export read-only\n" " -P, --partition=NUM only expose partition NUM\n" +" -s, --snapshot use snapshot file\n" +" -n, --nocache disable host cache\n" " -c, --connect=DEV connect FILE to the local NBD device DEV\n" " -d, --disconnect disconnect the specified device\n" " -v, --verbose display extra debugging information\n" @@ -185,7 +189,7 @@ char *device = NULL; char *socket = NULL; char sockpath[128]; - const char *sopt = "hVbo:p:rsP:c:dvk:"; + const char *sopt = "hVbo:p:rsnP:c:dvk:"; struct option lopt[] = { { "help", 0, 0, 'h' }, { "version", 0, 0, 'V' }, @@ -198,6 +202,7 @@ { "connect", 1, 0, 'c' }, { "disconnect", 0, 0, 'd' }, { "snapshot", 0, 0, 's' }, + { "nocache", 0, 0, 'n' }, { "verbose", 0, 0, 'v' }, { NULL, 0, 0, 0 } }; @@ -205,16 +210,20 @@ int opt_ind = 0; int li; char *end; - bool snapshot = false; + int flags = 0; int partition = -1; int fd; int ret; + uint8_t *data; while ((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) { switch (ch) { case 's': - snapshot = true; + flags |= BDRV_O_SNAPSHOT; break; + case 'n': + flags |= BDRV_O_DIRECT; + break; case 'b': bindto = optarg; break; @@ -301,7 +310,7 @@ if (bs == NULL) return 1; - if (bdrv_open(bs, argv[optind], snapshot) == -1) + if (bdrv_open(bs, argv[optind], flags) == -1) return 1; fd_size = bs->total_sectors * 512; @@ -394,7 +403,10 @@ if (nbd_negotiate(bs, csock, fd_size) == -1) return 1; - while (nbd_trip(bs, csock, fd_size, dev_offset, &offset, readonly) == 0); + data = qemu_memalign(512, NBD_BUFFER_SIZE); + while (nbd_trip(bs, csock, fd_size, dev_offset, &offset, readonly, + data, NBD_BUFFER_SIZE) == 0); + qemu_free(data); close(csock); close(sock); Modified: trunk/qemu-nbd.texi =================================================================== --- trunk/qemu-nbd.texi 2008-07-03 11:29:15 UTC (rev 4835) +++ trunk/qemu-nbd.texi 2008-07-03 11:47:46 UTC (rev 4836) @@ -26,6 +26,10 @@ export read-only @item -P, --partition=NUM only expose partition NUM +@item -s, --snapshot + use snapshot file +@item -n, --nocache + disable host cache @item -c, --connect connect FILE to NBD device DEV @item -d, --disconnect