From nobody Tue Nov 4 15:31:25 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 1530217514201963.0174828067776; Thu, 28 Jun 2018 13:25:14 -0700 (PDT) Received: from localhost ([::1]:38379 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fYdTd-0006bd-9X for importer@patchew.org; Thu, 28 Jun 2018 16:25:13 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38256) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fYdAt-0007XP-Pp for qemu-devel@nongnu.org; Thu, 28 Jun 2018 16:05:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fYdAs-0000ra-Jd for qemu-devel@nongnu.org; Thu, 28 Jun 2018 16:05:51 -0400 Received: from mail-wr0-x22f.google.com ([2a00:1450:400c:c0c::22f]:41894) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fYdAs-0000qg-91 for qemu-devel@nongnu.org; Thu, 28 Jun 2018 16:05:50 -0400 Received: by mail-wr0-x22f.google.com with SMTP id h10-v6so6672550wrq.8 for ; Thu, 28 Jun 2018 13:05:50 -0700 (PDT) Received: from 640k.lan ([82.84.124.111]) by smtp.gmail.com with ESMTPSA id 127-v6sm6211110wmd.18.2018.06.28.13.05.47 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 28 Jun 2018 13:05:48 -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=cSFD0AyZNHPFwboSuOaUP9vmLmll6y1Q4aucLXuPfocR70wKlxI6JW69VpoVswXHDN nExuq64HIBMALYg23zS+ZLrIPBqj1xk6i69HIqcjwQSQbzupRTYNMY2VI76J30AsdcZN bY6mrnx7HfJpfYtXQ+lYTy3t6pkVj69+t6UNiGOyP+287Cd92fCFBBxUbKwebvf4J+D+ q+/aUaX72EJQR64wqYfVUTWapA/lLq32Gxk7u9mnro/JEvwHS+sn2cdoS4pHjuY2LU/x eBBNKT3KGd6D3ZGbSll7GCkXR0bGtIsjJlDspGKUdAMKCQkQW9fAHuNhM3HJY9JzaPVQ sdhQ== 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=h8AYaFOorx1i4JeiNvm5eN3gG+5XvrZRICqd+yWtuQKSQMHvdp+e5a+e+HpOYIY6W3 74UdeAMKwfIDlbNDopNKALQq7Y9Ob2S1VNEluxGqGeRhGYR2inT3b2Svxxci0LoOYjC0 gEjffnbf97D+iye5c1YktdrzJSPoD+yIr6FGh+5pYQuYNAOb3DUivqn5RYwIGkkkSnLU gYGuz/thXlP0rNNE9NqokBFe/+xHKMZTBWAcoYocyBtFwAqZpI1iOInxyGyr6VcjZIFe i9PptM6bcaa9QqVV2TI781bUUDJCY07vPQPr/q7kIAV6/poIcituM0gqS9Zvdy2YOMQy aVKw== X-Gm-Message-State: APt69E3LNz2lHKdUVbjD7epHf7syscfx+BBXRdtt8VipmhaiqMG1pqW8 vmzGEGV89WoCx+1C/LGqZCwuJ9Df X-Google-Smtp-Source: AAOMgpc38ekYlcaHEnAGaY5d8wfMh/Hjt2fFV1NsM+6SuTktuZ4Ws06941ixI2zYgvmmCrGa/jve7g== X-Received: by 2002:adf:fe46:: with SMTP id m6-v6mr9568007wrs.171.1530216348955; Thu, 28 Jun 2018 13:05:48 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 28 Jun 2018 22:04:46 +0200 Message-Id: <1530216310-52873-37-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1530216310-52873-1-git-send-email-pbonzini@redhat.com> References: <1530216310-52873-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:c0c::22f Subject: [Qemu-devel] [PULL 36/60] 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