From nobody Tue Nov 4 15:31:23 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1530027746174643.3707077978424; Tue, 26 Jun 2018 08:42:26 -0700 (PDT) Received: from localhost ([::1]:53484 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fXq6r-00010G-8S for importer@patchew.org; Tue, 26 Jun 2018 11:42:25 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34346) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fXq59-0008PD-1R for qemu-devel@nongnu.org; Tue, 26 Jun 2018 11:40:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fXq57-0005fa-Qg for qemu-devel@nongnu.org; Tue, 26 Jun 2018 11:40:39 -0400 Received: from mail-wr0-x232.google.com ([2a00:1450:400c:c0c::232]:43517) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fXq57-0005el-GE for qemu-devel@nongnu.org; Tue, 26 Jun 2018 11:40:37 -0400 Received: by mail-wr0-x232.google.com with SMTP id c5-v6so6578567wrs.10 for ; Tue, 26 Jun 2018 08:40:37 -0700 (PDT) Received: from donizetti.lan ([82.84.124.111]) by smtp.gmail.com with ESMTPSA id y129-v6sm2308490wmy.4.2018.06.26.08.40.34 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 26 Jun 2018 08:40:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=6MGkYy7Cz0pDzxHed6+uAku0acR/2AjxTtOVW41C0y4=; b=o4V4UQu+jN7aaCvqg+0nHPG3CnrYBLzZCzU9SiwLGErdhDK7XVRJoOOSnigh+zyK+Y fY1VZGootvs58rL0Nw4HDSH8ROekErK0Q3ni9QBXxrzNeypcerlqETvOr3pZG6byZQbR BjnSueuUJ2RUhQApQuM+zOt/zJFhYCyalW8aWExzYyFH30V6lqMHHpMmg7MoU9hDnu7r zhE/FLQyQylZV9TknSn1/CuUZn4102KHE7zg42o70MFBjCRAe+cz4wHjNhmF/gwej+kx 93fGd085NJ5a/KojHVGL5S71EglWBa7xKxEd1ZQvbOqrBJN/rqmCHnfP9Mf6XkrSnGDs eA+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=6MGkYy7Cz0pDzxHed6+uAku0acR/2AjxTtOVW41C0y4=; b=WlrxCHUf3sFMOj/Spv4Mo2UwrHIe1f8C3yIdnD6WCwUoM/R4tFWuQ98aanmDTKCmbl ByIRGKPBO3bAcGDx/ZeolUpgwrRXpoqJlZ593hERGz5hOFg6oBrSsl7wAsS6K3mgGr22 La+uEValqg2IsUctqEhZNNlSYqXmtg6qmp/4nPyu1ZjXysrIGoOTCWyKSkJdeXKiOMyK HI0CopCCT+FXMzvONPmxkg/KxKREGOGcNk/aTMWsa0ADwnQ0OOQVSywenFdJw7F4weYy o1kda5krsIBjF2Zz+Yd70jMMxf37Zq23u9f34QZtHweuZ5QEQxMPNAIMQLVYQS4XGfsT 057A== X-Gm-Message-State: APt69E2ekK/G8OvEFY7WVggwTalfgqUaaDJjBYzWtT7MRwGHGy+03NgP HJsEJusEmoEZ0fOObm5YRwF1Buc3 X-Google-Smtp-Source: AAOMgpdubayaGHTAwJe2FhJDG0Ss0oYnKX02YTNnmy/LaDKr6+rOFC92tn5/uhB9cY4B4du14ru0oQ== X-Received: by 2002:a5d:470b:: with SMTP id y11-v6mr1940673wrq.107.1530027636151; Tue, 26 Jun 2018 08:40:36 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 26 Jun 2018 17:40:27 +0200 Message-Id: <20180626154028.11133-5-pbonzini@redhat.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180626154028.11133-1-pbonzini@redhat.com> References: <20180626154028.11133-1-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::232 Subject: [Qemu-devel] [PATCH 4/5] pr-manager: add query-pr-managers QMP command X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mprivozn@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This command lets you query the connection status of each pr-manager-helper object. Signed-off-by: Paolo Bonzini --- include/scsi/pr-manager.h | 2 ++ qapi/block.json | 27 +++++++++++++++++++++++ scsi/pr-manager-helper.c | 13 +++++++++++ scsi/pr-manager.c | 45 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 87 insertions(+) diff --git a/include/scsi/pr-manager.h b/include/scsi/pr-manager.h index 5d2f13a5e4..adadca7954 100644 --- a/include/scsi/pr-manager.h +++ b/include/scsi/pr-manager.h @@ -33,8 +33,10 @@ typedef struct PRManagerClass { =20 /* */ int (*run)(PRManager *pr_mgr, int fd, struct sg_io_hdr *hdr); + bool (*is_connected)(PRManager *pr_mgr); } PRManagerClass; =20 +bool pr_manager_is_connected(PRManager *pr_mgr); BlockAIOCB *pr_manager_execute(PRManager *pr_mgr, AioContext *ctx, int fd, struct sg_io_hdr *hdr, diff --git a/qapi/block.json b/qapi/block.json index c694524002..dc3323c954 100644 --- a/qapi/block.json +++ b/qapi/block.json @@ -77,6 +77,33 @@ { 'struct': 'BlockdevSnapshotInternal', 'data': { 'device': 'str', 'name': 'str' } } =20 +## +# @PRManagerInfo: +# +# Information about a persistent reservation manager +# +# @id: the identifier of the persistent reservation manager +# +# @is-connected: whether the persistent reservation manager is connected to +# the underlying storage or helper +# +# Since: 3.0 +## +{ 'struct': 'PRManagerInfo', + 'data': {'id': 'str', 'is-connected': 'bool'} } + +## +# @query-pr-managers: +# +# Returns a list of information about each persistent reservation manager. +# +# Returns: a list of @PRManagerInfo for each persistent reservation manager +# +# Since: 3.0 +## +{ 'command': 'query-pr-managers', 'returns': ['PRManagerInfo'] } + + ## # @blockdev-snapshot-internal-sync: # diff --git a/scsi/pr-manager-helper.c b/scsi/pr-manager-helper.c index 0c0fe389b7..b11481be9e 100644 --- a/scsi/pr-manager-helper.c +++ b/scsi/pr-manager-helper.c @@ -235,6 +235,18 @@ out: return ret; } =20 +static bool pr_manager_helper_is_connected(PRManager *p) +{ + PRManagerHelper *pr_mgr =3D PR_MANAGER_HELPER(p); + bool result; + + qemu_mutex_lock(&pr_mgr->lock); + result =3D (pr_mgr->ioc !=3D NULL); + qemu_mutex_unlock(&pr_mgr->lock); + + return result; +} + static void pr_manager_helper_complete(UserCreatable *uc, Error **errp) { PRManagerHelper *pr_mgr =3D PR_MANAGER_HELPER(uc); @@ -284,6 +296,7 @@ static void pr_manager_helper_class_init(ObjectClass *k= lass, &error_abort); uc_klass->complete =3D pr_manager_helper_complete; prmgr_klass->run =3D pr_manager_helper_run; + prmgr_klass->is_connected =3D pr_manager_helper_is_connected; } =20 static const TypeInfo pr_manager_helper_info =3D { diff --git a/scsi/pr-manager.c b/scsi/pr-manager.c index 87c45db5d4..b6c3056cc3 100644 --- a/scsi/pr-manager.c +++ b/scsi/pr-manager.c @@ -17,6 +17,10 @@ #include "block/thread-pool.h" #include "scsi/pr-manager.h" #include "trace.h" +#include "qapi/qapi-types-block.h" +#include "qapi/qapi-commands-block.h" + +#define PR_MANAGER_PATH "/objects" =20 typedef struct PRManagerData { PRManager *pr_mgr; @@ -64,6 +68,14 @@ BlockAIOCB *pr_manager_execute(PRManager *pr_mgr, data, complete, opaque); } =20 +bool pr_manager_is_connected(PRManager *pr_mgr) +{ + PRManagerClass *pr_mgr_class =3D + PR_MANAGER_GET_CLASS(pr_mgr); + + return !pr_mgr_class->is_connected || pr_mgr_class->is_connected(pr_mg= r); +} + static const TypeInfo pr_manager_info =3D { .parent =3D TYPE_OBJECT, .name =3D TYPE_PR_MANAGER, @@ -105,5 +117,38 @@ pr_manager_register_types(void) type_register_static(&pr_manager_info); } =20 +static int query_one_pr_manager(Object *object, void *opaque) +{ + PRManagerInfoList ***prev =3D opaque; + PRManagerInfoList *elem; + PRManagerInfo *info; + PRManager *pr_mgr; + + pr_mgr =3D (PRManager *)object_dynamic_cast(object, TYPE_PR_MANAGER); + if (!pr_mgr) { + return 0; + } + + elem =3D g_new0(PRManagerInfoList, 1); + info =3D g_new0(PRManagerInfo, 1); + info->id =3D object_get_canonical_path_component(object); + info->is_connected =3D pr_manager_is_connected(pr_mgr); + elem->value =3D info; + elem->next =3D NULL; + + **prev =3D elem; + *prev =3D &elem->next; + return 0; +} + +PRManagerInfoList *qmp_query_pr_managers(Error **errp) +{ + PRManagerInfoList *head =3D NULL; + PRManagerInfoList **prev =3D &head; + Object *container =3D container_get(object_get_root(), PR_MANAGER_PATH= ); + + object_child_foreach(container, query_one_pr_manager, &prev); + return head; +} =20 type_init(pr_manager_register_types); --=20 2.17.1