From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:42500) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TMmWJ-00065x-Hq for qemu-devel@nongnu.org; Fri, 12 Oct 2012 17:11:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TMmWI-000649-Ck for qemu-devel@nongnu.org; Fri, 12 Oct 2012 17:11:47 -0400 Received: from mail-ie0-f173.google.com ([209.85.223.173]:36593) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TMmWI-0005iK-7f for qemu-devel@nongnu.org; Fri, 12 Oct 2012 17:11:46 -0400 Received: by mail-ie0-f173.google.com with SMTP id 17so5335456iea.4 for ; Fri, 12 Oct 2012 14:11:46 -0700 (PDT) Sender: fluxion From: Michael Roth Date: Fri, 12 Oct 2012 16:10:59 -0500 Message-Id: <1350076268-18461-18-git-send-email-mdroth@linux.vnet.ibm.com> In-Reply-To: <1350076268-18461-1-git-send-email-mdroth@linux.vnet.ibm.com> References: <1350076268-18461-1-git-send-email-mdroth@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH v4 17/26] qom-fuse: force single-threaded mode to avoid QMP races List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, peter.maydell@linaro.org, aliguori@us.ibm.com, blauwirbel@gmail.com, pbonzini@redhat.com python-fuse defaults to multi-threaded handling of filesystem calls. In the case of QOM this can lead to threads reading QMP responses to requests executed by other threads, causing all sorts of strangeness when interacting with QOM mounts. For instance: mdroth@loki:~/w/qom$ ls -l machine | grep type ls: error while loading shared libraries: tls/libacl.so.1: \ cannot read file data: Error 21 We fix this by unconditionally passing in the -s option, which forces single-threaded/serialized execution of filesystem calls. This flag is only honored if we pass dash_s_do='setsingle' to the Fuse class constructor and use the parse() method of that class to pass in arguments, so we do that here as well. Reviewed-by: Paolo Bonzini Signed-off-by: Michael Roth --- QMP/qom-fuse | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/QMP/qom-fuse b/QMP/qom-fuse index 5c6754a..b4a4eb3 100755 --- a/QMP/qom-fuse +++ b/QMP/qom-fuse @@ -134,5 +134,16 @@ class QOMFS(Fuse): if __name__ == '__main__': import sys, os - fs = QOMFS(QEMUMonitorProtocol(os.environ['QMP_SOCKET'])) - fs.main(sys.argv) + fuse_flags = list(sys.argv) + mount_point = None + + if not fuse_flags[-1].startswith('-'): + mount_point = fuse_flags.pop() + + # force single-threaded behavior to avoid races for QMP responses + if not '-s' in fuse_flags: + fuse_flags.append('-s') + + fs = QOMFS(QEMUMonitorProtocol(os.environ['QMP_SOCKET']), dash_s_do='setsingle') + fs.parse(fuse_flags + (mount_point and [mount_point] or [])) + fs.main() -- 1.7.9.5