[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] 'qemu-nbd' explicit flush
From: |
Stefan Hajnoczi |
Subject: |
Re: [Qemu-devel] 'qemu-nbd' explicit flush |
Date: |
Wed, 22 May 2013 11:47:00 +0200 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
On Tue, May 21, 2013 at 08:01:10PM +0000, Mark Trumpold wrote:
> Linux kernel 3.3.1 with Qemu patch to enable kernel flushing:
> http://thread.gmane.org/gmane.linux.drivers.nbd.general/1108
Did you check that the kernel is sending NBD_FLUSH commands? You can
use tcpdump and then check the captured network traffic.
> Usage example:
> 'qemu-nbd --cache=writeback -c /dev/nbd0 /images/my-qcow.img'
> 'mount /dev/nbd0 /my-mount-point'
>
> Everything does flush correctly when I first unmount and then disconnect the
> device; however, in my case I am not able to unmount things before
> snapshotting.
>
> I tried several approaches externally to flush the device. For example:
> 'mount -o remount,ro /dev/nbd0'
> 'blockdev --flushbufs /dev/nbd0'
Did you try plain old sync(1)?
> I have been looking at the Qemu source code and in user space 'nbd.c' in
> routine 'nbd_trip' I see the case 'NBD_CMD_FLUSH' which looks to be called
> from the NBD socket interface. Here I see 'bdrv_co_flush(exp->bs)' which
> looks promising; however, I don't know how to setup the 'bs' pointer for the
> call.
bs is the block device which was exported using:
exp = nbd_export_new(bs, dev_offset, fd_size, nbdflags, nbd_export_closed);
in qemu-nbd.c:main().
> Ideally, I would like to add a command line parm to 'qemu-nbd.c' to
> explicitely do the flush, but so far no luck.
Doing that is a little tricky, I think there are two options:
1. Add a signal handler (like SIGHUP or SIGUSR1) to qemu-nbd which
flushes all exports.
2. Instantiate a block/nbd.c client that connects to the running
qemu-nbd server (make sure format=raw). Then call bdrv_flush() on
the NBD client. You must use the qemu-nbd --shared=2 option.
Stefan