From nobody Mon Feb 2 07:32:15 2026 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; 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=nutanix.com); dmarc=pass(p=none dis=none) header.from=nutanix.com ARC-Seal: i=2; a=rsa-sha256; t=1768388264; cv=pass; d=zohomail.com; s=zohoarc; b=eX3Z5PDbgzoXKRTRe6GZQmeUkw0SPGH4IKNYD8rkXJaz0QOEPN0KRpKcPBH1jv9gVwCcVpyBmxeY74yD7xBC6UiCZ9r0QDwfJsqV7t+vO1fadkTIjnu+bvFb+Nqc2UTXGo2EmJVGwIOiniqa3XYUlugPjB8ntXznyT0WFiLf0PY= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768388264; 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=oUdRNwzFBWCeCvo0fQSzxiDM8Zs45mwBOWAoswWzgHI=; b=KW+vPmWbLkJxJCHLFaGy8d1Lgb7pPBxxfobMHPwnI2nN1HZC7e0eaQQF7sL+rm9z3BpXl31MMR+8Cw5eO5hC/YCh44AfBkEhVt3bBQU1Xm6B77sJN/nOylBa/IvA19pNNd6NR6If8gw4OFUZH5GvGV+FhmID0sQci84E/yR9mLk= 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=nutanix.com); 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 1768388264600722.0898173646617; Wed, 14 Jan 2026 02:57:44 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id 9921B418E1; Wed, 14 Jan 2026 05:57:43 -0500 (EST) Received: from [172.19.199.83] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id E242641B6C; Wed, 14 Jan 2026 05:54:56 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id 43116419E8; Wed, 14 Jan 2026 05:54:48 -0500 (EST) Received: from mx0b-002c1b01.pphosted.com (mx0b-002c1b01.pphosted.com [148.163.155.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 71DDA41A52 for ; Wed, 14 Jan 2026 05:54:23 -0500 (EST) Received: from pps.filterd (m0127844.ppops.net [127.0.0.1]) by mx0b-002c1b01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 60E7pPX62984126 for ; Wed, 14 Jan 2026 02:42:25 -0800 Received: from bl0pr03cu003.outbound.protection.outlook.com (mail-eastusazon11022114.outbound.protection.outlook.com [52.101.53.114]) by mx0b-002c1b01.pphosted.com (PPS) with ESMTPS id 4bnq4qu7y3-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT) for ; Wed, 14 Jan 2026 02:42:25 -0800 (PST) Received: from MW6PR02MB9817.namprd02.prod.outlook.com (2603:10b6:303:23b::15) by SA3PR02MB10162.namprd02.prod.outlook.com (2603:10b6:806:396::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.5; Wed, 14 Jan 2026 10:42:23 +0000 Received: from MW6PR02MB9817.namprd02.prod.outlook.com ([fe80::86e5:3449:a3f7:ee4c]) by MW6PR02MB9817.namprd02.prod.outlook.com ([fe80::86e5:3449:a3f7:ee4c%5]) with mapi id 15.20.9499.005; Wed, 14 Jan 2026 10:42:23 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.7 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIMWL_WL_HIGH,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 X-Greylist: delayed 717 seconds by postgrey-1.37 at lists.libvirt.org; Wed, 14 Jan 2026 05:54:23 EST DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nutanix.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= proofpoint20171006; bh=oUdRNwzFBWCeCvo0fQSzxiDM8Zs45mwBOWAoswWzg HI=; b=iR5yaTHjaUgBZ8Z7Y4naeqyXVTnqnDnlfgvjUW+RYbGAlsXpMFXHLoecs J1PFjYzrrOHr2007ssVePo2bLgZyjoEmx7SI/APg1Qc0UO2Pkqu5IT6UPMglTFnG aTmhb+nGqQTiLNit53tDn+lmjgmiRNJkkzuM1EAZkK02KeiAsvOuZbXzLGrr1zf7 f1PMH+WFfqCf2sYBJTBcA4I4te5VhODdmsExsI0y9HtXLvasRQCa9Tbd+/sSPaL5 zI4GiV340VFn6YvONlZoPPJ9zWr0Sl3rZsXIwUjk/ydCzjJY+iZGZQR8kNSirTgf 02bh8MJcOorvXzBGuClyWV2CxsMqw== ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vDRTdZzs56NoWTgld66+HN+GEN/KaZx1XDgoChsE+BMGgGbfjExZ/nBHG7OR1tix9EWu1okJrW9AtvKG8iFeDED2Ijfd4/iq5s+wenvgXpZYrifgPgBeH+SZT1RLfNOvdO/pVIMGxZhyOq9KmXl8zpAiAEcoGLngkbUTbdFUTJYbh7grsN77+ql7aj/Ip50P210n5vs67XewV66FdRcKlnnN0TF6X9aZCzKZsRjTRG+TzvZmffE5ZL5jKRAeV6MF0KwhN9vxtl6j2q8ZmWs5dmJ8lw0+Pf2ehIJy7Hy9B0aaupUTo1hHte7rdhRY3sGupj/Miv8elT9EIUuozca7XA== 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=oUdRNwzFBWCeCvo0fQSzxiDM8Zs45mwBOWAoswWzgHI=; b=KZtCdd3GMAknKN8MCElZhOHTL6EaC9KBlHQubLjYEpTIuBwBUU3LwssM09D5nGiKhjwyzwYUxJ0K0nW8ZPZwyhNuVGc79BWqfeB6PCe1NJr1XkwwyNR5ArgsndDNyBl+hDIUymjNrZKfwezdRHvWS7iOYM6hLIYDkJMSCeh/auBl/xbJb9fMLAydgGDc9grJl+I8W631tCkUc4WPBxn8GMjBa0897zR6fZx/pzIyO5tYa5wtGq8cmbw6je/9eFEHX73FhfE11V5iUoJtHmSGTxVWv+FI+JidW0SXNoT0SdTjjNDar+58SU2QKs7RTHCqi4P4LHpviVjK1HkPiZERKQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nutanix.com; dmarc=pass action=none header.from=nutanix.com; dkim=pass header.d=nutanix.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nutanix.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=oUdRNwzFBWCeCvo0fQSzxiDM8Zs45mwBOWAoswWzgHI=; b=pyNTTCTXuVQpwDx3yqhFwhwNHc68ZHVNMEzdKts5grczUkLEpBZdJbULfRndntqBGvFx4kzLBeojKQ9IR3NmDrXVkwc45+u/YqqyaBkmvEktFK53fOsZ7jBzdFi4Oyy7wX5cM4dP1910yf++K+hdm1vBcPO71/1U7ucLsDrpvLgl6oAq8h8RV6T9SVE03HAOji5O9R03dkzfuoew+25beWVN2o6lkUEdNnEutXiqUjruj6m6332jtZk9m4xrlflIxVDR13V/Vjpj+pD7D4vqNPmnCa1/69r0UeJYSOZxkdWsw/IPD9LYICzHFsj3qcB2Sm8OAYdgdAp3GOWyXp13qw== From: Tejus GK To: devel@lists.libvirt.org Subject: [PATCH v1 2/4] lib: introduce virDomainFDStore API Date: Wed, 14 Jan 2026 10:42:02 +0000 Message-ID: <20260114104204.4071940-3-tejus.gk@nutanix.com> X-Mailer: git-send-email 2.43.7 In-Reply-To: <20260114104204.4071940-1-tejus.gk@nutanix.com> References: <20260114104204.4071940-1-tejus.gk@nutanix.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH7P220CA0047.NAMP220.PROD.OUTLOOK.COM (2603:10b6:510:32b::6) To MW6PR02MB9817.namprd02.prod.outlook.com (2603:10b6:303:23b::15) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MW6PR02MB9817:EE_|SA3PR02MB10162:EE_ X-MS-Office365-Filtering-Correlation-Id: 8d1186ad-2b5e-4321-0716-08de53599a19 x-proofpoint-crosstenant: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|52116014|1800799024|366016|38350700014|7142099003; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?ihHMt9ijM5dpTMfAyOEN1qjSUKkTVTEZOTnAL+uSqEMFW7gRgM5n1E4U60Rt?= =?us-ascii?Q?jN0Idz4sLuLxT7WaAabmsT07BpC2NZg3jBRbxDqz69/7NPJLuZFGbqWDXA+2?= =?us-ascii?Q?Ev80qpP24GfoT/1LLjdolZWKF0x43Fm/f1o8I3jT0a+3O+VSiAxoRNGf8UJ6?= =?us-ascii?Q?xA/76AQEZkOQZQqPqRLcZBraM9smpWJOBEIbNKOkI1ew2zYP5l2TFkDKNVsG?= =?us-ascii?Q?1m2e0p9aYCbEtIbZAOUVmATXH3yApfJNrqnClf7CO4ZxD9g406QCV8hU8fnY?= =?us-ascii?Q?Ng0xf2W40JkLmKKuIVndgAsdHckvQv3QG9Tr/UyXZIM+PViQAIGXcx+4f1FL?= =?us-ascii?Q?WG/7d5Wr4qkwiwn+/0wWj81ItWC5xBWGLolFzmozinEbrMVFsSBLcuGAjG6b?= =?us-ascii?Q?TRu6dB+nqRQooxMmotC3UvGKF3XHzgCkF+nM3PdF/n2mTTIbaivaNgIsr4vO?= =?us-ascii?Q?k93dS1S6vBoV69RUoTD/X9y3Dq450RXXCMc2itSPZXhLXlGzDuFlUMnptZVK?= =?us-ascii?Q?bhlSib9EU41KDkF4C6+NEIITR4Sdvb+OoIR1vgRpSSLOI7ZSRGUmwj4Pk0pw?= =?us-ascii?Q?mrrxWGQv0ScEUuzUZ293Z1I2PNE1l/8bcQh8AO06Wpz5yNk0iCBLVbFDVSRV?= =?us-ascii?Q?P8O3Su1bYgIjzQGZAX2d/fAHT6hGsC7zQMmLfJg9JtdkP0J9us414ASSxJUr?= =?us-ascii?Q?jxo1mOFt4Gq8WrJ80EwYeA9yGInkQ6s0XbIG6waLUo8GmNwHPwtvQCFqTWvn?= =?us-ascii?Q?iro4+9XemcP8btyRW4In/7ITe/MRv9PuZeIeU77BeipLmh4oDRgmpn423iBr?= =?us-ascii?Q?m6WtaUEBHA12oTzSWYYle0Fi6ITqTfa9zhWbQpASFz/IYv2QvUNqWEdFpfCK?= =?us-ascii?Q?92eg4c/9bHEWtt+bnULrNqDM7NPwkGprIerxMhCo1KWUlIuMYdZ45Say3Odw?= =?us-ascii?Q?HDrvX34OVSxmzlSqyDxUgvtqPRDv0df+r5OZIvdLkIi8ByvFzZ1l+Kfv+lK7?= =?us-ascii?Q?ODKn7qCR+jCtMGOPORvMALIRMfaGtMqV2NRFSgAvJ3FaVIkpYkeoMS/WbdR9?= =?us-ascii?Q?scDhksVRsjvRC87PhbWIHNPHcUAtOEcVa9z5Zfm1sQfXXrZHpgy9+KcEYEeo?= =?us-ascii?Q?MC8DNd7pTS3OPnOQUahPiNoYoUyRLIcG4V31aCrcIw6XXibxlK1IS1C1gbya?= =?us-ascii?Q?jc5YCai1dm9NN8JJOo2zLuvYkNYJn2/B97klDhqlekLKgt8iVO4nqzaMgOvV?= =?us-ascii?Q?pCaaRViu82cPFI4YEfQEvDIBWJEQaYOJ+hIxPwL6CUAi3/NDJUdLhAV9P95E?= =?us-ascii?Q?Gtg7Hz27DuTxtnLAYQYDLUamM5Ao+ey3xPOTDLvZtqhV3F2PjGpnWyvUklD3?= =?us-ascii?Q?km68F3FtACkze2cOEBZ2TsMlXloq/yXG91a1sUftjQdNHoi5jvRE1TwenghM?= =?us-ascii?Q?5jkF6iZ9V+RLdMglgIxUb2GwVGMVJn2oaKFE9/1knto8NBukl6xXLORm8ExH?= =?us-ascii?Q?FX7uUdUkQH+FgwhL3geayeczyxdSvU3/bgfwyJMBy1itzkH9bl+50XshoVyT?= =?us-ascii?Q?jMaIGcq6KIASn6LuLHQbQUOGsQHktkHx3lkyzM+vn7yIpXLCp0cK0jRksuZc?= =?us-ascii?Q?6ZgvpvDsuZzYrs2KmbqGwi4=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MW6PR02MB9817.namprd02.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(52116014)(1800799024)(366016)(38350700014)(7142099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?RxLVVXTrcJmSPQbqjnO1U+O+VQby/ckm1C/muGQkamm0gzwgdfJQuWyb93JN?= =?us-ascii?Q?bC3HCPFhObeyMieA44BUY4CrHJmaXv/sbv61Fe8kQO59hS/yiy34Rca7whVb?= =?us-ascii?Q?aPAgFFhrJ8S2uNVwwR8i8jxxTbw6OglD4Y6QrN2bXuOPRirIEjQ22c31UF3z?= =?us-ascii?Q?f2NEkcCXDbOHSVutKqhZI8dC/UW9BMQioMPZWVw/t8fiQkBY3jUDMx7Oig8u?= =?us-ascii?Q?RKeJcr2hLiNTdsFR8AlYl136tcf4VjI+ebtcqF1rLzXKIWUKD5VCtAJrNRUv?= =?us-ascii?Q?GWv/YXpa13LTY88czodb9jH2z6LoFheXwU0L5zuxLD9ve3bcvFPsZ8AaluYs?= =?us-ascii?Q?77FOjTq4DKJ5SinufbS0w0ES0bB39dHNYsUOif8aT9T9jVB0hpckSZ1rW1zu?= =?us-ascii?Q?MgP3j+6G/GN3rFdJYMtiV8nLnpIELMz71avmUwSPF2wjZnxqSCpLVYjuGBKV?= =?us-ascii?Q?z8rOowTkJf051fjeAi7WFBuzJuqxHqLNbZzKSI8Qu/zNNepAc7f2x6kfOF6v?= =?us-ascii?Q?0D2NgpJK4nlkSBJn80StAg9Dy3hV8PziXHOfiVIBlfzlSWnCLEoo69H9pq2n?= =?us-ascii?Q?GuNUPOX0UBGhSmX+LyuNMAU85BsM2C4j9b1E7iyx1wI5lgdBDuwXLSZcXYu0?= =?us-ascii?Q?+SKUoE+5DZV9TomVkFlyjZ7Yc/q/8k5E76g6SrVhAGouRpCWq5PvXYRxjCIh?= =?us-ascii?Q?OcxLzt+V/jJRhh5s82lMobzqked+Z63Qt0SYbOK4fCO/rBNfRRy/E6Qi42XV?= =?us-ascii?Q?XzUUMoeMV+50h8nZ8WQikT6ON7e/czOUkaWoCXJyXUK1xgeqnjQYd6UctFHn?= =?us-ascii?Q?6wiYl3lIcGiK3VqoT6bzEIKoeuu5NHfLi//4QLAiQVhpsvzIxmTgWdCoFiSq?= =?us-ascii?Q?mxZlXmcTD+5GYCgsoT/HUsKbxZdkCCaeutXhXqXQqkWfnXdU0kOgbVtzGpgg?= =?us-ascii?Q?nsPBUP+Gywjpu3T3UA0X4l3HE+7xF2qAtYVnVBBG6KdmbmIjKLtCLa0U3F58?= =?us-ascii?Q?9/6C/Fbxm3fkYzf7mRqfkXscNlb7eJHpo8rujfa4yH//cF97bnsv8jDN9NhQ?= =?us-ascii?Q?YngjkwjFg3z3BTp4RvSaYlBJwdv+ON0EjXelty5ouRxI1i2nQLYskvmHAVID?= =?us-ascii?Q?bnLYryYLJ83SPhP/LSWnigjl718WXmog95xe4/KBjqQo1vWsZ9uBC6vaFOPx?= =?us-ascii?Q?Ir6M+JCUIhhH9pIE7+H52bTU4UggbZUXgMpkigrZudKEFitlHwKKCyuPFiFn?= =?us-ascii?Q?Q0ELRHP+Yzns+AoiatXbFJB0R35PszHZ4KH2gN4pc4khYXyc9u4NLthUjVCi?= =?us-ascii?Q?epid1Ut5hWsc5MAUyeNlB69tyrSEnltEayaVMtfTrU0ebqRNbmU5WlePUXse?= =?us-ascii?Q?kehk6fqlezlFpkhQta7WdTIyqhpBQHcy6xPXrvVkOeZIo1OERuCa8OENIIK8?= =?us-ascii?Q?ZFGy/uB2joSUveOkADY4FvnJoyd5o1HvvXnTjbqCFhHv97GEE4I2nbBGsZfb?= =?us-ascii?Q?bJK9m+VgUS7tRPK+CqLsGZG9996NsR//WviZbOroGs3YijdaUqqSMfjAA7nV?= =?us-ascii?Q?nfjbZ4cE9y8Y3xrRy5cTE7L/GnEjzoJXnVByRHvt0IwSr5Iqxl8YqVjI6KE8?= =?us-ascii?Q?9p8ip6l1zSrzMW6LqghnOsnOA4WCD042qPfMZ74V9febezNPraDbdGUeMTNe?= =?us-ascii?Q?BbVbJh44KzntuZDyn/JMUeslssTYbYlgikHSad8rxPjSAcpqDDe9bc7HclL3?= =?us-ascii?Q?5Hz+FYEnWQ=3D=3D?= X-OriginatorOrg: nutanix.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8d1186ad-2b5e-4321-0716-08de53599a19 X-MS-Exchange-CrossTenant-AuthSource: MW6PR02MB9817.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Jan 2026 10:42:23.7308 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bb047546-786f-4de1-bd75-24e5b6f79043 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: HntHLRzDgf0IwR8ZIh/5P9/Eg8skKp2ehbwZA6LCJD90ysjQYlwKMOOCsj/31GpcbJxGJTNGDYN0fVZRgMDiFA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA3PR02MB10162 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTE0MDA4NyBTYWx0ZWRfX86vYNLMZ6z6e Yn5NJiKFuU3kRIzStD+iL+YmNy39iIJcWop25ebu9IfeNzVVhoOb0/JHHBJgRdpTDqyanQVMzTv Mdg+3fZGZJ624Xg7i4VMYj1zZyGq8vPlakJVbYsPWH0ybRHvuuOek8BzmuDju5tWiLTvuYfuBPE wnuJoSQ/LZG4FKS4ffv+5GT3mO4ulJ6uGnGoEI/4Liz5kXHj6nNZ9TchePDENOEWbfqOmHs6bsH niFKqH4fquw53uaeIR9vCJuUkfIYmRvgoXaBUaHRSbl+mGt6AXgXzJUlgNbRw60rfEJVytbpDN+ CDjHo5RAwwHPavIlRzWLmKVwDZaWbNQkeqeRcaqthlC+yb1g1BilJ5HK3PyvS8lnKhwoK3S+7Ah zaWNg+Kqpt10uFoggfSLQFM39LvJVnBlrrAv4pOTJyOM+aTkurmBW3Bai4fGKiRyvKJfyHsYIKy JlE0Wckl02DEJuXum0w== X-Authority-Analysis: v=2.4 cv=G4wR0tk5 c=1 sm=1 tr=0 ts=69677311 cx=c_pps a=PPij9JC9dsFwf49xmEs+Gw==:117 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=vUbySO9Y5rIA:10 a=0kUYKlekyDsA:10 a=VkNPw1HP01LnGYTKEx00:22 a=64Cc0HZtAAAA:8 a=SuWQVDZpNuuskVtA7TQA:9 X-Proofpoint-GUID: XZl8r0U6SwIu2l_NZSKV5O1Wbuigy48P X-Proofpoint-ORIG-GUID: XZl8r0U6SwIu2l_NZSKV5O1Wbuigy48P X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2026-01-14_03,2026-01-09_02,2025-10-01_01 X-Proofpoint-Spam-Reason: safe Message-ID-Hash: CZEJYDTFUU5WDBU4HVJG7NQIUEYEVX6E X-Message-ID-Hash: CZEJYDTFUU5WDBU4HVJG7NQIUEYEVX6E X-MailFrom: tejus.gk@nutanix.com 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: Tejus GK 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 @nutanix.com) X-ZM-MESSAGEID: 1768388266019158500 Content-Type: text/plain; charset="utf-8" This API allows callers to pass and store file descriptors inside libvirt using a hash table, with a provided "name" serving as the key. The stored file descriptors can be queried and reused later, enabling use cases such as FD-based live migration. Signed-off-by: Tejus GK --- include/libvirt/libvirt-domain.h | 9 +++++ src/driver-hypervisor.h | 7 ++++ src/libvirt-domain.c | 62 +++++++++++++++++++++++++++++ src/libvirt_public.syms | 5 +++ src/qemu/qemu_conf.h | 4 ++ src/qemu/qemu_driver.c | 41 +++++++++++++++++++ src/remote/remote_daemon_dispatch.c | 36 +++++++++++++++++ src/remote/remote_driver.c | 22 ++++++++++ src/remote/remote_protocol.x | 12 +++++- 9 files changed, 197 insertions(+), 1 deletion(-) diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-dom= ain.h index b0acd0083b..be40a127d6 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -8751,5 +8751,14 @@ virDomainDelThrottleGroup(virDomainPtr dom, const char *group, unsigned int flags); =20 +/** +* virDomainFDStore: +* +* since: 12.0.0 +*/ +int virDomainFDStore(virConnectPtr conn, + const char *name, + unsigned int nfds, + int *fds); =20 #endif /* LIBVIRT_DOMAIN_H */ diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h index 6a43688b0c..0c2a9041fe 100644 --- a/src/driver-hypervisor.h +++ b/src/driver-hypervisor.h @@ -1473,6 +1473,12 @@ typedef int const char *groupname, unsigned int flags); =20 +typedef int +(*virDrvDomainFDStore)(virConnectPtr conn, + const char *name, + unsigned int nfds, + int *fds); + typedef struct _virHypervisorDriver virHypervisorDriver; =20 /** @@ -1750,4 +1756,5 @@ struct _virHypervisorDriver { virDrvDomainGraphicsReload domainGraphicsReload; virDrvDomainSetThrottleGroup domainSetThrottleGroup; virDrvDomainDelThrottleGroup domainDelThrottleGroup; + virDrvDomainFDStore domainFDStore; }; diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 74c70a0a43..7e194f7193 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -14269,3 +14269,65 @@ virDomainDelThrottleGroup(virDomainPtr dom, virDispatchError(dom->conn); return -1; } + + +/** + * virDomainFDStore: + * @conn: a connection object + * @name: name for the file descriptor group + * @nfds: number of fds in @fds + * @fds: file descriptors to store + * + * Store the FDs in @fds with @conn under @name. The FDs persist unitl + * explicitly consumed (e.g. during a live migration) or until libvirt + * shuts down/ restarts. + * + * Unlike virDomainFDAssociate, this does not require a domain to exist + * at the time of storing the FDs. + * + * Returns 0 on success, -1 on error. + * + * Since: 12.0.0 + */ + int + virDomainFDStore(virConnectPtr conn, + const char *name, + unsigned int nfds, + int *fds) + { + int rc; + + VIR_DEBUG("conn=3D%p, name=3D'%s', nfds=3D%u, fds=3D%p", + conn, name, nfds, fds); + + virResetLastError(); + + virCheckConnectReturn(conn, -1); + virCheckNonNullArgGoto(name, error); + virCheckNonZeroArgGoto(nfds, error); + virCheckNonNullArgGoto(fds, error); + + if ((rc =3D VIR_DRV_SUPPORTS_FEATURE(conn->driver, conn, + VIR_DRV_FEATURE_FD_PASSING)) < 0) + goto error; + + if (rc =3D=3D 0) { + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s", + _("fd passing is not supported by this connection"= )); + goto error; + } + + if (!conn->driver->domainFDStore) { + virReportUnsupportedError(); + goto error; + } + + if ((rc =3D conn->driver->domainFDStore(conn, name, nfds, fds)) < 0) + goto error; + + return rc; + + error: + virDispatchError(conn); + return -1; + } diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index c506acd2ed..3b3a4bb4e1 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -956,4 +956,9 @@ LIBVIRT_11.2.0 { virDomainDelThrottleGroup; } LIBVIRT_10.2.0; =20 +LIBVIRT_12.0.0 { + global: + virDomainFDStore; +} LIBVIRT_11.2.0; + # .... define new API here using predicted next version number .... diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index c284e108a1..cc655811f7 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -349,6 +349,10 @@ struct _virQEMUDriver { =20 /* Immutable pointer, self-locking APIs */ virFileCache *nbdkitCapsCache; + + /* Hash table mapping FD names (string) to qemuFDTuple objects */ + GHashTable *domainFDs; + }; =20 virQEMUDriverConfig *virQEMUDriverConfigNew(bool privileged, diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 3f154969b8..94a7b17090 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -35,6 +35,7 @@ #include "qemu_alias.h" #include "qemu_block.h" #include "qemu_conf.h" +#include "qemu_fd.h" #include "qemu_capabilities.h" #include "qemu_command.h" #include "qemu_hostdev.h" @@ -558,6 +559,11 @@ qemuStateInitialize(bool privileged, if (!(qemu_driver->domains =3D virDomainObjListNew())) goto error; =20 + qemu_driver->domainFDs =3D g_hash_table_new_full(g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) qemuFD= TupleFree); + /* Init domain events */ qemu_driver->domainEventState =3D virObjectEventStateNew(); if (!qemu_driver->domainEventState) @@ -1033,6 +1039,7 @@ qemuStateCleanup(void) virObjectUnref(qemu_driver->domains); virObjectUnref(qemu_driver->nbdkitCapsCache); virInhibitorFree(qemu_driver->inhibitor); + g_clear_pointer(&qemu_driver->domainFDs, g_hash_table_unref); =20 if (qemu_driver->lockFD !=3D -1) virPidFileRelease(qemu_driver->config->stateDir, "driver", qemu_dr= iver->lockFD); @@ -20259,6 +20266,39 @@ qemuDomainFDAssociate(virDomainPtr domain, return ret; } =20 +static int +qemuDomainFDStore(virConnectPtr conn, + const char *name, + unsigned int nfds, + int *fds) +{ + virQEMUDriver *driver =3D conn->privateData; + g_autoptr(qemuFDTuple) new =3D NULL; + size_t i; + + if (nfds =3D=3D 0) + return 0; + + new =3D qemuFDTupleNew(); + new->nfds =3D nfds; + new->fds =3D g_new0(int, new->nfds); + + for (i =3D 0; i < new->nfds; i++) { + if ((new->fds[i] =3D dup(fds[i])) < 0) { + virReportSystemError(errno, + _("failed to duplicate passed fd with ind= ex '%1$zu'"), + i); + return -1; + } + } + + VIR_WITH_MUTEX_LOCK_GUARD(&driver->lock) { + g_hash_table_insert(driver->domainFDs, g_strdup(name), g_steal_poi= nter(&new)); + } + + return 0; +} + static int qemuDomainGraphicsReload(virDomainPtr domain, unsigned int type, @@ -20804,6 +20844,7 @@ static virHypervisorDriver qemuHypervisorDriver =3D= { .domainSetAutostartOnce =3D qemuDomainSetAutostartOnce, /* 11.2.0 */ .domainSetThrottleGroup =3D qemuDomainSetThrottleGroup, /* 11.2.0 */ .domainDelThrottleGroup =3D qemuDomainDelThrottleGroup, /* 11.2.0 */ + .domainFDStore =3D qemuDomainFDStore, /* 12.0.0 */ }; =20 =20 diff --git a/src/remote/remote_daemon_dispatch.c b/src/remote/remote_daemon= _dispatch.c index 7e74ff063f..bbf39be748 100644 --- a/src/remote/remote_daemon_dispatch.c +++ b/src/remote/remote_daemon_dispatch.c @@ -7163,6 +7163,42 @@ remoteDispatchNetworkPortGetParameters(virNetServer = *server G_GNUC_UNUSED, return rv; } =20 +static int +remoteDispatchDomainFdStore(virNetServer *server G_GNUC_UNUSED, + virNetServerClient *client, + virNetMessage *msg G_GNUC_UNUSED, + struct virNetMessageError *rerr, + remote_domain_fd_store_args *args) +{ + int *fds =3D NULL; + unsigned int nfds =3D 0; + int rv =3D -1; + virConnectPtr conn =3D remoteGetHypervisorConn(client); + size_t i; + + if (!conn) + goto cleanup; + + fds =3D g_new0(int, msg->nfds); + for (i =3D 0; i < msg->nfds; i++) { + if ((fds[i] =3D virNetMessageDupFD(msg, i)) < 0) + goto cleanup; + nfds++; + } + + if (virDomainFDStore(conn, args->name, nfds, fds) < 0) + goto cleanup; + + rv =3D 0; + + cleanup: + for (i =3D 0; i < nfds; i++) + VIR_FORCE_CLOSE(fds[i]); + g_free(fds); + if (rv < 0) + virNetMessageSaveError(rerr); + return rv; +} =20 /*----- Helpers. -----*/ =20 diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index ec71eaed87..db255ac125 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -7488,6 +7488,27 @@ remoteDomainFDAssociate(virDomainPtr domain, return 0; } =20 +static int +remoteDomainFDStore(virConnectPtr conn, + const char *name, + unsigned int nfds, + int *fds) +{ + remote_domain_fd_store_args args =3D {0}; + struct private_data *priv =3D conn->privateData; + VIR_LOCK_GUARD lock =3D remoteDriverLock(priv); + + args.name =3D (char *)name; + + if (callFull(conn, priv, 0, fds, nfds, NULL, NULL, + REMOTE_PROC_DOMAIN_FD_STORE, + (xdrproc_t) xdr_remote_domain_fd_store_args, (char *) &ar= gs, + (xdrproc_t) xdr_void, (char *) NULL) =3D=3D -1) + return -1; + + return 0; +} + =20 /* get_nonnull_domain and get_nonnull_network turn an on-wire * (name, uuid) pair into virDomainPtr or virNetworkPtr object. @@ -7935,6 +7956,7 @@ static virHypervisorDriver hypervisor_driver =3D { .domainGraphicsReload =3D remoteDomainGraphicsReload, /* 10.2.0 */ .domainSetThrottleGroup =3D remoteDomainSetThrottleGroup, /* 11.2.0 */ .domainDelThrottleGroup =3D remoteDomainDelThrottleGroup, /* 11.2.0 */ + .domainFDStore =3D remoteDomainFDStore, /* 12.0.0 */ }; =20 static virNetworkDriver network_driver =3D { diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index 3c93203210..3ddfdd8bec 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -4008,6 +4008,10 @@ struct remote_domain_event_nic_mac_change_msg { remote_nonnull_string newMAC; }; =20 +struct remote_domain_fd_store_args { + remote_nonnull_string name; +}; + /*----- Protocol. -----*/ =20 /* Define the program number, protocol version and procedure numbers here.= */ @@ -7119,5 +7123,11 @@ enum remote_procedure { * @generate: both * @acl: none */ - REMOTE_PROC_DOMAIN_EVENT_NIC_MAC_CHANGE =3D 453 + REMOTE_PROC_DOMAIN_EVENT_NIC_MAC_CHANGE =3D 453, + + /** + * @generate: none + * @acl: none + */ + REMOTE_PROC_DOMAIN_FD_STORE =3D 454 }; --=20 2.43.7