From nobody Mon Sep 8 17:06:07 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=pass (i=1 dmarc=pass fromdomain=cyberus-technology.de); dmarc=pass(p=none dis=none) header.from=cyberus-technology.de ARC-Seal: i=2; a=rsa-sha256; t=1756387400; cv=pass; d=zohomail.com; s=zohoarc; b=AZrkZF0bVUhDP1E2G38LdfX1g+TWrRHVfEKHDkqXRXpKJa79PvNyfa1lORN4NcCuQfASoeKya7P5xaQZHKCNa2KbluNTqW3WcMJul6rclUEez4UG7zwi9ejECudUct998WecxsY0ceJmOJexw4K7hUhyMm+YK/iW6cy92ifYF/I= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756387400; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=cGzVuFEDq3zpQuqKo63NwtB6T4InNXs1DysUjk9c6bM=; b=H6rovVlaB9hw2tbM+d1/3F9q0+JJ0oDBTcIQd5ocBRD4TBrmD8iZy5iz7MmayECJkEh5fpBozgik9VsgprJSI8C+bEm5yrc3kt41YNJVffTbzJWU2kWnHVfBuprm9GYZsF5gb/bFV3wCoNjjMiomA/3bcQzpUhtWZvihXgrcmVE= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=pass (i=1 dmarc=pass fromdomain=cyberus-technology.de); dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1756387400712716.0197578584464; Thu, 28 Aug 2025 06:23:20 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 0525D440F8; Thu, 28 Aug 2025 09:23:19 -0400 (EDT) Received: from [172.19.199.3] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 26F4044408; Thu, 28 Aug 2025 08:56:40 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 6076B440DB; Thu, 28 Aug 2025 08:55:16 -0400 (EDT) Received: from BEUP281CU002.outbound.protection.outlook.com (mail-germanynorthazon11020075.outbound.protection.outlook.com [52.101.169.75]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 49E7244084 for ; Thu, 28 Aug 2025 08:55:08 -0400 (EDT) Received: from BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM (2603:10a6:b10:46::5) by BEZP281MB3073.DEUP281.PROD.OUTLOOK.COM (2603:10a6:b10:74::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9073.14; Thu, 28 Aug 2025 12:55:06 +0000 Received: from BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM ([fe80::7272:f32d:eb8d:e401]) by BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM ([fe80::7272:f32d:eb8d:e401%5]) with mapi id 15.20.9052.021; Thu, 28 Aug 2025 12:55:06 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=ARC_SIGNED,ARC_VALID, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=dcPpUhij5uGtirQLgrYRTRJrD02m6FaRYfGu9kKXxtzGqH81FqpP0pk1RPWoHJL0tfc+WJ0HB7jA1hdIn0ShFAbzF9rqmrHvB3/qr0uzswtTh5vTQH9vbrr/TVVFYP270uWvbrayp52D3hZ6Cvr1Zwv5YQBoddmgd6+5oHZeE9v2FNUwb8kUHs6NmUYE1KDXfVsr1qXclf6wJ7zZUSpxqoVlWprg8wTqCdDncf7iL4ZG80pML1ggTNO3R1zmi+xsz/WKjxCQxDx00yNHQJgkFKsJtK6te1/FVQnWRwbuhxP6NJloppI2XK0z7sqy/SNPawmi2rMCpNwsQd/FZLwkwA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=cGzVuFEDq3zpQuqKo63NwtB6T4InNXs1DysUjk9c6bM=; b=aC7qF4BNH4SDc0j2+hKiFAlRDZf7+fbpliLyCt+y2DOie9fWXd2Fbxi8IJho2+Nrv5DK+duEz9nTT27iAgnrWJOazZdxb2Y+8Ybo8TgyBQhuhKs61LycswnabuUVtu+aXZKOXEeN2ObYROlQYybDWqczVPQPTZ0kcFesP3YUQ7F7om3a4+TiFBWje1JSznody44L+3eQt15mFnZ07I4RELoVBolybLj+2f2mIpTQ5BAcedS2NLRdVgAT4xsSa1mpXlUL7tYfWajLybjngyy2c3OMcZLf4U3M45gRtOZCXbuwFerJaeWtb3FLaXfS8IY6kSK22ADmXF8BFrnA3C2ztg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=cyberus-technology.de; dmarc=pass action=none header.from=cyberus-technology.de; dkim=pass header.d=cyberus-technology.de; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cyberus-technology.de; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=cGzVuFEDq3zpQuqKo63NwtB6T4InNXs1DysUjk9c6bM=; b=AjNz/i9hFBvimccX+k2kLMXJPfWB0rizdMUQiwsKmpFYyzBvHhvL/pNR6kNXMMG7zXL0OnA4bc3/sQWK9PgqTHfcniIefQDFc013VbI0YE6l10/ujmzVvm0/MWahNBYaYQLmAKTx4YHIDcbIt4QGXtjw3lCOQg/3NK8WIg5r0YwpsOyvMoWyoE2KxchTs510o0teN8FSNAIU0TRbT6jQjmPdKD08ny5y4TnnpxC9GOTBhcXYs5McSmJ7uO4P+OZCugDzCw+T6AnduNl87E2YIXBz57bXezcVmPQCHGKbw6tw72Kcd0K2wDfQa+o6imooydFq2nqvNCAnp9ZsqSyNAA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=cyberus-technology.de; From: Stefan Kober To: devel@lists.libvirt.org Subject: [PATCH 12/13] ch: implement disk device hot removal Date: Thu, 28 Aug 2025 14:54:52 +0200 Message-ID: <20250828125453.202358-13-stefan.kober@cyberus-technology.de> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250828125453.202358-1-stefan.kober@cyberus-technology.de> References: <20250828125453.202358-1-stefan.kober@cyberus-technology.de> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR4P281CA0249.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:f5::19) To BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM (2603:10a6:b10:46::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BEZP281MB1973:EE_|BEZP281MB3073:EE_ X-MS-Office365-Filtering-Correlation-Id: 1ac75301-5af6-404e-1a39-08dde6321c9a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024|10070799003; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?6Asz+ESFi1j7pU/kKF93cy6ehh3xjHq6r+kvU4qtGoasDxsZNK8cDaFgnAmI?= =?us-ascii?Q?khfQleV11woBZby7oWo2NoJW+K2aVNrvfun8Ch14Y4LeMPSZ2kXHjucfsI3V?= =?us-ascii?Q?LI7MW/Tcp9TiOR3LH4grsIVanVVCcNDAM1tYEfRODJGCL2RHs9HN0u+P7GBN?= =?us-ascii?Q?TQNspNAxUSmauVj6lGkedEDUoVpsEEZbS8IH66lziZzVbHuZg1e2FgGJib2c?= =?us-ascii?Q?xL6mQFUQDKMPcJp/KFBBqS0pGv8mCYdlQnz82SXuv7ooctMBSLCQw4YympLr?= =?us-ascii?Q?BEbs8IveQWuaqUwWP7trKuy3mD5dmLdDqGs0uyCqgMsHtiXrqlcqgdOBCkH0?= =?us-ascii?Q?GKqgsdd1KM1rw762fhRE+64AUiwjTiKA8/gIMqPhW0xMBJig55cQI0A7mXPW?= =?us-ascii?Q?a1JJfFnS5kraC91MiPtP78rkpYQ0LreZERavYoSXwLr3upR1poCLAZBJUon+?= =?us-ascii?Q?fpAsW+EAjNAe0wv7EhBOqcx1a1s0SV+364vYn1TdtPfLYgIYfm9d2ouaoQRX?= =?us-ascii?Q?BhLfonj81fwshdZ0aHsy+mHo3IHpKAIwoSm0jUgCQ2YoorXP6YX2cClevUhX?= =?us-ascii?Q?O4wWBnmkKEfRtBFBbxf/ijh9jtB4nWoXRETrLPjDj5mbkJlVPXC5boX7lADA?= =?us-ascii?Q?sg5AKzbCuXMSzojd0p4TCabZMOqk0H1cU8RNaux+ZSx5jtZSrWlvsibnb+6Q?= =?us-ascii?Q?/2opZ3ldt8KcRhTqhUHCnFX1qeW5Bj+lPvohEKzDMcQ1udkT0P16N5A+DGSk?= =?us-ascii?Q?pXFEao0C/3TL+Nd03aRmf767F531DWqz3jDkQxgBtxgFEoJf3Uql62eKk6LV?= =?us-ascii?Q?Q6GqN9zdg3wCok7r/49E8hjxHfcaBJfg1OdbW6SvMb4yj6HkqzWVjfQKOTag?= =?us-ascii?Q?gjoUlyUqX/YEhos/xebi8PBR3/02Vw1bSaXYougHRSEIT1BSVXBpHxXNj2Ey?= =?us-ascii?Q?FxH28NI4KCdnJwe6AW9u+5RAeI7CBj0iew5PtlU1f5ciZg5mRIufvL/gYQal?= =?us-ascii?Q?lEda1r4P7sOgAmWEjkNvnqgucEOQshBKWcxiRJovDCmwo/d6j3+fg19xMrc+?= =?us-ascii?Q?bREe3JR052Kizmqx0vWWYsj3FMVJ28KM+VRkCG0GLvr2xbwaz9CYGYgoRrfI?= =?us-ascii?Q?/TPchljgvHSlmRTrrljhbGZHW7Oa1PbE3XueXPLcwOUcLJbSwKMdcZ+scESQ?= =?us-ascii?Q?CZCgy+poeOz1Oi0ZrhBehCs30D81qaLU3hc5UddmsGaT5MKs2iUQaKZK6cKV?= =?us-ascii?Q?neuz0MRH8fhRrnef0xY5ZVPU1MNNqgpXGrtrjytqBIEWTIgxfUVgj/OD7X1D?= =?us-ascii?Q?sYRSiBA+ZP/Lkduvf/iuPBsJ/eqtK/L+64DeW61n4aZH5u76CzPRfXql7oSh?= =?us-ascii?Q?WczwLaqE0B+4bQw8/CrMRv5U9NGTaxy8a03avdVa6CEjc3d0APucMhAs0x8o?= =?us-ascii?Q?kdNDzLoR3ws=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024)(10070799003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?ps4fv6KG4UAlSRdVwN/J0rc9C+nmhKgZm+HRJaupCdgaJHpZNHWdNiunUAM/?= =?us-ascii?Q?SgZOtXnv/WwjVO7pP0aB7T2+313O36gnR6RI4B6hhPgiJmaUiv/LTEw7JTp/?= =?us-ascii?Q?c1Tbaw0BQ9B6NIj6p3YHRwC67RSCk8E/1O2Z6gGngiXCpSRoTilGQab6OnJJ?= =?us-ascii?Q?OVReULQv5/TbZzeJZI/4ErMd+EBiIJ3oukqRj/JBDSbfaWangiTzMzc5qGkc?= =?us-ascii?Q?hTReXCSe/FuJuXlcDaHK6Vbm9xLbSthXYRgWS4He/IFbB4/x2vi3MropOcnY?= =?us-ascii?Q?jOIt5Jigsvc95/CEpGC82KNp8vUKRU5Im3LrkynPV5/WXCvcQBVtxBBEVGjT?= =?us-ascii?Q?JyHpClblOwspo93ZXzUFBOTXj5UHfrS7uTPUhLhi9roGwVoEyGlLFHBVrZEp?= =?us-ascii?Q?pWZq8WzVF1APRB59M2x9pXRP3JIluEAzTvl+nVfYYxU+fxC/iFtsFyoZJAFS?= =?us-ascii?Q?fBdi74dOLlogHjVbn+5JzT723EUwNS4okvG4a6f5z/ay2kHnVMT6SFb6UIEc?= =?us-ascii?Q?ZVv+5xr43a94ibw3Aa5iKAG/3aqQ7hEw95DtAklyGBFKquu0qjiMaC49Tj/C?= =?us-ascii?Q?vjT1zhPD1gtdR2BrDMr7iDA7/MBqj3vIbs0lc6Zhny7RVNWUjScnQ+bPJSUN?= =?us-ascii?Q?kR72gcRQkQausdymxPkKqapUutj+s46Ksz5stHXv6qYQAu6fw62v9CoLAw5Q?= =?us-ascii?Q?lyI10gXqq4zM8+6oPD9r60qHSs3O1RSzioSNYx9fJW9GgMqjuAx9iPUE3nCd?= =?us-ascii?Q?YXOCdz43w8BiqGD/3ItQHCJ0GKviOC7rZ+s/fKURwV/6XB6zKM9sSYRetkw3?= =?us-ascii?Q?uwNWY1q3YWn0yoTWp3v2bytlm2bYxeSlX+snGmOxnpYuxSlpu9TuCXlWAZKY?= =?us-ascii?Q?qgf5BrJd5IfBd/AJwYDzU2JTra8iSsJDrc2A/jnPzGFYFNUUmSCVwTz+zdWo?= =?us-ascii?Q?7ULDkskB9nWE7pijfImsE+09Nq6aWUZS7759f2QgDAiC43StshsbuIBu9KWf?= =?us-ascii?Q?SQIESFn302dkBClgYzPtnMG/YSV7bIgs2Sf8MU3+LWrmvnu7w7a29SCNkL/h?= =?us-ascii?Q?exqnpsreOe2J2seWUU+6qPDGUyzqyrsT4xEO04zcLOdwZRDsub4VOGmBRVHa?= =?us-ascii?Q?KOe6lJJbxm7fwhsCRIJy58u04G+I5hVbxQ0Uwh5HPDdhHZR4sjlMz2GXLPn3?= =?us-ascii?Q?2AETJyADNKSMy/MtT2JacvGc0NvLt+XfStWQCXgQnwEeObz7pAZeCk7oSByU?= =?us-ascii?Q?rVu24mU5djAAnu723Mtt1cKzPpto7V7u9MlmRuTFPsHTbFgSMQzpyn7MyTji?= =?us-ascii?Q?zOteBL08V0eQczcRUpUVNtxnS5iXaTIdGJ3O2ktSFmONTA7amvu+8uuCUAu+?= =?us-ascii?Q?HjD1X8itNfMVSxM4iPqRzoXLwH/bwik0hqHPbQR23dM+lDA0DpBOD9tAsCJr?= =?us-ascii?Q?K4vR/yj09YoZ33HZpCNRucu1d+scyk4Nudkr0GoexuOVWNGQ0C8xe9WEOmWR?= =?us-ascii?Q?YMHU1nqmiYSQNne3UhuemV9PuiR44bSOjRl3ZvJzKtXVSa/HjnxTppg8HQ93?= =?us-ascii?Q?YiDG9pNtH+5oJtScV3eTJ/jb4Ns7qDpr9Dr+KTmiTeyZSZFgymZRE01ulWW5?= =?us-ascii?Q?DuqFNwj5YSAiYXPqvMtBhDLmu0dimKPdCBR8SwAU6ol82vFHV6PzXrdDwFhY?= =?us-ascii?Q?VBriA+qsllx/YLX6CwS7PP/2xHA=3D?= X-OriginatorOrg: cyberus-technology.de X-MS-Exchange-CrossTenant-Network-Message-Id: 1ac75301-5af6-404e-1a39-08dde6321c9a X-MS-Exchange-CrossTenant-AuthSource: BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Aug 2025 12:55:06.1598 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f4e0f4e0-9d68-4bd6-a95b-0cba36dbac2e X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 1xRiCqRh6Q18XKdsQuqxwBsqGmDjjytLrJ6tEbDfEg8taCihIieOY/VSHvXzAvP5dkFNTe/O6hJOBgndGQeyvcKq3Eg99u6ATz5UkVDyQsjax1g8EShQcmeWptNDmYHd X-MS-Exchange-Transport-CrossTenantHeadersStamped: BEZP281MB3073 Message-ID-Hash: JXTG2J46UMYROSHWVKQZFVAX7SMNYSOK X-Message-ID-Hash: JXTG2J46UMYROSHWVKQZFVAX7SMNYSOK X-MailFrom: stefan.kober@cyberus-technology.de X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Stefan Kober X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: pass (identity @cyberus-technology.de) X-ZM-MESSAGEID: 1756387402661124100 Content-Type: text/plain; charset="utf-8" On-behalf-of: SAP stefan.kober@sap.com Signed-off-by: Stefan Kober --- src/ch/ch_driver.c | 8 +- src/ch/ch_hotplug.c | 175 ++++++++++++++++++++++++++++++++++++++++++++ src/ch/ch_hotplug.h | 6 ++ src/ch/ch_monitor.c | 8 +- 4 files changed, 190 insertions(+), 7 deletions(-) diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c index 0484201c88..c0e42171ae 100644 --- a/src/ch/ch_driver.c +++ b/src/ch/ch_driver.c @@ -2389,9 +2389,10 @@ chDomainAttachDevice(virDomainPtr dom, =20 static int chDomainDetachDeviceFlags(virDomainPtr dom, - const char */*xml*/, + const char *xml, unsigned int flags) { + virCHDriver *driver =3D dom->conn->privateData; virDomainObj *vm =3D NULL; int ret =3D -1; =20 @@ -2407,6 +2408,11 @@ chDomainDetachDeviceFlags(virDomainPtr dom, if (virDomainObjUpdateModificationImpact(vm, &flags) < 0) goto endjob; =20 + if (chDomainDetachDeviceLiveAndUpdateConfig(driver, vm, xml, flags) < = 0) + goto endjob; + + ret =3D 0; + endjob: virDomainObjEndJob(vm); =20 diff --git a/src/ch/ch_hotplug.c b/src/ch/ch_hotplug.c index 524355b93c..95fe1f0f6f 100644 --- a/src/ch/ch_hotplug.c +++ b/src/ch/ch_hotplug.c @@ -156,3 +156,178 @@ chDomainAttachDeviceLiveAndUpdateConfig(virDomainObj = *vm, =20 return 0; } + +static int +chFindDiskId(virDomainDef *def, const char *dst) +{ + size_t i; + + for (i =3D 0; i < def->ndisks; i++) { + if (STREQ(def->disks[i]->dst, dst)) + return i; + } + + return -1; +} + + +/** + * chDomainFindDisk + * + * Helper function to find a disk device definition of a domain. + * + * Searches through the disk devices of a domain by comparing to 'match' a= nd + * returns any match via the 'detach' out parameter. + */ +static int +chDomainFindDisk(virDomainObj *vm, + virDomainDiskDef *match, + virDomainDiskDef **detach) +{ + virDomainDiskDef *disk; + int idx; + + if ((idx =3D chFindDiskId(vm->def, match->dst)) < 0) { + virReportError(VIR_ERR_DEVICE_MISSING, + _("disk %1$s not found"), match->dst); + return -1; + } + *detach =3D disk =3D vm->def->disks[idx]; + + return 0; +} + +static int +chDomainDetachDeviceLive(virDomainObj *vm, + virDomainDeviceDef *match) +{ + virDomainDeviceDef detach =3D { .type =3D match->type }; + virDomainDeviceInfo *info =3D NULL; + virCHDomainObjPrivate *priv =3D vm->privateData; + int idx =3D 0; + + switch (match->type) { + case VIR_DOMAIN_DEVICE_DISK: + if (chDomainFindDisk(vm, match->data.disk, + &detach.data.disk) < 0) { + return -1; + } + break; + case VIR_DOMAIN_DEVICE_LEASE: + case VIR_DOMAIN_DEVICE_FS: + case VIR_DOMAIN_DEVICE_NET: + case VIR_DOMAIN_DEVICE_INPUT: + case VIR_DOMAIN_DEVICE_SOUND: + case VIR_DOMAIN_DEVICE_VIDEO: + case VIR_DOMAIN_DEVICE_HOSTDEV: + case VIR_DOMAIN_DEVICE_WATCHDOG: + case VIR_DOMAIN_DEVICE_CONTROLLER: + case VIR_DOMAIN_DEVICE_GRAPHICS: + case VIR_DOMAIN_DEVICE_HUB: + case VIR_DOMAIN_DEVICE_REDIRDEV: + case VIR_DOMAIN_DEVICE_SMARTCARD: + case VIR_DOMAIN_DEVICE_CHR: + case VIR_DOMAIN_DEVICE_MEMBALLOON: + case VIR_DOMAIN_DEVICE_NVRAM: + case VIR_DOMAIN_DEVICE_RNG: + case VIR_DOMAIN_DEVICE_SHMEM: + case VIR_DOMAIN_DEVICE_TPM: + case VIR_DOMAIN_DEVICE_PANIC: + case VIR_DOMAIN_DEVICE_MEMORY: + case VIR_DOMAIN_DEVICE_IOMMU: + case VIR_DOMAIN_DEVICE_VSOCK: + case VIR_DOMAIN_DEVICE_AUDIO: + case VIR_DOMAIN_DEVICE_CRYPTO: + case VIR_DOMAIN_DEVICE_PSTORE: + case VIR_DOMAIN_DEVICE_LAST: + case VIR_DOMAIN_DEVICE_NONE: + default: + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, + _("live detach of device '%1$s' is not supported"), + virDomainDeviceTypeToString(match->type)); + return -1; + } + + /* "detach" now points to the actual device we want to detach */ + + if (!(info =3D virDomainDeviceGetInfo(&detach))) { + /* + * This should never happen, since all of the device types in + * the switch cases that end with a "break" instead of a + * return have a virDeviceInfo in them. + */ + virReportError(VIR_ERR_INTERNAL_ERROR, + _("device of type '%1$s' has no device info"), + virDomainDeviceTypeToString(detach.type)); + return -1; + } + + /* Make generic validation checks common to all device types */ + + if (!info->alias) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Cannot detach %1$s device with no alias"), + virDomainDeviceTypeToString(detach.type)); + return -1; + } + + if (virCHMonitorRemoveDevice(priv->monitor, info->alias) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Invalid response from CH. Disk removal failed.")= ); + return -1; + } + + if (match->type =3D=3D VIR_DOMAIN_DEVICE_DISK) { + idx =3D chFindDiskId(vm->def, match->data.disk->dst); + if (idx >=3D 0) { + virDomainDiskRemove(vm->def, idx); + } + } + + return 0; +} + +int +chDomainDetachDeviceLiveAndUpdateConfig(virCHDriver *driver, + virDomainObj *vm, + const char *xml, + unsigned int flags) +{ + g_autoptr(virCHDriverConfig) cfg =3D NULL; + g_autoptr(virDomainDeviceDef) dev_config =3D NULL; + g_autoptr(virDomainDeviceDef) dev_live =3D NULL; + unsigned int parse_flags =3D VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE; + g_autoptr(virDomainDef) vmdef =3D NULL; + + virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + + cfg =3D virCHDriverGetConfig(driver); + + if ((flags & VIR_DOMAIN_AFFECT_CONFIG) && + !(flags & VIR_DOMAIN_AFFECT_LIVE)) + parse_flags |=3D VIR_DOMAIN_DEF_PARSE_INACTIVE; + + if (flags & VIR_DOMAIN_AFFECT_CONFIG) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("Persistent domain state changes are not supporte= d")); + return -1; + } + + if (flags & VIR_DOMAIN_AFFECT_LIVE) { + if (!(dev_live =3D virDomainDeviceDefParse(xml, vm->def, driver->x= mlopt, + NULL, parse_flags))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Could not parse domain definition")); + return -1; + } + + if (chDomainDetachDeviceLive(vm, dev_live) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Could detach device")); + return -1; + } + } + + return 0; +} diff --git a/src/ch/ch_hotplug.h b/src/ch/ch_hotplug.h index 04915ba5de..4a9b9b3b3e 100644 --- a/src/ch/ch_hotplug.h +++ b/src/ch/ch_hotplug.h @@ -25,3 +25,9 @@ chDomainAttachDeviceLiveAndUpdateConfig(virDomainObj *vm, virCHDriver *driver, const char *xml, unsigned int flags); + +int +chDomainDetachDeviceLiveAndUpdateConfig(virCHDriver *driver, + virDomainObj *vm, + const char *xml, + unsigned int flags); diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c index 2e21823f08..2da71e962b 100644 --- a/src/ch/ch_monitor.c +++ b/src/ch/ch_monitor.c @@ -604,13 +604,9 @@ int virCHMonitorRemoveDevice(virCHMonitor *mon, if (virCHMonitorBuildKeyValueStringJson(&payload, "id", device_id) != =3D 0) return -1; =20 - VIR_DEBUG("Remove device %s", device_id); + VIR_DEBUG("Remove device with id: %s", device_id); =20 - if (virCHMonitorPut(mon, URL_VM_REMOVE_DEVICE, payload, NULL) =3D=3D N= ULL) { - return -1; - } - - return 0; + return virCHMonitorPut(mon, URL_VM_REMOVE_DEVICE, payload, NULL, NULL); } =20 static int --=20 2.50.1