From nobody Tue Nov 4 15:26:24 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 1530216216388132.5734409896869; Thu, 28 Jun 2018 13:03:36 -0700 (PDT) Received: from localhost ([::1]:38273 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fYd8h-0006Ix-Mp for importer@patchew.org; Thu, 28 Jun 2018 16:03:35 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36425) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fYd38-0002Di-V2 for qemu-devel@nongnu.org; Thu, 28 Jun 2018 15:57:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fYd37-0000bt-Lx for qemu-devel@nongnu.org; Thu, 28 Jun 2018 15:57:51 -0400 Received: from mail-wm0-x22b.google.com ([2a00:1450:400c:c09::22b]:50989) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fYd37-0000ZU-BA for qemu-devel@nongnu.org; Thu, 28 Jun 2018 15:57:49 -0400 Received: by mail-wm0-x22b.google.com with SMTP id e16-v6so10965504wmd.0 for ; Thu, 28 Jun 2018 12:57:49 -0700 (PDT) Received: from 640k.lan ([82.84.124.111]) by smtp.gmail.com with ESMTPSA id d102-v6sm12516646wma.10.2018.06.28.12.57.46 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 28 Jun 2018 12:57:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=s6FUk87YKGeyiKgWUIZtX/7jlAuSyOv4eI+XEFoPLok=; b=L30be9i30kUrTRZWzaXglnQtn3xzGUZU7LCa8lQaCaVs9GgKAPS08cnpjUuKmeAyhD 6eM2DfEiZwvWUZfJLuPP/4+iqkVzYiTpSOCUaBykqUoEKxEYrMlW1n28v8R+qf7H9txw 9qNKXRAMqY4JtAJSryuvj38w64uQAEGWKdITqY+l2m7bbad08XqG9a7h7lV4mCYii1ni rpQvKJLTlMlgdOHf3+ECZB4b5uRSeKYO9Ni6DSx2r4Y3TZ13DHVEJUYUPG7jaCAMPtmy ynGFMqm68K9b9gNqE2IrMqYTBlt/O7x54vpmPSZKcWTqgU6ulmGPHufSZl0eY1aIpb/x Vs0A== 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:subject:date:message-id :in-reply-to:references; bh=s6FUk87YKGeyiKgWUIZtX/7jlAuSyOv4eI+XEFoPLok=; b=gKcw6Q19tHYx3TEUN7+pjhCLnf2QYJ4t6YepCPlL7gffZWBpOM1Zjq9LfOmQ2Y39BM nPBBi+S+Qa0yOAwOdnTBGaOdqfArU/N9oYDCB0ormnDjFhMkeX0VDX4Ivx+0NW50oBRw 2jrUFWMVxR0LiTuzJUeahG8lfjI2pxD6+cDb22/sV6NmeBev4AE4tri75JtknCPkVQEI 5A3C3g2r9oom6uSsRVnOxgl5oqzT4+doZMdbmc2h1k4PHo8tKY4IUOJit1RYfkSKWQrv 0zyttZ/tfyWmeFOgsc8UhrkPrTZrQbgAKT5AMd8qD7ahyNSSgqKeVPT2aWY+NjLfT6M9 /r2g== X-Gm-Message-State: APt69E0YqiyWPXla20xNzbeG/jU8+d1RSFc0SelO31YsKGZKAKPOEh6N qk6yyxXi3wmt2OlkELfTI5d/DkxN X-Google-Smtp-Source: AAOMgpcJqZk5FdkCJIoMjRhihi4r+KlpGs7exl4cqe3FSQO7H8C9Qq4Jw1PZXO68z5MzpwDL+/nvqQ== X-Received: by 2002:a1c:6502:: with SMTP id z2-v6mr8795487wmb.15.1530215867854; Thu, 28 Jun 2018 12:57:47 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 28 Jun 2018 21:57:37 +0200 Message-Id: <1530215858-1525-6-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1530215858-1525-1-git-send-email-pbonzini@redhat.com> References: <1530215858-1525-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::22b Subject: [Qemu-devel] [PATCH 5/6] 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: , 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 | 28 ++++++++++++++++++++++++++++ scsi/pr-manager-helper.c | 13 +++++++++++++ scsi/pr-manager-stub.c | 6 ++++++ scsi/pr-manager.c | 45 +++++++++++++++++++++++++++++++++++++++++++= ++ 5 files changed, 94 insertions(+) diff --git a/include/scsi/pr-manager.h b/include/scsi/pr-manager.h index 71971ae..50a77b0 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 ca807f1..8765c29 100644 --- a/qapi/block.json +++ b/qapi/block.json @@ -78,6 +78,34 @@ 'data': { 'device': 'str', 'name': 'str' } } =20 ## +# @PRManagerInfo: +# +# Information about a persistent reservation manager +# +# @id: the identifier of the persistent reservation manager +# +# @connected: true if the persistent reservation manager is connected to +# the underlying storage or helper +# +# Since: 3.0 +## +{ 'struct': 'PRManagerInfo', + 'data': {'id': 'str', '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'], + 'allow-preconfig': true } + + +## # @blockdev-snapshot-internal-sync: # # Synchronously take an internal snapshot of a block device, when the diff --git a/scsi/pr-manager-helper.c b/scsi/pr-manager-helper.c index 0c0fe38..b11481b 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-stub.c b/scsi/pr-manager-stub.c index 632f17c..738b6d7 100644 --- a/scsi/pr-manager-stub.c +++ b/scsi/pr-manager-stub.c @@ -22,3 +22,9 @@ PRManager *pr_manager_lookup(const char *id, Error **errp) error_setg(errp, "No persistent reservation manager with id '%s'", id); return NULL; } + + +PRManagerInfoList *qmp_query_pr_managers(Error **errp) +{ + return NULL; +} diff --git a/scsi/pr-manager.c b/scsi/pr-manager.c index 87c45db..2a8f300 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->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 1.8.3.1