From nobody Tue Feb 10 01:16:28 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=amd.com); dmarc=pass(p=quarantine dis=none) header.from=amd.com ARC-Seal: i=2; a=rsa-sha256; t=1713930245; cv=pass; d=zohomail.com; s=zohoarc; b=Nug3YKRdhQ+rX8pfWcAnzj2nWMvLVGEi1/ytqqgSwvwVPywd5zWHxg+YjGWadB1jA65vC9SUbWMOPSFamsOPp6Aw6TdOHqDaeK20SL7PS3i4S1R7TfsahKAHXZM1SWzwj+p0i+TODwimSJqWG26uG6No0A9Vol7XKMBlyCWj3IE= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1713930245; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=AQUYI8nFNauA8Eqc+dTwkfBb4u7bvFl+DOSdQh9a2O8=; b=G3jRQ3dYjhn2fDmdP+EhCmLmRN5KvQrkFtYOXfuNV4HdrEylp8YkcmDSkakWubqAnarWTfPcQ+shQulmqhNJQ1U3ahXVeM9eWKXjMXIbPa/7bnWrp8H18fVFHQ1+t+sV4EPq1A3o7nO/5I8i28tWgipUMdxRTzKGP0Oyur7T4ps= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=amd.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1713930245102937.2214440722645; Tue, 23 Apr 2024 20:44:05 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.711057.1110735 (Exim 4.92) (envelope-from ) id 1rzTY1-00013D-1M; Wed, 24 Apr 2024 03:43:53 +0000 Received: by outflank-mailman (output) from mailman id 711057.1110735; Wed, 24 Apr 2024 03:43:52 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rzTY0-000136-Sj; Wed, 24 Apr 2024 03:43:52 +0000 Received: by outflank-mailman (input) for mailman id 711057; Wed, 24 Apr 2024 03:43:51 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1rzTQg-0003iy-A8 for xen-devel@lists.xenproject.org; Wed, 24 Apr 2024 03:36:18 +0000 Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on20600.outbound.protection.outlook.com [2a01:111:f403:200a::600]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id ce1f1d0c-01eb-11ef-909a-e314d9c70b13; Wed, 24 Apr 2024 05:36:17 +0200 (CEST) Received: from BL0PR0102CA0061.prod.exchangelabs.com (2603:10b6:208:25::38) by PH8PR12MB7206.namprd12.prod.outlook.com (2603:10b6:510:226::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7519.22; Wed, 24 Apr 2024 03:36:12 +0000 Received: from BL6PEPF0001AB73.namprd02.prod.outlook.com (2603:10b6:208:25:cafe::1) by BL0PR0102CA0061.outlook.office365.com (2603:10b6:208:25::38) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7495.34 via Frontend Transport; Wed, 24 Apr 2024 03:36:11 +0000 Received: from SATLEXMB03.amd.com (165.204.84.17) by BL6PEPF0001AB73.mail.protection.outlook.com (10.167.242.166) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.7519.19 via Frontend Transport; Wed, 24 Apr 2024 03:36:11 +0000 Received: from SATLEXMB08.amd.com (10.181.40.132) by SATLEXMB03.amd.com (10.181.40.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Tue, 23 Apr 2024 22:36:11 -0500 Received: from SATLEXMB03.amd.com (10.181.40.144) by SATLEXMB08.amd.com (10.181.40.132) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Tue, 23 Apr 2024 20:36:10 -0700 Received: from henry-MS-7D54.amd.com (10.180.168.240) by SATLEXMB03.amd.com (10.181.40.144) with Microsoft SMTP Server id 15.1.2507.35 via Frontend Transport; Tue, 23 Apr 2024 22:36:09 -0500 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: ce1f1d0c-01eb-11ef-909a-e314d9c70b13 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ghRDvkE9FCgwOryUffkQ9/MwMaiV/3XgkUUbsRiyZV1Ju4JDEoOE3d4quczvM9RU7t801t4SWP4jZUvyJC8LNHE3XjA6EWqNofTeXngVmMIKXBfO3QkqYH7/j0rkmtWNvW5H3nzSxGpEBqrgZqPqqUbdzyDYoU91RCcot+qwc8x7cNKoB9x2vD6LSQLDM5nn1DJRVapKLpnBQxQJZRk6zaFECljOYc1rn+LhrFe7uRD4/ZPaUeksycAUVPwfUtsFp9a4RPexFbcufFjVFBk7DyXDav1aJB36xf9JFmN6ah7PqL5S63oKsqRxzbZc1CC3nMJjy2Z+HThri4PqG7ZaNQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=AQUYI8nFNauA8Eqc+dTwkfBb4u7bvFl+DOSdQh9a2O8=; b=Hg6AyUF//gVHUUAvePooLAjWKg3lzfTBVFQLY6PPF/xxFCSWjQ+TK16Czg9ySV4aMUFCYYaGQi8aboE2dXunUVGvJpRcMHVL9w/SLbiBH+V0rZZ92mzDioo+8GIvXokuqXL3pVEaqvSV39iFs5n7B0caaSOhIpH/UkWirBvOvgIbA7z2MrPyPB42ZQvbpixxAtzNeQ7i+mpblIj4X1Ub7YFHVgBQ9D5Sbl5fNnl8jFj2CV7Xrlw9f/T8DV0JoQODNk5JcLSDpKXntEDo4bs58m6DWag0cnACnlDoFh/xh2b/Ei+B/5i7vAr8MPqhr2jBRnktrXwQuyQPewhT7eX/lQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=AQUYI8nFNauA8Eqc+dTwkfBb4u7bvFl+DOSdQh9a2O8=; b=NB4Jbd0TLDTXBfahb8afVzymAvLYtFwrQWa+qWp2ymRyc6DC4Vs0Mbg2aESyxRy3j2dMZG41qgbf6+e2725bNGYK20CLCC+Iw97kBjh4YxVwmlERzQFPkBE0E1mxxiB7kOWfBDfTRkNzvAV6tli3vabUSuEv0F9gQyN82zz1JBE= X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB03.amd.com; pr=C From: Henry Wang To: CC: Vikram Garhwal , Anthony PERARD , Stefano Stabellini , Henry Wang Subject: [PATCH 13/15] xl/overlay: add remove operation to xenstore Date: Wed, 24 Apr 2024 11:34:47 +0800 Message-ID: <20240424033449.168398-14-xin.wang2@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240424033449.168398-1-xin.wang2@amd.com> References: <20240424033449.168398-1-xin.wang2@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL6PEPF0001AB73:EE_|PH8PR12MB7206:EE_ X-MS-Office365-Filtering-Correlation-Id: 3df460e3-5aae-437d-590a-08dc640fafa2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230031|1800799015|82310400014|376005|36860700004; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?TdSarGKTVe51lz0a5kBmLLtN4JH9E1C/limauW/385+6HgkrE0eLPd7S4OUz?= =?us-ascii?Q?tr2+yOqQW6YtjGty/LjAuVxVFqFFf7goUCzFmJdvslNm4AY6lPm4POtW042a?= =?us-ascii?Q?Z4wqyYUiwKYK8tMt74ZV1sgNQNRR45CKZGgJ4Saze56BFdeYf84UhmLM8FPi?= =?us-ascii?Q?6xrKF09ueQAr+ccZ7RgF/pTv0DEE9W0eRhHj2nmNbHCeMdlG8K1M3pPsJwt8?= =?us-ascii?Q?CWDwovIUm3c3+8bX813nbCI7XGz8/r3i6Z1CAsgakI2m/KPV2UA996gvVxnP?= =?us-ascii?Q?wZLSEzluNRZRhMHRa0EQ2FgrhaqhgV7K6y9l4q8P9xboPHzULrKGUF03XUCR?= =?us-ascii?Q?eFpGTBj6EwFM8cfo/21C8sfwsaZnZNmJyR8lD5wjfLyUNKJLu37RPJGOqKoi?= =?us-ascii?Q?3swZzAJwMSq+egrEmq7AJhAY/f1oqbEmpYtBvw69JJnupDXn/xKr4yprInt+?= =?us-ascii?Q?cU1F7yA5Y3E2jaxsk6uNEJi4De1yuo5n3yU59YsGMAoYNcvti3JkkUZ9Ph/+?= =?us-ascii?Q?SZlEzXBZ9ST5i/SYtNk3oFnnxmmelY0lPgvovnlMOBPf8WoCex89AVFX7mqz?= =?us-ascii?Q?XMXuEuewBAekC0OW5Pl681djcBJ77DneVOaK488Y7Db6yzS9q0lxeO1pUoaF?= =?us-ascii?Q?N+lL7R+KtzItyau3rt0qXWzRS6LUZooovv5Q0ruSqTav1Sbrty6JItgdDo+I?= =?us-ascii?Q?BUp1fXDvWAsz75D1C2l/1LIxtZL10fYXATi54w63VeY5olLnu2QOTJ49a6tv?= =?us-ascii?Q?Uh0F3gTzII+fD/9ds7YsVyQpr6jqocrPphLj/NTSmmPmkr/R2HKFWaoC6RaZ?= =?us-ascii?Q?5nP+Ik7e8njzpwfPP90eRhKAvgbI/oZsLalsVRMUMi/nb46LFd3mjexBA1D8?= =?us-ascii?Q?MKz3jIgeBmuk8KHHKpF1opR+WMpEVkca7PY7MyVHIBrzMBgmHtAqLQrGQ9bh?= =?us-ascii?Q?A0QL3NPJ9DjkDQnUOvKdJ4CxjStGBM1HGK/8a1kNBeVHw/YjOT/nL1uXuT+U?= =?us-ascii?Q?d69mOLMOXh73V/rcMt8/dB3C7WgSqkso0X/QmpjTyXXh1eLZJan2fYsgyTSX?= =?us-ascii?Q?ajRdKce8GM3lyERucDqAKr0akogONq2LmNVm6/qphCG8pak1O3NPGIdWfN8S?= =?us-ascii?Q?G0W+vwrRQUm157twupH4QzCenPJe5OAjlbl0zIPuw72QwGphN/xKx/VL7BGm?= =?us-ascii?Q?WiuDtXE1s2EJNne9CXKw7vPw70h1Onu7A2805l/Mg/+FSBa/SDV7gRmYi44l?= =?us-ascii?Q?+/SJl7oiKYOR8ZTlYaKbypN4lAnwx2wB0vr4kL5XMKuRa2jROMlgFRDbc8+T?= =?us-ascii?Q?htdxTWZI7OaapO+oigcGabM+Cx1GBC9epj2MhUSSujgHVmZy9fYL5EsagACb?= =?us-ascii?Q?oCyHnhc=3D?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB03.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230031)(1800799015)(82310400014)(376005)(36860700004);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Apr 2024 03:36:11.3238 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3df460e3-5aae-437d-590a-08dc640fafa2 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB03.amd.com] X-MS-Exchange-CrossTenant-AuthSource: BL6PEPF0001AB73.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH8PR12MB7206 X-ZohoMail-DKIM: pass (identity @amd.com) X-ZM-MESSAGEID: 1713930246970100001 Content-Type: text/plain; charset="utf-8" From: Vikram Garhwal Add 3 new command line parameters to the xl overlay command: overlay name, type and partial. Pass these paramters to the domU via xenstore. Also introduce support for "operation" in xenstore: it can be "add" or "remove". In case of "remove", the overlay is to be removed from the domU device tree. Signed-off-by: Vikram Garhwal Signed-off-by: Stefano Stabellini Signed-off-by: Henry Wang --- tools/xl/xl_vmcontrol.c | 184 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 173 insertions(+), 11 deletions(-) diff --git a/tools/xl/xl_vmcontrol.c b/tools/xl/xl_vmcontrol.c index 2bf76dd389..ddd6e9e370 100644 --- a/tools/xl/xl_vmcontrol.c +++ b/tools/xl/xl_vmcontrol.c @@ -1466,8 +1466,123 @@ static uint32_t get_num_pages(struct xs_handle *xs,= const char *xs_path) return num_pages; } =20 +static bool write_overlay_operation(struct xs_handle *xs, char *operation, + char *path) +{ + xs_transaction_t xs_trans =3D XBT_NULL; + char buf[128]; + char ref[64]; + +retry_transaction: + xs_trans =3D xs_transaction_start(xs); + if (!xs_trans) + return false; + + snprintf(ref, sizeof(ref), "%s", operation); + snprintf(buf, sizeof(buf), "%s/overlay-operation", path); + + if (!xs_write(xs, xs_trans, buf, ref, strlen(ref))) + return false; + + if (!xs_transaction_end(xs, xs_trans, 0)) { + if (errno =3D=3D EAGAIN) + goto retry_transaction; + else + return false; + } + + return true; +} + +static bool write_overlay_name(struct xs_handle *xs, char *name, + char *path) +{ + xs_transaction_t xs_trans =3D XBT_NULL; + char buf[128]; + char ref[64]; + +retry_transaction: + xs_trans =3D xs_transaction_start(xs); + if (!xs_trans) + return false; + + snprintf(ref, sizeof(ref), "%s", name); + snprintf(buf, sizeof(buf), "%s/overlay-name", path); + + if (!xs_write(xs, xs_trans, buf, ref, strlen(ref))) + return false; + + if (!xs_transaction_end(xs, xs_trans, 0)) { + if (errno =3D=3D EAGAIN) + goto retry_transaction; + else + return false; + } + + return true; +} + +static bool write_overlay_type(struct xs_handle *xs, char *type, + char *path) +{ + xs_transaction_t xs_trans =3D XBT_NULL; + char buf[128]; + char ref[64]; + +retry_transaction: + xs_trans =3D xs_transaction_start(xs); + if (!xs_trans) + return false; + + snprintf(ref, sizeof(ref), "%s", type); + snprintf(buf, sizeof(buf), "%s/overlay-type", path); + + if (!xs_write(xs, xs_trans, buf, ref, strlen(ref))) + return false; + + if (!xs_transaction_end(xs, xs_trans, 0)) { + if (errno =3D=3D EAGAIN) + goto retry_transaction; + else + return false; + } + + return true; +} + +static bool write_overlay_partial(struct xs_handle *xs, bool is_partial, + char *path) +{ + xs_transaction_t xs_trans =3D XBT_NULL; + char buf[128]; + char ref[4]; + +retry_transaction: + xs_trans =3D xs_transaction_start(xs); + if (!xs_trans) + return false; + + snprintf(ref, sizeof(ref), "%d", is_partial); + snprintf(buf, sizeof(buf), "%s/overlay-partial", path); + + if (!xs_write(xs, xs_trans, buf, ref, strlen(ref))) + return false; + + if (!xs_transaction_end(xs, xs_trans, 0)) { + if (errno =3D=3D EAGAIN) + goto retry_transaction; + else + return false; + } + + return true; +} + + static int share_overlay_with_domu(void *overlay_dt_domU, int overlay_dt_s= ize, - int domain_id) + int domain_id, char *overlay_ops, + char *overlay_name, + char *overlay_type, bool is_overlay_par= tial) { struct xs_handle *xs =3D NULL; char *path =3D NULL; @@ -1574,6 +1689,34 @@ static int share_overlay_with_domu(void *overlay_dt_= domU, int overlay_dt_size, goto out; } =20 + /* write overlay ops */ + if (!write_overlay_operation(xs, overlay_ops, path)) { + err =3D ERROR_FAIL; + fprintf(stderr,"Writing overlay_ops ready failed\n"); + goto out; + } + + /* Write the overlay-name. */ + if (!write_overlay_name(xs, overlay_name, path)) { + err =3D ERROR_FAIL; + fprintf(stderr,"Writing overlay_name ready failed\n"); + goto out; + } + + /* Write the overlay-type. */ + if (!write_overlay_type(xs, overlay_type, path)) { + err =3D ERROR_FAIL; + fprintf(stderr,"Writing overlay_type ready failed\n"); + goto out; + } + + /* Write the overlay-partial. */ + if (!write_overlay_partial(xs, is_overlay_partial, path)) { + err =3D ERROR_FAIL; + fprintf(stderr,"Writing overlay_partial ready failed\n"); + goto out; + } + /* Write the status "done". */ if (!write_status(xs, "done", sender_status_path)) { fprintf(stderr,"Writing status DONE failed\n"); @@ -1611,13 +1754,16 @@ int main_dt_overlay(int argc, char **argv) int overlay_dtb_size =3D 0; const int overlay_add_op =3D 1; const int overlay_remove_op =3D 2; + char *overlay_name =3D "overlay"; + char *overlay_type =3D "normal"; + bool is_overlay_partial =3D false; =20 if (argc < 3) { help("dt-overlay"); return EXIT_FAILURE; } =20 - if (argc > 5) { + if (argc > 7) { fprintf(stderr, "Too many arguments\n"); return ERROR_FAIL; } @@ -1625,17 +1771,22 @@ int main_dt_overlay(int argc, char **argv) overlay_ops =3D argv[1]; overlay_config_file =3D argv[2]; =20 - if (!strcmp(argv[argc - 1], "-e")) - auto_mode =3D false; - - if (argc =3D=3D 4 || !auto_mode) { + if (argc =3D=3D 4 ) { domain_id =3D find_domain(argv[argc-1]); domain_mapping =3D true; - } - - if (argc =3D=3D 5 || !auto_mode) { - domain_id =3D find_domain(argv[argc-2]); + } else if (argc =3D=3D 5 && !strcmp(argv[4], "-e")) { + domain_id =3D find_domain(argv[3]); + auto_mode =3D false; domain_mapping =3D true; + } else if (argc =3D=3D 7) { + domain_id =3D find_domain(argv[3]); + domain_mapping =3D true; + overlay_name =3D argv[4]; + overlay_type =3D argv[5]; + is_overlay_partial =3D atoi(argv[6]); + } else { + fprintf(stderr, "Invalid arguments\n"); + return ERROR_FAIL; } =20 /* User didn't prove any overlay operation. */ @@ -1678,7 +1829,18 @@ int main_dt_overlay(int argc, char **argv) =20 if (domain_id && auto_mode && (op =3D=3D LIBXL_DT_OVERLAY_ADD)) rc =3D share_overlay_with_domu(overlay_dtb, overlay_dtb_size, - domain_id); + domain_id, "add", overlay_name, + overlay_type, is_overlay_partial); + + if (rc) { + free(overlay_dtb); + return rc; + } + + if (domain_id && auto_mode && (op =3D=3D LIBXL_DT_OVERLAY_REMOVE)) + rc =3D share_overlay_with_domu(overlay_dtb, overlay_dtb_size, + domain_id, "remove", overlay_name, + overlay_type, is_overlay_partial); =20 free(overlay_dtb); return rc; --=20 2.34.1