From patchwork Fri Sep 21 14:07:36 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Roth X-Patchwork-Id: 185817 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 423792C007A for ; Sat, 22 Sep 2012 02:18:33 +1000 (EST) Received: from localhost ([::1]:37701 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TF3vv-0003h1-1a for incoming@patchwork.ozlabs.org; Fri, 21 Sep 2012 10:10:19 -0400 Received: from eggs.gnu.org ([208.118.235.92]:41276) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TF3uM-0001qI-O8 for qemu-devel@nongnu.org; Fri, 21 Sep 2012 10:08:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TF3uC-0007Ji-Q2 for qemu-devel@nongnu.org; Fri, 21 Sep 2012 10:08:42 -0400 Received: from mail-ie0-f173.google.com ([209.85.223.173]:34534) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TF3uC-0007Cw-HG for qemu-devel@nongnu.org; Fri, 21 Sep 2012 10:08:32 -0400 Received: by mail-ie0-f173.google.com with SMTP id 17so990551iea.4 for ; Fri, 21 Sep 2012 07:08:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=2j3Fvf9Qn4Vr3TPx8jBiJ/6PGHFsEWe6Gk6edhftboo=; b=Iq1Zf0eUduRhwpliqpIpQFEvEcxdAWm5IO42nYf+vS2Hl4RwFkmgamE33Y9AF4ySFl SPHWoSq+kiZmqw/eEc99PUJHX3yNeJsjCPFdu0/1GKw8UfOIB85xi2LuVhlDKy5bCFVn QzVNvzt2sx1ALuP7D2Nl3nFYwC/S4zaIW+M7ciLEA8Drrycm7s0e6e2KPWNTtlVaB7RX c9tTHKk4o9MBQIXtYBgbtkMgXjvBNe8xHMQELQxQOtnmFvlW10gt97G7D0bkRS2eIK9l coO1/9wn87JSlcRwBFu7iyGK81gpIycOoazaLWpjcyCwsoGORWH/wZ2MjMcaJRLUvhV3 p9DA== Received: by 10.50.154.232 with SMTP id vr8mr1754556igb.38.1348236512382; Fri, 21 Sep 2012 07:08:32 -0700 (PDT) Received: from loki.morrigu.org (cpe-72-179-62-111.austin.res.rr.com. [72.179.62.111]) by mx.google.com with ESMTPS id ua5sm17301156igb.10.2012.09.21.07.08.30 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 21 Sep 2012 07:08:31 -0700 (PDT) From: Michael Roth To: qemu-devel@nongnu.org Date: Fri, 21 Sep 2012 09:07:36 -0500 Message-Id: <1348236465-23124-14-git-send-email-mdroth@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1348236465-23124-1-git-send-email-mdroth@linux.vnet.ibm.com> References: <1348236465-23124-1-git-send-email-mdroth@linux.vnet.ibm.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.223.173 Cc: blauwirbel@gmail.com, peter.maydell@linaro.org, aliguori@us.ibm.com, eblake@redhat.com Subject: [Qemu-devel] [PATCH 13/22] qom-fuse: force single-threaded mode to avoid QMP races X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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. 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()