From nobody Mon Sep 8 16:54:32 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=1756989010; cv=pass; d=zohomail.com; s=zohoarc; b=am4RRUrYvn4sl3/V61QfXbxsS7WGRGjGHqc7gnREjp3/LIOQsm2+y5bvMdrAn4Dd18zuaqfWPoCobPlrx+R8qssxExcWzmmu6zuLxEltW7wmt7555RcUYIeZczP9+CTXyRSL0sOUk+gjv3j3l0zumQwpAD8TbaH9AQpjYnOMi1A= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756989010; 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=MnUg2SjSFhKk80hx6qRtZZPj3peP1A7luEU1rHEbxOw=; b=VB1Pil+Obai9FoeTJhAgFQqGPTvvSU6x6+oPVV0A/UY2z6Noauu/emChfhx4GiLsOblR92JKwsUJc9PgHDkJgIWv5Gd4bQ81xCv4fXEMtOxPVFa9VqkSNMx1b4nAGHgEusPkOjQHz++KLoLeEiyjnR34wLKL1B98iavgVisxVyc= 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 1756989010091371.0545253909919; Thu, 4 Sep 2025 05:30:10 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id D1C6743FDE; Thu, 4 Sep 2025 08:30:08 -0400 (EDT) Received: from [172.19.199.3] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id D6F6544462; Thu, 4 Sep 2025 08:25:07 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id A8E6D4426A; Thu, 4 Sep 2025 08:10:56 -0400 (EDT) Received: from FR6P281CU001.outbound.protection.outlook.com (mail-germanywestcentralazon11020110.outbound.protection.outlook.com [52.101.171.110]) (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 84FD844222 for ; Thu, 4 Sep 2025 08:10:51 -0400 (EDT) Received: from BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM (2603:10a6:b10:46::5) by FR5P281MB3926.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:105::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9094.17; Thu, 4 Sep 2025 12:10:50 +0000 Received: from BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM ([fe80::7272:f32d:eb8d:e401]) by BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM ([fe80::7272:f32d:eb8d:e401%3]) with mapi id 15.20.9094.017; Thu, 4 Sep 2025 12:10:50 +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=SlBmGuNO8cH+HeK4pNnODKCtR/OSWdb9FuNqdugHkQLf8FvkQNeaDwQpLFqlqcNNCj96/rj1WS2Wc/ltMVsXir5cG2Y2MXhBy6Wvl9kvegbYIuPoJla1jM0bh5JS4ygQ9QsN8yKZJAj9v3uDTPKWl6cMJ+NRlMUo8gTZmuNQ3xGBiMf7pBZWWRLRyqIeHFAA2klN5RjUC/ZOS3FffJJhWjn4jkcHylpl3KhDe+x+A0sPcOyeWOXkmolBc0Vk/hJ5Q9I1zvblLtR0OqaeElscaW0LLlOwD39tsgKYfzZw8d0fGAKz6AKhsLNnGgbHjdfvuHhfHK0+BmX4u7uM9vixsA== 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=MnUg2SjSFhKk80hx6qRtZZPj3peP1A7luEU1rHEbxOw=; b=IdPAdDc0NAPCfLOJjpInBl7BzN9UhjN/DJZQheOTYFm8GfyUdyHNOMhm3IRAdc0pMEUoLkHqLyAGDtHSDqiVB1piF+3NO3BloVbBu4LsX0A5pqTbpIz0pwRVVCAlZEA2GcHat3546Tea2li4rYB+0FPZ8jmpGd6bLiBVvMpE/4RHfcLIvXWeycmjQUOcWm2wuF0CqhFKjKY+9KF/Zodjr2HNX1XV7Ds6RReIN7/I5h4IDm8K8nOwDL2PJ+vm7TUuXH04MIdmEYPXzxgiiKhxl/NI56T56OCXWsvNMcnNNnCEIvA/TPOFwh6Zkum5ShR8gFpJykagrUCr1KBqBSBkIg== 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=MnUg2SjSFhKk80hx6qRtZZPj3peP1A7luEU1rHEbxOw=; b=UVvLUIRHBwnHj/I01rckdmPEN1xwDjOyDzlxtItt6QMQBq0pjtId8SZrBGRWNT/MbNNoZxH6HyFJvOScCehUx7BEUUjbNLud7XVNYU8nsT0gD+jiSlZGNvmuvSc8hSzbxzyC3yP4+pp0aHSnUSolaJL3LeS8ic6fv6lPcOBIuEcm4/0lz6Nps5XMhTDKTWkcyzLnYmORhn7Ly0ZkD6PRRTsqnwtiGSO304DWf7fsum5OejmVwgLLdRwj9NbCXPkbYeJt5Nc8VaaICfBowLg+bTNhue2Vm12MHCFOEOMgkOGLaO00MAprZIcE7rF0Dm2JgIHXGwk/JZivKf4nHMD9ZQ== 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 v3 12/13] ch: implement disk device detach in public API Date: Thu, 4 Sep 2025 14:10:34 +0200 Message-ID: <20250904121035.1349575-13-stefan.kober@cyberus-technology.de> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250904121035.1349575-1-stefan.kober@cyberus-technology.de> References: <20250904121035.1349575-1-stefan.kober@cyberus-technology.de> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: FR4P281CA0282.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:e6::7) To BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM (2603:10a6:b10:46::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BEZP281MB1973:EE_|FR5P281MB3926:EE_ X-MS-Office365-Filtering-Correlation-Id: e33d3944-983f-4f5c-4127-08ddebac1634 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|10070799003|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?Smnrr9XPoMRsNA2M4OS768CA8nKxBNOAvzll9NpuFrQ8Fzt/hoVMoYbOCMpb?= =?us-ascii?Q?trP8r4xWRI2jE/8TKmdD4QuXVS2jXVHJnFqf2Zzhig6WThARI+Kg2fVo/EQP?= =?us-ascii?Q?1y+lkA9MogWCNX+RhLG4g/WlvRwmYin9kBnuZ6WmSpAwf06nDWzBdEh7iSWd?= =?us-ascii?Q?gTvWkwdCBw4QxrGMAnMHjRhqkWNBD1i+JG+fVxi2xJQ2UxB04FkgboYEC3LI?= =?us-ascii?Q?hu/t8askyx07R2Tboh3KIhPmOfADLXMQmflpCy1tHkh4RfaIAUy6YlHHwCWa?= =?us-ascii?Q?8uIsVQmx05VBsC6pzD9olzxiKGuAp3AUAAwXYFGPXDrvLLfaEZ/aKSYtk3w/?= =?us-ascii?Q?iqdX5Na/eHo7M1Fn2wvky/yAUVOzP8yLDimzHr0TZ1DPEoMOiMjW7wknkAZO?= =?us-ascii?Q?IaI34J+BKJV9RRzY20xkCjl0alFIkJP0lweWKt+K/sKs2mVJ7QjcbV3y/XnC?= =?us-ascii?Q?TpbIC9QJALPXUdGZZrxXWGNmsF5Fry6YhDqg5vkpRc/iWG7XwAj45rPz9wsI?= =?us-ascii?Q?dl1wAgXhPnFTlt/Hej7804hCAWt5zr2zz5LHGjDRBiMlgsEHtLciKI0CRDtB?= =?us-ascii?Q?Xl1TR5YkRoQtFVOA+E88gxzqpVgNMlwSY7YgVqLPV3okE7o3hRoiyO059tgj?= =?us-ascii?Q?qqXrzYpG1t/GbdK6exsnCOcUROFY7bryBMBQFecEqq0dfygya6e9g8VpPmFG?= =?us-ascii?Q?iKWDJeVz7WvYRdTZ734i0zVxN606K/5rDOizmNlEL3UnlCT83TTcFWU+0smd?= =?us-ascii?Q?ft2fHu1T99FWoR7OKPFyhSNbie7pbQuLbzJWrkWFRy0OiPL+Cd7Bq1b3HW/A?= =?us-ascii?Q?tCpMxZnr5ZXKxFrjX1vw2zrbGQjUaYVbCJQT1mDbe/jfvN5g297CZZ6wNJep?= =?us-ascii?Q?2E/YtjaXxD9LPUKWj9ox1ePhGoNmA1X0mud4Wlyi3hv1Qm54IfH6miX6bbuT?= =?us-ascii?Q?K21CE0ZPFBYSCnlxFsfR+brpNoUuB9fQnz/2uxaKhtS/NJRvJahyxXrPpC1l?= =?us-ascii?Q?8Ee4UgnQkMdkEH93/J9bLrzliS2rkpek3ZNc+bctMSsHbEJLGLTBlPvqQo4C?= =?us-ascii?Q?QafcmdnIgGQgRn252blAk9vSO/Z/Z/wUs26BN45/ZA32rtd9FN7xB5z1AY5V?= =?us-ascii?Q?TbelN4ywNJrrOAx0G3imtUsWSlxYNBvhEENCdL1Kq5z9qAQTvph1s4QRFz5w?= =?us-ascii?Q?MEVH81fhNqLwlMI5Rf76le3RrWf8Wagoo6gvAYgKd9ygWUaIzS1rJ0U5zs4n?= =?us-ascii?Q?l+EAnTBuubCSuYw6JV/D4ZiQ04ro+Ff5nuS2dSPqaJqdkrv9zCjovPgH2w3s?= =?us-ascii?Q?TiUyQt6ovzgdU7hDUKTqLn4x3bP04FpX9AIxHNFn7CchCvSc82oDZFEjTovQ?= =?us-ascii?Q?sJBR6BEnWFOS3f93+iU6jm7MEHyMrp32/RqwQ5RXGanWqtLIpLzjiMMbkYnx?= =?us-ascii?Q?WURwhQIfdJY=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)(1800799024)(366016)(10070799003)(376014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?soLfJZT8wZYgaMhyMnPneO35WfLjND95/32NnCFqwZcXTTG6U4rb/OQgX0Z6?= =?us-ascii?Q?85v1IVXdCH7K//BxOysgB+6FJF5TLZlt3JfgA5xWjYxTdJYzeCCBIZYecM0G?= =?us-ascii?Q?ZQWvYDVW9kYRalJ8mfI4ZCWMzn8jX8o4Ghs/rM9e2g8AykyCTeu7Ni3xFbHD?= =?us-ascii?Q?7aJlJLECzLzp0wkSZFq6KJUCTPY0YazvlhriKWq8QYw/XfxR3L1C4CPIgn3Q?= =?us-ascii?Q?MzTHN/Wpbjm+KNtO5Jy2774nP/RHRb4TTQmlcHF5YlQr5C1mmSdkOQrvNcLF?= =?us-ascii?Q?k+thelEtMHLYijOoxpKIUaTiAW8T4JiiIWzxH3BEf9ZB+Nq9Pd1P1g4C9y6f?= =?us-ascii?Q?45ro5z0Qch0owEJRtzIvMy0UfQ9U5kj9dBfzDf2g4N9vcoFagDrRjDgjnZNy?= =?us-ascii?Q?oj1XzyutSmr7EeEtcwgt/viY5sql1wc6wq4G8QEECFxVsnXb+rYrKLeZqveB?= =?us-ascii?Q?s2Y3+rQ9fUGPhLWTrcWoayB8Bjsb8CBYP1gVAJiBCYdc9K9e+hFZdG6eCWbM?= =?us-ascii?Q?/HZWCcnDwNSomnoWW+0DLLOBbL0gnaietw80o2CfbnEetMZsYU1NNNriajwq?= =?us-ascii?Q?ae4WEvl26cm254CtrZIcPycFfhGDvt7nJWM7DHy/Lieetu6sgitR7773QjlO?= =?us-ascii?Q?psa1iEAECpCbOk7fQHUqfE2tFQKlEPUAvntVmmjrS9vaPyvJx/89U9ziQSHi?= =?us-ascii?Q?kfivOiY5DddYSsJgu+6T3hfCqrwyhRaBhN6BUhDdb7NJI/eEs145f697Pcqv?= =?us-ascii?Q?ts42crU3LZaliHhA3+NiSdlQOCad/laNYkXD1VJpEJYbawHiId/tZ7Q8aGEm?= =?us-ascii?Q?JpjKo9kcVtPeVdU4figSE8UBVkTBVJLwKSojnIz4whTnm5rmLSIzW4OE6ehf?= =?us-ascii?Q?B3NlS6lQJgsAa1Ob+IaoExpGnM4YzXYoUMB4oabMvryPtKDHSs6dABPTVrB7?= =?us-ascii?Q?heA3WAM/HGk61sHbw5ZxWGQeg9esREph8GiQ6QUGsGXWFaTHWkUqe2BbGU01?= =?us-ascii?Q?t6NIc5BKKBJzxl68VSNQBsbnn3/PvQ9GOfmEi74qpCYqVit5pCitAv1vZ2ss?= =?us-ascii?Q?U2k9MpXCOgUOa6CmyAoZ1MNo9LYPyrNAYGYN6ogzoxomar9WB7SviwO2gYAg?= =?us-ascii?Q?iXiV9orNIacCt+O/F16soy0kVDNSOeNKoJYhTrdbKOY0pGwT8Bsg3Fhvr8aB?= =?us-ascii?Q?LjWTDneMeBXnZmUtWrOUoX9P3UT5n2gLzHV4JA3YinXFZH2EnZnH1wUabkn5?= =?us-ascii?Q?Yy5fhsowLTWAWyMax4IBTfFw64qDh+5TGsJlcdfG1rWszOXZUP41j3DORiER?= =?us-ascii?Q?UnN7qX1xVtrdAH1iWkOP+VWVMB4szsi90tPqYgz4WUVuHV7aoc7xu2cT3jLL?= =?us-ascii?Q?Im99AsM8fhREtPHPQ6y/2iyE3GFexutdrILCDlCyrQeDY1U8IRhtnMz1pyzD?= =?us-ascii?Q?vyz7JCGgtcqrq/bRXfH7XFRge045Sn/9Oak0QH93ko5CIG0LB4t5OGpL85/I?= =?us-ascii?Q?gDr4Gtwf77cgc1GF0f+aaT15wxY4J8jG3j3OWMhLdVgEgsAfGn0EvUbhhNt3?= =?us-ascii?Q?r4xIkAfTHnVS2O9j+0wv8KOf53Qj12d8zMHafyBmT496RhNHV2TuuOTEP82z?= =?us-ascii?Q?mA108wYiXpkElbcuZrOJDQAbZVCiYTOps1gjUzb/QOjk?= X-OriginatorOrg: cyberus-technology.de X-MS-Exchange-CrossTenant-Network-Message-Id: e33d3944-983f-4f5c-4127-08ddebac1634 X-MS-Exchange-CrossTenant-AuthSource: BEZP281MB1973.DEUP281.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Sep 2025 12:10:49.7419 (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: Ms+QeL4y01P9k6oj921IEBcmA5fsbgdZAP20icQaoKM2XTO85DCMTJ3hPy1XMofbEZT3DdFVu78pnbbVMbMJkFC5JTkmG26Nlt7hslRYESomDpxVS5pSTV3rMlWYiWqp X-MS-Exchange-Transport-CrossTenantHeadersStamped: FR5P281MB3926 Message-ID-Hash: 327NR2DDSNQAGJFKVV5ZYEMVCTC2FV2W X-Message-ID-Hash: 327NR2DDSNQAGJFKVV5ZYEMVCTC2FV2W 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: 1756989011076116600 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 | 42 +++++++++++ src/ch/ch_hotplug.c | 175 ++++++++++++++++++++++++++++++++++++++++++++ src/ch/ch_hotplug.h | 6 ++ 3 files changed, 223 insertions(+) diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c index 4f4783efb1..760fccba82 100644 --- a/src/ch/ch_driver.c +++ b/src/ch/ch_driver.c @@ -2387,6 +2387,46 @@ chDomainAttachDevice(virDomainPtr dom, return chDomainAttachDeviceFlags(dom, xml, VIR_DOMAIN_AFFECT_LIVE); } =20 +static int +chDomainDetachDeviceFlags(virDomainPtr dom, + const char *xml, + unsigned int flags) +{ + virCHDriver *driver =3D dom->conn->privateData; + virDomainObj *vm =3D NULL; + int ret =3D -1; + + if (!(vm =3D virCHDomainObjFromDomain(dom))) + goto cleanup; + + if (virDomainDetachDeviceFlagsEnsureACL(dom->conn, vm->def, flags) < 0) + goto cleanup; + + if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0) + goto cleanup; + + if (virDomainObjUpdateModificationImpact(vm, &flags) < 0) + goto endjob; + + if (chDomainDetachDeviceLiveAndUpdateConfig(driver, vm, xml, flags) < = 0) + goto endjob; + + ret =3D 0; + + endjob: + virDomainObjEndJob(vm); + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} + +static int chDomainDetachDevice(virDomainPtr dom, const char *xml) +{ + return chDomainDetachDeviceFlags(dom, xml, + VIR_DOMAIN_AFFECT_LIVE); +} + /* Function Tables */ static virHypervisorDriver chHypervisorDriver =3D { .name =3D "CH", @@ -2450,6 +2490,8 @@ static virHypervisorDriver chHypervisorDriver =3D { .domainInterfaceAddresses =3D chDomainInterfaceAddresses, /* 11.0.0 */ .domainAttachDevice =3D chDomainAttachDevice, /* 11.8.0 */ .domainAttachDeviceFlags =3D chDomainAttachDeviceFlags, /* 11.8.0 */ + .domainDetachDevice =3D chDomainDetachDevice, /* 11.8.0 */ + .domainDetachDeviceFlags =3D chDomainDetachDeviceFlags, /* 11.8.0 */ }; =20 static virConnectDriver chConnectDriver =3D { 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); --=20 2.50.1