From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id B89FFC7EE25 for ; Fri, 9 Jun 2023 11:22:23 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 30E118E0002; Fri, 9 Jun 2023 07:22:23 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2BD6E8E0001; Fri, 9 Jun 2023 07:22:23 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 04C698E0002; Fri, 9 Jun 2023 07:22:22 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id E195D8E0001 for ; Fri, 9 Jun 2023 07:22:22 -0400 (EDT) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id A3383401DE for ; Fri, 9 Jun 2023 11:22:22 +0000 (UTC) X-FDA: 80882970924.09.BB21D9C Received: from rcdn-iport-8.cisco.com (rcdn-iport-8.cisco.com [173.37.86.79]) by imf19.hostedemail.com (Postfix) with ESMTP id 27D571A0007 for ; Fri, 9 Jun 2023 11:22:16 +0000 (UTC) Authentication-Results: imf19.hostedemail.com; dkim=pass header.d=cisco.com header.s=iport header.b=l2yJCVDQ; dkim=pass header.d=cisco.com header.s=selector1 header.b=AHOMpZ2A; dmarc=pass (policy=quarantine) header.from=cisco.com; arc=pass ("microsoft.com:s=arcselector9901:i=1"); spf=pass (imf19.hostedemail.com: domain of amiculas@cisco.com designates 173.37.86.79 as permitted sender) smtp.mailfrom=amiculas@cisco.com ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1686309738; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=STZLrZPsWZzhK8cUE1fgvPj1wGe8pzgX69M+Zr/hX3U=; b=2nMwjmneWdmwQ5Yf4aeZ7b/J9LRYQnZoPlbv9IyOXj5mbzB2lV8dGGiFmLD5pmumdPz/6V iJbR495FLFXqCaVw0MBId+y+ShjKr2L4pi2PldShXANSXIPzBUcYl6kZFN8raa8/VBE9Zl mqaRiugizzmJvAL3/EempRIAnzBFobk= ARC-Authentication-Results: i=2; imf19.hostedemail.com; dkim=pass header.d=cisco.com header.s=iport header.b=l2yJCVDQ; dkim=pass header.d=cisco.com header.s=selector1 header.b=AHOMpZ2A; dmarc=pass (policy=quarantine) header.from=cisco.com; arc=pass ("microsoft.com:s=arcselector9901:i=1"); spf=pass (imf19.hostedemail.com: domain of amiculas@cisco.com designates 173.37.86.79 as permitted sender) smtp.mailfrom=amiculas@cisco.com ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1686309738; a=rsa-sha256; cv=pass; b=gvHYCk8PQ35D7pfazPYcTKk8V6A6rku+STeRTwFhKrpX+H8xz+l4t3ZTxx4TB3nel2dgLj UH4RL/OjmoQ4BCvz+EzwY17TFrAARD7eg+1wQ1ytdYgKY04a6wj9zeDhnZRRN614SsBTDS gDL0lazAtD+kBC2ANie1MHD9SXV/kjs= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=96988; q=dns/txt; s=iport; t=1686309737; x=1687519337; h=from:to:cc:subject:date:message-id:references: in-reply-to:mime-version; bh=y6lXkLcPKsGbmMYqYz7WpWVRYm6fl6RDa5Fu3WDwgV8=; b=l2yJCVDQxw0HYisIjKElEIBE2Cf98RZ8IsDEUAr/Z8Ed6cQZ5qWOMK+m NNA0VDBH3/VrhLRQkowaB7dCWX1bh3K+5qRIrxYQXQeuo6P2y7CWydy0e /bIRAe5gBD+AHSneMZqLjl7Vp7ihZz1ofXxxjajon4HBzTuYgCz8NOhVa w=; X-IPAS-Result: =?us-ascii?q?A0ADAABdCoNkmIsNJK1XAxoBAQEBAQEBAQEBAwEBAQESA?= =?us-ascii?q?QEBAQICAQEBAUAlgRYFAQEBAQsBgSsBMCoocwJZKhJHiB0DhE5fiFIDgROYU?= =?us-ascii?q?4QFgSUDVg8BAQENAQE5CwQBAYUGAoV0AiU0CQ4BAgICAQEBAQMCAwEBAQEBA?= =?us-ascii?q?QMBAQUBAQECAQcEFAEBAQEBAQEBHhkFDgIOJ4VoDYYEAQEBAQIBEggBJQEBL?= =?us-ascii?q?AYFAQQLAgEIEQQBAQEgAQ0yHQgCBAENBQgaggRYAYIVDRcjAwEQBqEnAYE/A?= =?us-ascii?q?olVGjV4gTSBAYIIAQEGBAWBTgMPL50XCYFCAYdZfGKIKCcbgUlEgRVDgjA4P?= =?us-ascii?q?oJiAQEBARiBSB8MEQmDTYIMIos5DQuCYoMKgkqJVIEpb4EegSJ/AgkCEWeBC?= =?us-ascii?q?ghcgXNAAg1UCwtjgR1SPYFGAgIRKRMUUnsdAwcEAoEFEC8HBDIJFgkGCRgYF?= =?us-ascii?q?ycGUwctJAkTFUIEg1kKgRBAFQ4RglwqAgc2Mgc2A0QdQAMLbT01Bg4fBQRqg?= =?us-ascii?q?VcwQIEMAiIknhosA4EEgRMBJUYHATAGIQkCEQcTAQciAgUdKwFDDgE6Bh0HE?= =?us-ascii?q?QsHCwkCCy8DkhImARofjgxHoj8KhAiLfJU6F4QBgVaSApF8mBYghF6EbFNGg?= =?us-ascii?q?leIa4weDROFCQIEAgQFAg4BAQaBYzqBW3AVO4IzAQEyCQkNMxkPjX4iCw4Jg?= =?us-ascii?q?QYBCIFlXoJkgW0IO4EBiWR1AgE4AgcLAQEDCYtGAQE?= IronPort-PHdr: A9a23:dUEBpBwVUQTnsZDXCzMRngc9DxPP8539OgoTr50/hK0LK+Ko/o/pO wrU4vA+xFPKXICO8/tfkKKWqKHvX2Uc/IyM+G4Pap1CVhIJyI0WkgUsDdTDCBjTJ//xZCt8F 8NHBxd+53/uCUFOA47lYkHK5Hi77DocABL6YANwJ+/oHofJp8+2zOu1vZbUZlYAiD+0e7gnN Byttk2RrpwPnIJ4I6Atyx3E6ndJYLFQwmVlZBqfyh39/cy3upVk9kxt IronPort-Data: A9a23:gIjcb6tW84LIWncITPMgI+oNGufnVFReMUV32f8akzHdYApBsoF/q tZmKTvUOKyOZzbxct0lbd6/p0oPsMfdyoIxTgY+pSAyFy0agMeUXt7xwmUckM+xwmwvaGo9s q3yv/GZdJhcokf0/0vrav67xZVF/fngqoDUUIYoAQgvA1c8IMsdoUg7wbVh3NY52YHR7z6l4 LseneWOYDdJ5BYsWo4kw/rrRMRH5amaVJsw5zTSVNgT1LPsvyB94KE3ecldG0DFrrx8RYZWc QpsIIaRpQs19z91Yj+sfy2SnkciGtY+NiDW4pZatjTLbhVq/kQPPqgH2PU0RUR3kweXrcBK7 eoOsMWUcx4TYordh7FIO/VYO3kW0axu8bvDJz20ttaeihOAeHr3yPIoB0YzVWEa0r8oWicVq 7pBc3ZUNUHra+GemNpXTsFlg8UoMc3iJ6sUu2prynfSCvNOrZXrHf+StIAHgmlYasZmRvz6Q 8wJch9VaxmQYQxhHVEINbcQg7L97pX4W2QI9A3KzUYt2EDXzQpswP3oNfLWZNWBRoNShEnwm 47d1239BhdfP9uFxH/btHmtneTI2yj8Xer+CYFU6NZGg32L9HIhGCYzahi++N2Dk3TifMNAf hl8FjUVkYA+80miT9/YVhK+oWKZshN0Zza2O7BqgO1q4veIizt1FlToXRYaMox76JNeqSgCk w7XwoK4XVSDpZXIERqgGqGoQSRe0MT/BUALfysNSwdtDzLL/9xr0kmnojqO7MeIYjDdEDX0x XWBqzIzwutVhs8Q3KL99lfC695NmnQrZlBsjuk0djv6hu+cWGJDT9DzgbQ8xa0fRLt1tnHb4 BA5dzG2tYji962lmi2XW/kqF7q0/fuDOzC0qQcxT8d7q2X1oC7+LNo4DNRCyKFBbJ1sldjBP R+7hO+tzMQ70IaCNPUuONvhV6zGM4C5TIS+PhwrUja+SsEhKFDYlM2fTUWRxGvq2FM9ir0yP IzzTCpfJShyNEiT9xLvH711+eZynkgWnDqPLbiilkTP+eTFPha9F+xaWGZim8hktstoVi2Po o4CXyZLoj0CONDDjt7/q95OdQlbdSlrXfgbaaV/L4a+H+avI0l4Y9f5yrI6cIsjlKNQ/tokN FnkMqOE4DITXUH6FDg= IronPort-HdrOrdr: A9a23:vlMAeKO6m+7748BcT2j155DYdb4zR+YMi2TDiHoRdfUFSKKlfp 6V88jzjSWE9wr5OEtLpTiBUJPwJk80hqQFn7X5XI3SEDUO3VHJEGgM1/qY/9SNIVyaygcZ79 YdT0EcMqy+MbEZt7eB3ODQKb9Jq7X3k9HLuQ6d9QYRcegAUdAH0+4NMHfiLqQAfng+OXNWLu v52iNAnVedUEVSSv7+KmgOXuDFqdGOvonhewQ6Cxku7xTLpS+06ZbheiLonys2Yndq+/MP4G LFmwv26uGIqPeg0CLR0GfV8tB/hMbh8N1eH8aB4/JlagkEyzzYJ7iJaYfy+Qzdk9vfrGrCV+ O85CvICv4DqU85uFvF5ycFlTOQiQrGoEWSuGNwyUGT0fARAghKRfaoQeliA0DkA41KhqAl7E pGsljpxKZ/HFfOmj/w6MPPUAwvnk2ooWA6mepWlHBHV5ACAYUh5rD30XklWavoJhiKoLwPAa 1rFoXR9fxWeVSVYzTQuXRu2sWlWjA2Eg2dSkYPt8SJ23wO9UoJgncw1YgahDMN5Zg9Q55L66 DNNblpjqhHSosTYbhmDOkMTMOrAijGQA7KMmiVPVP7fZt3cU7lutry+vE49euqcJsHwN87n4 nASkpRsSood0fnGaS1ret2G9D2MRKAtBjWu7VjDsJCy8/BrZLQQFi+dGw= X-Talos-CUID: =?us-ascii?q?9a23=3ADW0gA2omM3B+M1WOjNq/MvbmUewmUmXv0kXAGGq?= =?us-ascii?q?HSmMwbIeMcwO36bwxxg=3D=3D?= X-Talos-MUID: =?us-ascii?q?9a23=3A9zmNSgwwXM/hkEYO7ymt6bvzPg2aqP+kLGQLgY4?= =?us-ascii?q?jgc6JZS5hFRCbkwmSbJByfw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true Received: from alln-core-6.cisco.com ([173.36.13.139]) by rcdn-iport-8.cisco.com with ESMTP/TLS/DHE-RSA-SEED-SHA; 09 Jun 2023 11:22:15 +0000 Received: from alln-opgw-1.cisco.com (alln-opgw-1.cisco.com [173.37.147.229]) by alln-core-6.cisco.com (8.15.2/8.15.2) with ESMTPS id 359BMEKY024385 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 9 Jun 2023 11:22:14 GMT X-IronPort-AV: E=Sophos;i="6.00,229,1681171200"; d="scan'208,217";a="2804023" Received: from mail-mw2nam12lp2041.outbound.protection.outlook.com (HELO NAM12-MW2-obe.outbound.protection.outlook.com) ([104.47.66.41]) by alln-opgw-1.cisco.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Jun 2023 11:22:13 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mPsuOmth8FFvtMKYY7DUIQUAh+TfLCuaN4DU9p2e7VBrigEin00Dw+OcFUZSjkaZflAAVFaznqpJf/G87cnALiXm6T+sPYo7qn5WA9U6JUkCEVVZ2J61K1agsl7C+ehAc5jmWMfIFgcGVCQ37hPuAr3E5XHCRxIbInHXnocz6/wNzqXIBJpWMsSKrXoHJ9c1TYJ7wTal08FVMUB+/scteQf7GBfmJkBSWJs640efg5nDBCaodx/0fOXZ6hIRunI/vVEcEIfik+s71fMx2Ef4eHoaxNlVn2Sge4982VhQM39dVpoLQGL+sOXb/nWT7S++J1HUz9Md83XJUlFDc9x6kA== 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=STZLrZPsWZzhK8cUE1fgvPj1wGe8pzgX69M+Zr/hX3U=; b=nOZkqNgb1AYr/0xJlchUjCzBr2WYN7PsdUHv9Be+jgvRHn6cpSts6peUUyBIuxWwLYEuA4TPAYRMnvP6S7EclwWyiCpsWptE8noXBt+OryTBsEqNXaxWGMt13vT/YEYDo+A/V9ueDje7GuWPOOhXPqkfzer2zwUM2I0JmEF1ocIfrUWqbJeJl0uh1r4qYvJ5U0bWESseSMdYHBemarmhC5ma+BvqdFIIPPbCiDZxtrTLkSIP1FH3W7MVoa/r6q+Y6j7aIpS9+T+9cI9BAmeQ/BhGYd6r2unav0uweA3YjdVLacdGewD9IWZV25dkIigTeUg613p2L6gO7QbmsQ+jMw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=cisco.com; dmarc=pass action=none header.from=cisco.com; dkim=pass header.d=cisco.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cisco.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=STZLrZPsWZzhK8cUE1fgvPj1wGe8pzgX69M+Zr/hX3U=; b=AHOMpZ2AiCzwQ4HqorJB0TkfwTTIOvf5jN4OxdP+CsLmg09SHmQKo5J2f8du89XGRZX4A8Jx26egKG83bcXPG8xMl7PZbS3PpqdV5zNBfHoiUTfNwzElqQQnNeZVgQQ3VuGieBzvlx0iCpiraEk4+AEDwacCKViS+FiBmF7R8bM= Received: from CH0PR11MB5299.namprd11.prod.outlook.com (2603:10b6:610:be::21) by SA3PR11MB7653.namprd11.prod.outlook.com (2603:10b6:806:306::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6455.33; Fri, 9 Jun 2023 11:22:12 +0000 Received: from CH0PR11MB5299.namprd11.prod.outlook.com ([fe80::d6a3:51ad:f300:ebae]) by CH0PR11MB5299.namprd11.prod.outlook.com ([fe80::d6a3:51ad:f300:ebae%6]) with mapi id 15.20.6455.030; Fri, 9 Jun 2023 11:22:12 +0000 From: "Ariel Miculas (amiculas)" To: Christian Brauner , "linux-fsdevel@vger.kernel.org" CC: "rust-for-linux@vger.kernel.org" , "linux-mm@kvack.org" Subject: Re: [RFC PATCH 00/80] Rust PuzzleFS filesystem driver Thread-Topic: [RFC PATCH 00/80] Rust PuzzleFS filesystem driver Thread-Index: AQHZmpwNhDd19o/UvkKcR6DrdZh/0a+CR0eAgAAG6YY= Date: Fri, 9 Jun 2023 11:22:12 +0000 Message-ID: References: <20230609063118.24852-1-amiculas@cisco.com> <20230609-feldversuch-fixieren-fa141a2d9694@brauner> In-Reply-To: <20230609-feldversuch-fixieren-fa141a2d9694@brauner> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: x-ms-publictraffictype: Email x-ms-traffictypediagnostic: CH0PR11MB5299:EE_|SA3PR11MB7653:EE_ x-ms-office365-filtering-correlation-id: 4a374df6-40d2-454e-0731-08db68dbc562 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: JkNhttnUBNrR2xTAb1gjdbARbrojokdPV5H9/TpIKQmrqqDtoS34Fmbqz5o/43ZQGuIfTutgo75ia844JNDtREJLvQIsLMMjfv4yo9xi/LS4aOBCq6RvWkVN6477po+o7P7WLc1r28zQf49G78BhsE/dq0dGtdrALCBHzlG2Va1+kgIcgSBLJR+Clg+vZD6B8cCDNsJYLpgT1HPMX/h3+yh4MnC5JWe/O6ymFQkEbr6lpz6PTyQG+fnxAlz9q9iYWX+ZUu7NI8A6V8JkfUss9hKR+e56jdOrhB/ljTSxv3K7t96Ua7VpvaMLvM1asGwvrh57aCWn5JAmCSN7o7IIvH8322jc62Y6qMAhYlb/zViQHHCDWmcqGSMVPgcmQRJDhQQn2sVv6Yx1rEpVTxKN8nS9uFtxsvZbc+8T70Nk73BsF5RYtRUS+mbsTZsywXWhi7aVZ6jfxsGAiEEtp8jBJFFxnaDWqpsUkZ7JkBO9hXo1PRcF4FOVUjrunMa7IUUVmu8OOf5OzzlITrlcOPd5FysONP6Nab2Hv1p+UOLmIr31PSmsiqucwCXRSYJ4yVzIILkl+Qz/6m7J18X/f2s4q5bPhNZksQ7gaE72lmPClLLA0n/mtRfPHiK8EH79I1djm9LOz6DTbr+GDa1M2zU43g== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH0PR11MB5299.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(396003)(366004)(136003)(39860400002)(346002)(376002)(451199021)(54906003)(71200400001)(110136005)(66476007)(478600001)(52536014)(21615005)(166002)(8676002)(5660300002)(86362001)(38070700005)(33656002)(2906002)(8936002)(30864003)(40140700001)(316002)(4326008)(91956017)(64756008)(122000001)(66446008)(66556008)(66946007)(76116006)(55016003)(38100700002)(9686003)(83380400001)(41300700001)(19627405001)(6506007)(53546011)(186003)(966005)(7696005)(559001)(579004);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?2oaXEt2/1yD37oaB6KcsqOtE+WowYrYkUfDEz20rfzvbOvak3xIwBRLzQ3Y6?= =?us-ascii?Q?kTd3JQ6Xlhuatz5AmbTd2scQ8qlySt4RpGS8+cIf0YCRm/jZgG3fdq3+p1TL?= =?us-ascii?Q?jniMMIfAawAqMECRxYRIxa2k0RIWiGUbCMS8zxizHPVcByXr4T8/63SwR4v2?= =?us-ascii?Q?JpU+38Eu+DEB/+n0wxTR6rB7Pv0IHgRx9okbPl/rYt7BYfeF3WHYfXPBdQWL?= =?us-ascii?Q?HM1RnwDld3RD+75eCmDAuUOx4nZSPljZXxNtHVHmKjQ5Y6n7kJDHN0DVtFLi?= =?us-ascii?Q?tS2aLsXMvYv1M2veyjuU/xrojt+PqObn7okdO+fVUqtkv6E8Zvtr1WlALiDE?= =?us-ascii?Q?G0Hvb5+LckVz0MeiIorIQhOoxJQe+ONYq0KlwKWOVwBiBmnk7A7RKWA6AZz8?= =?us-ascii?Q?T4alntEMypdDst27B6CBeOe9g5AgR2tXb3rOjcsF0jge3RS6/Q9uuSM5tNcD?= =?us-ascii?Q?c5RQwjKOoun9MD1Z7Ja059Xslc8kp+ZFmTXaB3hlHBpsvrxjSd3OW4dgy/Mm?= =?us-ascii?Q?VmwpiEqxJyFhxwU3nELUnVw1Rx3uHXwQraTuAM0NjNa/rus+Tc2KrJ3t2D3N?= =?us-ascii?Q?J5ilLPeGQOYEDhk1dq6TBFTWRhU4oJ93NZ5Pgr/u3cYUCVkT/1NbIDnazCHn?= =?us-ascii?Q?dnL9kWFAmWY+avSYsOY+kxPLoetEuRsLSZ3ciZsHvu9aMKCaHEdPLIQMXHpv?= =?us-ascii?Q?Nc+rT/aYwP7DYay8x2xmGnqGBSxc7c0ELz1y+Y5Vo9hKceANMpWni973x5R3?= =?us-ascii?Q?zfQ427cmu3zpRdIE2RdXATwk11K0vY9OZ4XgXVvjB5RTmPP4kvLo8eqdKL1S?= =?us-ascii?Q?IX53+sO+cfQzgDA//CON5uNg3fP2HbSbGpGRZGFS0bnUay33Y6rQfwpkS7g8?= =?us-ascii?Q?bKIJnYHRwFd+w4t5kFP9q1DlTGCl4b/vDkaV8EVFSEedg32BnYrIYBy0X/S6?= =?us-ascii?Q?hzz/MWnR45Rld2MuQbDEPCSOhpD7qfzNYjeMGxSj+CIZMHA8MlHMO1jIRIwD?= =?us-ascii?Q?UoNx/pAAsTPQQDeQDTGqznsQrp58nyB4DJUOqcH754ecZEjYtsc1rEeEijzz?= =?us-ascii?Q?gV9HNwvN38rdJYKzQEZWfh+Ortbus2P87fsIAkXh6c7PQFLRgS/unjz4Svxc?= =?us-ascii?Q?/dLuSw1Rw+wyAyt1yMUYs0UBPOoTDe5dEFjcFf1EmOVCC/GBm34E/HsksiIw?= =?us-ascii?Q?K/giSso9uuftjmE1xoF1xvOIiooiJhBCOWbcpBwvvZAU1ntZkWGuPlup6vv3?= =?us-ascii?Q?tTpM7QZm8k4ipKUqZrUozYMwBSB6FMATIF48RiBLXSacrWOywhpcQYAWAcjJ?= =?us-ascii?Q?4rH9aWVorpcyTt7KejlRGptiXSubLiHE+72pE6ZYRGWtysLPCPXGxOoPd/CL?= =?us-ascii?Q?cKpE24ozl8bEKzTTVru43/ZtPEHaG1ihnAlhLfYDQdfFp1VDGykb8Px0ToW7?= =?us-ascii?Q?fjt99cclQ4jWLGGbRwBeWhkxS6nFFRByudOhH5+/WAQDv05cPglABHgXP02+?= =?us-ascii?Q?KsvCbprTd0sY94ptn4ho5B6Tci4ER/fieYTVQuD+CeqpCVeTPzCp2hvEoII1?= =?us-ascii?Q?Jhgclms8w7bE/RdzN3NIGvFFfLmDnvSkZ0VTpbvAmsp/QrIYJPtElzN/ZNPC?= =?us-ascii?Q?tA=3D=3D?= Content-Type: multipart/alternative; boundary="_000_CH0PR11MB529981313ED5A1F815350E41CD51ACH0PR11MB5299namp_" MIME-Version: 1.0 X-OriginatorOrg: cisco.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: CH0PR11MB5299.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4a374df6-40d2-454e-0731-08db68dbc562 X-MS-Exchange-CrossTenant-originalarrivaltime: 09 Jun 2023 11:22:12.1249 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 5ae1af62-9505-4097-a69a-c1553ef7840e X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 2htOX+IVpgvlgp/WIDXCGF8715kaQukx6ynSs5TCuqR5tZtS8clMh08TiLt2iFdYPsRE6i/G/pQLiSzXhr7LFA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA3PR11MB7653 X-Outbound-SMTP-Client: 173.37.147.229, alln-opgw-1.cisco.com X-Outbound-Node: alln-core-6.cisco.com X-Rspam-User: X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 27D571A0007 X-Stat-Signature: mui5kugsaupqo8wbse54cmbknraohdcs X-HE-Tag: 1686309736-348192 X-HE-Meta: U2FsdGVkX1+3MfPBqb3J9JUWdb3gtG27fqwCr3c/vtXEJUpZpcRIZKmxhyeQeNPpYeeLFqO9K01I/4Mj3W054xdhesk83gancqe2BO/2AjpW6jovfPjWODLdvmwH6/nICDqEnxq0DLS9B96BEcywiuEats0eouxcz5R8FgSJBE8dRYPLcZHb8rPbmryUOLqMrazLRTWt3Gm9OOX5EKpKkjZVja/s8L/ob6Wr02xgn+eAUTiIEOnDJnP63YxNJrrCgyv78zAE4lFS2WyrzJtU3jwaYzNOnZmATVi6UEkHTZcBVwyb+ksUVtnHMdPXAadg3M8JBN8OmA7bVqL1p2SuT/UzOzm8RizmTPdtuQ6RVxXjc4AqS+L4Npjkx8vK5BoLbKmGoXD0i1IqSbWadHBXFo2EbfY7G++4wU8Ut36LE3cFSz2oGM6UZBihBhbOzvxCBLxjp5faLN6tjJPKyn2yQmh22reqISKcgybL6sBSGigb2v/VW23Zq02c4YEWH2bwUFT9+BXzb3vrrWHH/5LLe2cN/A8wbikEKlTU5wMQ6Iwh4n7Y8CXejEI8DYKnuMQiELUJCpBwYSep6b80CSeHHciIZOgcijOy4hivfvak4kiD02ZqkWc+Vcpx8FzqrTdS1hD/dNvn1WyD7RlJGQaVjg2fFQYWG4wUmlCwCtPfCpTTU0DzTD3VusG/cO2Nd/NYBbw8dLWSgYGQPQi+JVo0Uw8Yna2XL4p7AIpae3BC4KeEH5tv0+8oRwY2EQyVBGrxuTmmuBOC0PpXCBFQukPhpg6ljdNhfyQ35wJo7zw0kUD3Ok0AAZkMzLI1w+KYQ0872MGrCHDMz611dqIfl3kV2IgVDp7KBqF7l0ssOLmPprB+t1favsIXz6Zpo91I31WKqddvIsgTysrkphVMumU81+CdTksk0QzTRqFMfamrW/ww5pxeiQ9izDjazZddMEh3yH7nK1IxXEWFR861DgQ FCBP13Wn 61yNB/Cbr3rZYoRjhGCcJVD4OKqBmxqWKKiGX4av9pZwWO3TfkOm1nZaR1rHjMEicJaoeoLJBHB7vdK9QfrdYUd72mU+4nRMRzA5hYUOJJAjcQlYH4NEWbehkNbYdPKIwIxHC0932kYwIzc4YzEoyBE9Yi3ZT/kuMapjFvPlS/+jbmSIaO01ol2YbW2hep5jj9YSIGqfIpQUUECIDetXhacFhkhBM58E936CYzvlW9GIxcueHvplQ3jqJ33ORHP2sFrmTJK53TlUj43H0AWDBTa4Pkvv+SabHJcoo58KcXpLV4arnYMcbEREP0hR0qTzA3uqQcf0z5Yil+tDTPGO5fHJ8xchpSSY9ogWMU7rbICNRcfRXmnw49JfAOtf1rKZBWuHfYclq2jYuFhBT4JzdDunZd6i69Sx+VPclLc3ys6V4X2kwAqrZdcD5Lo108D8NEhdQgNircVi7p/J2YZAQUp2UA+5GHUFi6OKai2aObR3bDtAxCDd/bp7ctqZHIHm1kOPhFfUuMA/j02JYNSSxVoBVxTdtIhUv5QGQy53k1AJgnmrx4W375j+E/XMI2snEFMsHV6GB2WZO7uQUxIIEXkaD3g+c0tkLLkIPcRj1ensmNW/VtxYiyYnnlh3Dx2Y0wauimMMYubTwDq/tQEWdYr3tgLUEZZ5bDFx7k+ySmbCRQ5dvBgYQxnjAkFw0H/atRaJLl452By7Tj9qdTGz2ztZqOSC/k4LNEYZWoXPWIodPLRfyxLwr5PHXmUbnGfF6Vnc7Cfkkf11oI+yIjuMugv1doWPtRa0EVb0UWBqlgUok+LTbI/FIIg80MhWn1IMbLmV7PDWJz4IR7MOXbTC7SnLYhezb4kPa05pmX9nish2o6vMsNsTLQ5IjclXBneAqP7/OXjrDez5gVKc+mpQkEQIGAeoqO5tkhtk2OUgyAoioE51XVc4V+3jIyL9GuhUtwqXHQCE7gJmWSLTofAPsOmNHrDz0 Kn/gH0wi 2ptQRXUdWCvWLX7XhLRODpbXxrvyFr2Y5XBOhy+huJloNENZnwCMVValGhrhr7DFEjN9AEEVi6w3LOsQdtg+MA== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: --_000_CH0PR11MB529981313ED5A1F815350E41CD51ACH0PR11MB5299namp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hello Christian, I didn't send these patches to a wider audience because this is an initial = prototype of the PuzzleFS driver, and it has a few prerequisites before it = could be even considered for merging. First of all, the rust filesystem abs= tractions and their dependencies need to be upstreamed, then there needs to= be a discussion regarding the inclusion of third-party crates in the linux= kernel. My plan was to send these patches to the rust-for-linux mailing list and th= en start a discussion with Miguel Ojeda regarding the upstreaming approach. There are a lot of new files added in this patch series because I've includ= ed all the dependencies required so that my patches could be applied to the= rust-next branch, but these dependencies will most likely need to be upstr= eamed separately. It was never my intention to avoid your reviews, should I also send subsequ= ent patches to linux-fsdevel, even if they're in the early stages of develo= pment? Regards, Ariel ________________________________ From: Christian Brauner Sent: Friday, June 9, 2023 1:36 PM To: Ariel Miculas (amiculas) ; linux-fsdevel@vger.kerne= l.org Cc: rust-for-linux@vger.kernel.org ; linux-= mm@kvack.org Subject: Re: [RFC PATCH 00/80] Rust PuzzleFS filesystem driver On Fri, Jun 09, 2023 at 09:29:58AM +0300, Ariel Miculas wrote: > Hi all! > > This is a proof of concept driver written for the PuzzleFS Uhm, the PuzzleFS filesystem isn't actually sent to fsdevel? Yet I see tons of patches in there that add wrappers to our core fs data structures. I even see a ton of new files that all fall clearly into fsdevel territory: create mode 100644 rust/kernel/cred.rs create mode 100644 rust/kernel/delay.rs create mode 100644 rust/kernel/driver.rs create mode 100644 rust/kernel/file.rs create mode 100644 rust/kernel/fs.rs create mode 100644 rust/kernel/fs/param.rs create mode 100644 rust/kernel/io_buffer.rs create mode 100644 rust/kernel/iov_iter.rs create mode 100644 rust/kernel/mm.rs create mode 100644 rust/kernel/mount.rs create mode 100644 rust/kernel/pages.rs There's also quite a lot of new mm/ in there, no? Any wrappers and code for core fs should be maintained as part of fs. Rust shouldn't become a way to avoid our reviews once you have a few wrappers added somewhere. > next-generation container filesystem [1]. I've included a short abstract > about puzzlefs further below. This driver is based on the rust-next > branch, on top of which I've backported the filesystem abstractions from > Wedson Almeida Filho [2][3] and Miguel Ojeda's third-party crates > support: proc-macro2, quote, syn, serde and serde_derive [4]. I've added > the additional third-party crates serde_cbor[5] and hex [6]. Then I've > adapted the user space puzzlefs code [1] so that the puzzlefs kernel > module could present the directory hierarchy and implement the basic > read functionality. > For some additional context, puzzlefs was started by Tycho Andersen and > it's the successor of atomfs. This FOSDEM presentation from 2019 [12] > covers the rationale for a new oci image format and presents a higher > level overview of our goals with puzzlefs. > I've split the rest of the cover letter in following sections (using a > markdown style): > * Example: it describes a practical example of what was achieved > * Limitations: it presents the existing limitations of this POC > * Upstreaming steps: it describes the steps needed for upstreaming this > driver > * Setup: it shows how to setup the necessary environment for testing the > puzzlefs driver > * Puzzlefs abstract: it provides a short overview of puzzlefs > > # Example > An example is provided below: > > ``` > ~ # cat /proc/filesystems | grep puzzlefs > nodev puzzlefs > ~ # mount -t puzzlefs -o oci_root_dir=3D"/home/puzzlefs_oci" -o image_man= ifest=3D"2d > 6602d678140540dc7e96de652a76a8b16e8aca190bae141297bcffdcae901b" none /mnt > ~ # ls -lR /mnt/ > /mnt/: > total 0 > drwxr-xr-x 2 0 0 0 Jun 8 12:26 dir-1 > drwxr-xr-x 2 0 0 0 Jun 8 12:26 dir-2 > drwxr-xr-x 2 0 0 0 Jun 8 12:26 dir-3 > drwxr-xr-x 2 0 0 0 Jun 8 12:26 dir-4 > -rw-r--r-- 1 0 0 0 Jun 8 12:26 file1 > -rw-r--r-- 1 0 0 0 Jun 8 12:26 file2 > > /mnt/dir-1: > total 0 > > /mnt/dir-2: > total 0 > > /mnt/dir-3: > total 0 > > /mnt/dir-4: > total 0 > ~ # cat /mnt/file2 > ana are mere bla bla bla > ~ # wc /mnt/file1 > 202 202 5454 /mnt/file1 > ``` > > In this example, /home/puzzlefs_oci is the puzzlefs oci directory: > ``` > ~ # ls -lR /home/puzzlefs_oci/ > /home/puzzlefs_oci/: > total 8 > drwxr-xr-x 3 1000 1000 0 Jun 8 14:33 blobs > -rw-r--r-- 1 1000 1000 266 Jun 8 14:33 index.json > -rw-r--r-- 1 1000 1000 37 Jun 8 14:33 oci-layout > > /home/puzzlefs_oci/blobs: > total 0 > drwxr-xr-x 2 1000 1000 0 Jun 8 14:33 sha256 > > /home/puzzlefs_oci/blobs/sha256: > total 16 > -rw------- 1 1000 1000 89 Jun 8 14:33 2d6602d678140540= dc7e96de652a76a8b16eb > -rw------- 1 1000 1000 925 Jun 8 14:33 4df03518eea40634= 3dbb55046720f6a478881 > -rw------- 1 1000 1000 5479 Jun 8 14:33 d86a87b19bd9a2fe= c0d31687c1d669cdb59eb > ``` > > `2d6602d678140540dc7e96de652a76a8b16eb` is the puzzlefs image manifest > hash for the first_try tag: > ``` > $ cat /tmp/oci-simple/index.json | jq . > { > "schemaVersion": -1, > "manifests": [ > { > "digest": "sha256:2d6602d678140540dc7e96de652a76a8b16e8aca190bae141= 297bcffdcae901b", > "size": 89, > "media_type": "application/vnd.puzzlefs.image.rootfs.v1", > "annotations": { > "org.opencontainers.image.ref.name": "first_try" > } > } > ], > "annotations": {} > } > ``` > > I will describe how to build a puzzlefs image in the `Setup` section, at > step 5. > > # Limitations > One limitation is that the puzzlefs driver doesn't implement any lookup > functionality and instead it inserts every directory entry into the > dcache during init (see the `DCACHE_BASED` constant). This is similar to > how the sample `rust_fs` driver works, but the goal is to implement > proper lookup functions. However, more filesystem abstractions need to > be implemented before this can be achieved. > > # Upstreaming steps > Before the puzzlefs driver can be upstreamed, the following need to be > merged: > * Wedson's filesystem abstractions [3] > * the necessary third-party crates [4] (with the preliminary discussion > about whether this is desirable) > > # Setup > My setup is based on Wedson's tutorial [8]. Next, I will describe the > necessary steps to build an initrd and run a custom kernel under qemu. > > 1. Get the linux rust-next branch [9] and apply this patchset > > 2. Follow the rust quickstart guide [10] > > 3. configure and build the kernel > ``` > $ make LLVM=3D1 allnoconfig qemu-busybox-min.config rust.config > $ make LLVM=3D1 -j$(nproc) > ``` > > 4. setup busybox > ``` > git clone git://git.busybox.net/busybox > cd busybox > make menuconfig # enable 'Build static binary' config > make > make install > ``` > This will create the `_install` directory with the rootfs inside it. > > 5. create a home directory in the rootfs and copy a puzzlefs oci > directory in home/puzzlefs_oci > To create a puzzlefs oci directory: > * download this custom puzzlefs repository [11] (it's custom because we > want to build an image without verity data) > * run `make release` > * create a simple filesystem structure with a few directories and files > (I've created one at ../test-puzzlefs/simple_rootfs) > * build a puzzlefs oci image at > `~/work/busybox/_install/home/puzzlefs_oci` (replace this path with > your busybox path) with the tag `first_try`: > ``` > $ target/release/puzzlefs build --omit-verity \ > ../test-puzzlefs/simple_rootfs ~/work/busybox/_install/home/puzzlefs_oci = \ > first_try > ``` > * get first_try's image manifest from index.json (inside `puzzlefs_oci`) > ``` > $ cat index.json | jq . | grep digest > "digest": "sha256:2d6602d678140540dc7e96de652a76a8b16e8aca190bae141= 297bcffdcae901b", > ``` > > 6. add the following 'init' script in the busybox rootfs (rootfs path > defaults to `./_install'): > ``` > #!/bin/sh > mount -t devtmpfs none /dev > mkdir -p /proc > mount -t proc none /proc > > ifconfig lo up > udhcpc -i eth0 > > mkdir /mnt > mount -t puzzlefs -o oci_root_dir=3D"/home/puzzlefs_oci" -o \ > image_manifest=3D"2d6602d678140540dc7e96de652a76a8b16e8aca190bae141297bcf= fdcae901b" \ > none /mnt > > setsid sh -c 'exec sh -l /dev/ttyS0 2>&1' > ``` > > Make sure to replace the `image_manifest` with your own digest. This > init script will be passed to rdinit in the kernel command line. > > 7. generate the initramfs > > Assuming busybox is in `~/work/busybox`: > ``` > cd ~/work/busybox/_install && find . | cpio -H newc -o | gzip > ../ramdis= k.img > ``` > This will generate a compressed ramdisk image in > `~/work/busybox/ramdisk.img`. > > 8. run with qemu (this assumes the linux tree is at '../linux' and busybo= x > is at '../busybox'): > ``` > qemu-system-x86_64 \ > -accel kvm \ > -cpu host \ > -m 4G \ > -initrd ../busybox/ramdisk.img \ > -kernel ../linux/arch/x86/boot/bzImage \ > -nographic \ > -append 'console=3DttyS0 nokaslr debug rdinit=3D/init' \ > -nic user,model=3Drtl8139 \ > -no-reboot > ``` > > 9. Check whether puzzlefs has been successfully mounted > ``` > ~ # mount | grep puzzlefs > none on /mnt type puzzlefs (rw,relatime) > ~ # ls /mnt/ > dir-1 dir-2 dir-3 dir-4 file1 file2 > ``` > > > # Puzzlefs abstract > Puzzlefs [1] is a container filesystem designed to address the > limitations of the existing OCI format. The main goals of the project > are reduced duplication, reproducible image builds, direct mounting > support and memory safety guarantees, some inspired by the OCIv2 design > document [7]. > > Reduced duplication is achieved using the content defined chunking > algorithm FastCDC. This implementation allows chunks to be shared among > layers. Building a new layer starting from an existing one allows > reusing most of the chunks. > > Another goal of the project is reproducible image builds, which is > achieved by defining a canonical representation of the image format. > > Direct mounting support is a key feature of puzzlefs and, together with > fs-verity, it provides data integrity. Currently, puzzlefs is > implemented as a userspace filesystem (FUSE). A read-only kernel > filesystem driver is underway. > > Lastly, memory safety is critical to puzzlefs, leading to the decision > to implement it in Rust. Another goal is to share the same code between > user space and kernel space in order to provide one secure > implementation. > > > [1] https://github.com/anuvu/puzzlefs > [2] https://github.com/wedsonaf/linux/tree/fs > [3] https://github.com/Rust-for-Linux/linux/issues/1004 > [4] https://github.com/Rust-for-Linux/linux/pull/1007 > [5] https://docs.rs/serde_cbor/latest/serde_cbor/ > [6] https://docs.rs/hex/0.4.3/hex/ > [7] https://hackmd.io/@cyphar/ociv2-brainstorm > [8] https://www.youtube.com/watch?v=3DtPs1uRqOnlk > [9] https://github.com/Rust-for-Linux/linux/tree/rust-next > [10] https://docs.kernel.org/rust/quick-start.html > [11] https://github.com/ariel-miculas/puzzlefs/tree/support-no-verity-dat= a > [12] https://archive.fosdem.org/2019/schedule/event/containers_atomfs/ > > Ariel Miculas (58): > rust: kernel: add libraries required by the filesystem abstractions > rust: kernel: backport the delay module from the rust branch > rust: kernel: add container_of macro > rust: kernel: add offset_of macro > drop: Add crate::pr_warn declaration > rust: kernel: rename from_kernel_errno to from_errno > rust: kernel: Rename from_pointer to from_foreing and into_pointer to > into_foreign > rust: kernel: add count_paren_items macro, needed by define_fs_params > macro > rust: helpers: add missing rust helper 'alloc_pages' > kernel: configs: add qemu-busybox-min.config > rust: kernel: format the rust code > samples: puzzlefs: add initial puzzlefs sample, copied from rust_fs.rs > kernel: configs: enable rust samples in rust.config > Add SAMPLE_RUST_SERDE in rust.config > rust: kernel: fix compile errors after rebase to rust-next > rust: serde_cbor: import crate > rust: serde_cbor: add SPDX License Identifiers > rust: serde_cbor: add no_fp_fmt_parse support > rust: Kbuild: enable serde_cbor > samples: rust: add cbor serialize/deserialize example > rust: serde_cbor: add support for serde_cbor's from_slice method by > using a custom alloc_kernel feature > rust: serde: add support for deserializing Vec with kernel_alloc > feature > rust: file: Replace UnsafeCell with Opaque for File > rust: kernel: implement fmt::Debug for CString > samples: puzzlefs: rename RustFs to PuzzleFs > samples: puzzlefs: add basic deserializing support for the puzzlefs > metadata > rust: file: present the filesystem context to the open function > rust: kernel: add an abstraction over vfsmount to allow cloning a new > private mount > rust: file: add from_path, from_path_in_root_mnt and read_with_offset > methods to File > samples: puzzlefs: pass the Vfsmount structure from open to read and > return the contents of the data file inside /home/puzzlefs_oci > rust: file: move from_path, from_path_in_root_mnt and read_with_offset > methods to a RegularFile newtype > rust: file: ensure RegularFile can only create regular files > rust: file: add get_pos method to RegularFile > rust: file: add methods read_to_end, get_file_size and update_pos to > RegularFile > rust: file: define a minimal Read trait and implement it for > RegularFile > samples: puzzlefs: add cbor_get_array_size method > samples: puzzlefs: add KernelError to WireFormatError and implement > From conversion > samples: puzzlefs: implement new for MetadataBlob > samples: puzzlefs: build puzzlefs into the kernel, thus avoiding the > need to export rust symbols > rust: alloc: add try_clone for Vec > rust: alloc: add from_iter_fallible for Vec > samples: puzzlefs: implement to_errno and from_errno for > WireFormatError > samples: puzzlefs: add TryReserveError (and from conversion) to > WireFormatError > samples: puzzlefs: add higher level inode related functionality > samples: puzzlefs: populate the directory entries with the inodes from > the puzzlefs metadata file > rust: hex: import crate > rust: hex: add SPDX license identifiers > rust: Kbuild: enable `hex` > rust: hex: implement FromHex trait and hex::decode using a custom > kernel_alloc feature > rust: hex: add encode_hex_iter and encode_hex_upper_iter methods > rust: puzzlefs: add HexError to WireFormatError and implement the From > conversion > rust: puzzlefs: display the error value for > WireFormatError::KernelError > samples: puzzlefs: add Rootfs and Digest structs to types.rs > samples: puzzlefs: implement the conversion from WireFormatError to > kernel::error::Error > rust: puzzlefs: read the puzzlefs image manifest instead of an > individual metadata layer > rust: puzzlefs: rename PuzzleFs to PuzzleFsModule to avoid confusion > with the PuzzleFS struct > rust: puzzlefs: add support for reading files > rust: puzzlefs: add oci_root_dir and image_manifest filesystem > parameters > > Miguel Ojeda (15): > rust: proc-macro2: import crate > rust: proc-macro2: add SPDX License Identifiers > rust: proc-macro2: remove `unicode_ident` dependency > rust: quote: import crate > rust: quote: add SPDX License Identifiers > rust: syn: import crate > rust: syn: add SPDX License Identifiers > rust: syn: remove `unicode-ident` dependency > rust: serde: import crate > rust: serde: add `no_fp_fmt_parse` support > rust: serde: add SPDX License Identifiers > rust: serde_derive: import crate > rust: serde_derive: add SPDX License Identifiers > rust: Kbuild: enable `proc-macro2`, `quote`, `syn`, `serde` and > `serde_derive` > rust: test `serde` support > > Wedson Almeida Filho (7): > rust: add definitions for ref-counted inodes and dentries > rust: add ability to register a file system > rust: define fs context > rust: add support for file system parameters > rust: allow fs driver to initialise new superblocks > rust: add `module_fs` macro > WIP: rust: allow fs to be populated > > Makefile | 14 +- > arch/x86/configs/qemu-busybox-min.config | 11 + > kernel/configs/qemu-busybox-min.config | 56 + > kernel/configs/rust.config | 11 + > rust/.gitignore | 1 + > rust/Makefile | 232 +- > rust/alloc/vec/mod.rs | 48 + > rust/bindings/bindings_helper.h | 14 + > rust/bindings/lib.rs | 5 + > rust/helpers.c | 76 + > rust/hex/error.rs | 78 + > rust/hex/lib.rs | 506 +++ > rust/hex/serde.rs | 104 + > rust/kernel/cred.rs | 46 + > rust/kernel/delay.rs | 104 + > rust/kernel/driver.rs | 28 + > rust/kernel/error.rs | 52 +- > rust/kernel/file.rs | 1117 ++++++ > rust/kernel/fs.rs | 1478 ++++++++ > rust/kernel/fs/param.rs | 558 +++ > rust/kernel/io_buffer.rs | 153 + > rust/kernel/iov_iter.rs | 81 + > rust/kernel/lib.rs | 83 + > rust/kernel/mm.rs | 149 + > rust/kernel/mount.rs | 66 + > rust/kernel/pages.rs | 144 + > rust/kernel/str.rs | 6 + > rust/kernel/test_serde.rs | 26 + > rust/kernel/test_serde/de.rs | 439 +++ > rust/kernel/test_serde/error.rs | 73 + > rust/kernel/test_serde/ser.rs | 466 +++ > rust/kernel/user_ptr.rs | 175 + > rust/proc-macro2/detection.rs | 77 + > rust/proc-macro2/fallback.rs | 1004 ++++++ > rust/proc-macro2/lib.rs | 1341 ++++++++ > rust/proc-macro2/marker.rs | 20 + > rust/proc-macro2/parse.rs | 874 +++++ > rust/proc-macro2/rcvec.rs | 144 + > rust/proc-macro2/wrapper.rs | 996 ++++++ > rust/quote/ext.rs | 112 + > rust/quote/format.rs | 170 + > rust/quote/ident_fragment.rs | 88 + > rust/quote/lib.rs | 1436 ++++++++ > rust/quote/runtime.rs | 440 +++ > rust/quote/spanned.rs | 45 + > rust/quote/to_tokens.rs | 211 ++ > rust/serde/de/format.rs | 32 + > rust/serde/de/ignored_any.rs | 246 ++ > rust/serde/de/impls.rs | 2755 +++++++++++++++ > rust/serde/de/mod.rs | 2313 +++++++++++++ > rust/serde/de/seed.rs | 21 + > rust/serde/de/utf8.rs | 48 + > rust/serde/de/value.rs | 1718 ++++++++++ > rust/serde/integer128.rs | 84 + > rust/serde/lib.rs | 351 ++ > rust/serde/macros.rs | 238 ++ > rust/serde/private/de.rs | 2997 ++++++++++++++++ > rust/serde/private/doc.rs | 161 + > rust/serde/private/mod.rs | 52 + > rust/serde/private/ser.rs | 1316 +++++++ > rust/serde/private/size_hint.rs | 23 + > rust/serde/ser/fmt.rs | 180 + > rust/serde/ser/impls.rs | 987 ++++++ > rust/serde/ser/impossible.rs | 218 ++ > rust/serde/ser/mod.rs | 1992 +++++++++++ > rust/serde/std_error.rs | 50 + > rust/serde_cbor/de.rs | 1370 ++++++++ > rust/serde_cbor/error.rs | 320 ++ > rust/serde_cbor/lib.rs | 371 ++ > rust/serde_cbor/read.rs | 647 ++++ > rust/serde_cbor/ser.rs | 748 ++++ > rust/serde_cbor/tags.rs | 224 ++ > rust/serde_cbor/value/de.rs | 168 + > rust/serde_cbor/value/mod.rs | 158 + > rust/serde_cbor/value/ser.rs | 447 +++ > rust/serde_cbor/write.rs | 177 + > rust/serde_derive/bound.rs | 408 +++ > rust/serde_derive/de.rs | 3148 +++++++++++++++++ > rust/serde_derive/dummy.rs | 46 + > rust/serde_derive/fragment.rs | 76 + > rust/serde_derive/internals/ast.rs | 204 ++ > rust/serde_derive/internals/attr.rs | 1908 +++++++++++ > rust/serde_derive/internals/case.rs | 199 ++ > rust/serde_derive/internals/check.rs | 445 +++ > rust/serde_derive/internals/ctxt.rs | 64 + > rust/serde_derive/internals/mod.rs | 30 + > rust/serde_derive/internals/receiver.rs | 287 ++ > rust/serde_derive/internals/respan.rs | 18 + > rust/serde_derive/internals/symbol.rs | 71 + > rust/serde_derive/lib.rs | 112 + > rust/serde_derive/pretend.rs | 203 ++ > rust/serde_derive/ser.rs | 1342 ++++++++ > rust/serde_derive/this.rs | 34 + > rust/serde_derive/try.rs | 26 + > rust/syn/attr.rs | 664 ++++ > rust/syn/await.rs | 4 + > rust/syn/bigint.rs | 68 + > rust/syn/buffer.rs | 400 +++ > rust/syn/custom_keyword.rs | 255 ++ > rust/syn/custom_punctuation.rs | 302 ++ > rust/syn/data.rs | 495 +++ > rust/syn/derive.rs | 276 ++ > rust/syn/discouraged.rs | 196 ++ > rust/syn/error.rs | 430 +++ > rust/syn/export.rs | 41 + > rust/syn/expr.rs | 3560 +++++++++++++++++++ > rust/syn/ext.rs | 141 + > rust/syn/file.rs | 127 + > rust/syn/gen/clone.rs | 2243 ++++++++++++ > rust/syn/gen/debug.rs | 3044 +++++++++++++++++ > rust/syn/gen/eq.rs | 2197 ++++++++++++ > rust/syn/gen/fold.rs | 3343 ++++++++++++++++++ > rust/syn/gen/hash.rs | 2871 ++++++++++++++++ > rust/syn/gen/visit.rs | 3788 +++++++++++++++++++++ > rust/syn/gen/visit_mut.rs | 3788 +++++++++++++++++++++ > rust/syn/gen_helper.rs | 156 + > rust/syn/generics.rs | 1339 ++++++++ > rust/syn/group.rs | 284 ++ > rust/syn/ident.rs | 103 + > rust/syn/item.rs | 3315 ++++++++++++++++++ > rust/syn/lib.rs | 985 ++++++ > rust/syn/lifetime.rs | 156 + > rust/syn/lit.rs | 1602 +++++++++ > rust/syn/lookahead.rs | 171 + > rust/syn/mac.rs | 221 ++ > rust/syn/macros.rs | 179 + > rust/syn/op.rs | 236 ++ > rust/syn/parse.rs | 1316 +++++++ > rust/syn/parse_macro_input.rs | 181 + > rust/syn/parse_quote.rs | 169 + > rust/syn/pat.rs | 929 +++++ > rust/syn/path.rs | 856 +++++ > rust/syn/print.rs | 18 + > rust/syn/punctuated.rs | 1070 ++++++ > rust/syn/reserved.rs | 46 + > rust/syn/sealed.rs | 6 + > rust/syn/span.rs | 69 + > rust/syn/spanned.rs | 116 + > rust/syn/stmt.rs | 351 ++ > rust/syn/thread.rs | 43 + > rust/syn/token.rs | 1015 ++++++ > rust/syn/tt.rs | 109 + > rust/syn/ty.rs | 1288 +++++++ > rust/syn/verbatim.rs | 35 + > rust/syn/whitespace.rs | 67 + > samples/rust/Kconfig | 28 + > samples/rust/Makefile | 3 + > samples/rust/local_data_format/de.rs | 422 +++ > samples/rust/local_data_format/error.rs | 73 + > samples/rust/local_data_format/ser.rs | 443 +++ > samples/rust/puzzle.rs | 4 + > samples/rust/puzzle/error.rs | 91 + > samples/rust/puzzle/inode.rs | 150 + > samples/rust/puzzle/oci.rs | 71 + > samples/rust/puzzle/types.rs | 389 +++ > samples/rust/puzzle/types/cbor_helpers.rs | 50 + > samples/rust/puzzlefs.rs | 220 ++ > samples/rust/rust_fs.rs | 105 + > samples/rust/rust_serde.rs | 125 + > scripts/Makefile.build | 4 +- > 160 files changed, 89204 insertions(+), 29 deletions(-) > create mode 100644 arch/x86/configs/qemu-busybox-min.config > create mode 100644 kernel/configs/qemu-busybox-min.config > create mode 100644 rust/hex/error.rs > create mode 100644 rust/hex/lib.rs > create mode 100644 rust/hex/serde.rs > create mode 100644 rust/kernel/cred.rs > create mode 100644 rust/kernel/delay.rs > create mode 100644 rust/kernel/driver.rs > create mode 100644 rust/kernel/file.rs > create mode 100644 rust/kernel/fs.rs > create mode 100644 rust/kernel/fs/param.rs > create mode 100644 rust/kernel/io_buffer.rs > create mode 100644 rust/kernel/iov_iter.rs > create mode 100644 rust/kernel/mm.rs > create mode 100644 rust/kernel/mount.rs > create mode 100644 rust/kernel/pages.rs > create mode 100644 rust/kernel/test_serde.rs > create mode 100644 rust/kernel/test_serde/de.rs > create mode 100644 rust/kernel/test_serde/error.rs > create mode 100644 rust/kernel/test_serde/ser.rs > create mode 100644 rust/kernel/user_ptr.rs > create mode 100644 rust/proc-macro2/detection.rs > create mode 100644 rust/proc-macro2/fallback.rs > create mode 100644 rust/proc-macro2/lib.rs > create mode 100644 rust/proc-macro2/marker.rs > create mode 100644 rust/proc-macro2/parse.rs > create mode 100644 rust/proc-macro2/rcvec.rs > create mode 100644 rust/proc-macro2/wrapper.rs > create mode 100644 rust/quote/ext.rs > create mode 100644 rust/quote/format.rs > create mode 100644 rust/quote/ident_fragment.rs > create mode 100644 rust/quote/lib.rs > create mode 100644 rust/quote/runtime.rs > create mode 100644 rust/quote/spanned.rs > create mode 100644 rust/quote/to_tokens.rs > create mode 100644 rust/serde/de/format.rs > create mode 100644 rust/serde/de/ignored_any.rs > create mode 100644 rust/serde/de/impls.rs > create mode 100644 rust/serde/de/mod.rs > create mode 100644 rust/serde/de/seed.rs > create mode 100644 rust/serde/de/utf8.rs > create mode 100644 rust/serde/de/value.rs > create mode 100644 rust/serde/integer128.rs > create mode 100644 rust/serde/lib.rs > create mode 100644 rust/serde/macros.rs > create mode 100644 rust/serde/private/de.rs > create mode 100644 rust/serde/private/doc.rs > create mode 100644 rust/serde/private/mod.rs > create mode 100644 rust/serde/private/ser.rs > create mode 100644 rust/serde/private/size_hint.rs > create mode 100644 rust/serde/ser/fmt.rs > create mode 100644 rust/serde/ser/impls.rs > create mode 100644 rust/serde/ser/impossible.rs > create mode 100644 rust/serde/ser/mod.rs > create mode 100644 rust/serde/std_error.rs > create mode 100644 rust/serde_cbor/de.rs > create mode 100644 rust/serde_cbor/error.rs > create mode 100644 rust/serde_cbor/lib.rs > create mode 100644 rust/serde_cbor/read.rs > create mode 100644 rust/serde_cbor/ser.rs > create mode 100644 rust/serde_cbor/tags.rs > create mode 100644 rust/serde_cbor/value/de.rs > create mode 100644 rust/serde_cbor/value/mod.rs > create mode 100644 rust/serde_cbor/value/ser.rs > create mode 100644 rust/serde_cbor/write.rs > create mode 100644 rust/serde_derive/bound.rs > create mode 100644 rust/serde_derive/de.rs > create mode 100644 rust/serde_derive/dummy.rs > create mode 100644 rust/serde_derive/fragment.rs > create mode 100644 rust/serde_derive/internals/ast.rs > create mode 100644 rust/serde_derive/internals/attr.rs > create mode 100644 rust/serde_derive/internals/case.rs > create mode 100644 rust/serde_derive/internals/check.rs > create mode 100644 rust/serde_derive/internals/ctxt.rs > create mode 100644 rust/serde_derive/internals/mod.rs > create mode 100644 rust/serde_derive/internals/receiver.rs > create mode 100644 rust/serde_derive/internals/respan.rs > create mode 100644 rust/serde_derive/internals/symbol.rs > create mode 100644 rust/serde_derive/lib.rs > create mode 100644 rust/serde_derive/pretend.rs > create mode 100644 rust/serde_derive/ser.rs > create mode 100644 rust/serde_derive/this.rs > create mode 100644 rust/serde_derive/try.rs > create mode 100644 rust/syn/attr.rs > create mode 100644 rust/syn/await.rs > create mode 100644 rust/syn/bigint.rs > create mode 100644 rust/syn/buffer.rs > create mode 100644 rust/syn/custom_keyword.rs > create mode 100644 rust/syn/custom_punctuation.rs > create mode 100644 rust/syn/data.rs > create mode 100644 rust/syn/derive.rs > create mode 100644 rust/syn/discouraged.rs > create mode 100644 rust/syn/error.rs > create mode 100644 rust/syn/export.rs > create mode 100644 rust/syn/expr.rs > create mode 100644 rust/syn/ext.rs > create mode 100644 rust/syn/file.rs > create mode 100644 rust/syn/gen/clone.rs > create mode 100644 rust/syn/gen/debug.rs > create mode 100644 rust/syn/gen/eq.rs > create mode 100644 rust/syn/gen/fold.rs > create mode 100644 rust/syn/gen/hash.rs > create mode 100644 rust/syn/gen/visit.rs > create mode 100644 rust/syn/gen/visit_mut.rs > create mode 100644 rust/syn/gen_helper.rs > create mode 100644 rust/syn/generics.rs > create mode 100644 rust/syn/group.rs > create mode 100644 rust/syn/ident.rs > create mode 100644 rust/syn/item.rs > create mode 100644 rust/syn/lib.rs > create mode 100644 rust/syn/lifetime.rs > create mode 100644 rust/syn/lit.rs > create mode 100644 rust/syn/lookahead.rs > create mode 100644 rust/syn/mac.rs > create mode 100644 rust/syn/macros.rs > create mode 100644 rust/syn/op.rs > create mode 100644 rust/syn/parse.rs > create mode 100644 rust/syn/parse_macro_input.rs > create mode 100644 rust/syn/parse_quote.rs > create mode 100644 rust/syn/pat.rs > create mode 100644 rust/syn/path.rs > create mode 100644 rust/syn/print.rs > create mode 100644 rust/syn/punctuated.rs > create mode 100644 rust/syn/reserved.rs > create mode 100644 rust/syn/sealed.rs > create mode 100644 rust/syn/span.rs > create mode 100644 rust/syn/spanned.rs > create mode 100644 rust/syn/stmt.rs > create mode 100644 rust/syn/thread.rs > create mode 100644 rust/syn/token.rs > create mode 100644 rust/syn/tt.rs > create mode 100644 rust/syn/ty.rs > create mode 100644 rust/syn/verbatim.rs > create mode 100644 rust/syn/whitespace.rs > create mode 100644 samples/rust/local_data_format/de.rs > create mode 100644 samples/rust/local_data_format/error.rs > create mode 100644 samples/rust/local_data_format/ser.rs > create mode 100644 samples/rust/puzzle.rs > create mode 100644 samples/rust/puzzle/error.rs > create mode 100644 samples/rust/puzzle/inode.rs > create mode 100644 samples/rust/puzzle/oci.rs > create mode 100644 samples/rust/puzzle/types.rs > create mode 100644 samples/rust/puzzle/types/cbor_helpers.rs > create mode 100644 samples/rust/puzzlefs.rs > create mode 100644 samples/rust/rust_fs.rs > create mode 100644 samples/rust/rust_serde.rs > > -- > 2.40.1 > --_000_CH0PR11MB529981313ED5A1F815350E41CD51ACH0PR11MB5299namp_ Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable
Hello Christian,

I didn't send these patches to a wider audience because this is an initial = prototype of the PuzzleFS driver, and it has a few prerequisites before it = could be even considered for merging. First of all, the rust filesystem abs= tractions and their dependencies need to be upstreamed, then there needs to be a discussion regarding the i= nclusion of third-party crates in the linux kernel.

My plan was to send these patches to the rust-for-linux mailing list a= nd then start a discussion with Miguel Ojeda regarding the upstreaming appr= oach.
There are a lot of new files added in this patch series because I've includ= ed all the dependencies required so that my patches could be applied to the= rust-next branch, but these dependencies will most likely need to be upstr= eamed separately.

It was never my intention to avoid your reviews, should I also send subsequ= ent patches to linux-fsdevel, even if they're in the early stages of develo= pment?

Regards,
Ariel

From: Christian Brauner <= ;brauner@kernel.org>
Sent: Friday, June 9, 2023 1:36 PM
To: Ariel Miculas (amiculas) <amiculas@cisco.com>; linux-fsdev= el@vger.kernel.org <linux-fsdevel@vger.kernel.org>
Cc: rust-for-linux@vger.kernel.org <rust-for-linux@vger.kernel.or= g>; linux-mm@kvack.org <linux-mm@kvack.org>
Subject: Re: [RFC PATCH 00/80] Rust PuzzleFS filesystem driver
 
On Fri, Jun 09, 2023 at 09:29:58AM +0300, Ariel Mi= culas wrote:
> Hi all!
>
> This is a proof of concept driver written for the PuzzleFS

Uhm, the PuzzleFS filesystem isn't actually sent to fsdevel? Yet I see
tons of patches in there that add wrappers to our core fs data
structures. I even see a ton of new files that all fall clearly into
fsdevel territory:

create mode 100644 rust/kernel/cred.rs
create mode 100644 rust/kernel/delay.rs
create mode 100644 rust/kernel/driver.rs
create mode 100644 rust/kernel/file.rs
create mode 100644 rust/kernel/fs.rs
create mode 100644 rust/kernel/fs/param.rs
create mode 100644 rust/kernel/io_buffer.rs
create mode 100644 rust/kernel/iov_iter.rs
create mode 100644 rust/kernel/mm.rs
create mode 100644 rust/kernel/mount.rs
create mode 100644 rust/kernel/pages.rs

There's also quite a lot of new mm/ in there, no?

Any wrappers and code for core fs should be maintained as part of fs.
Rust shouldn't become a way to avoid our reviews once you have a few
wrappers added somewhere.

> next-generation container filesystem [1]. I've included a short abstra= ct
> about puzzlefs further below. This driver is based on the rust-next > branch, on top of which I've backported the filesystem abstractions fr= om
> Wedson Almeida Filho [2][3] and Miguel Ojeda's third-party crates
> support: proc-macro2, quote, syn, serde and serde_derive [4]. I've add= ed
> the additional third-party crates serde_cbor[5] and hex [6]. Then I've=
> adapted the user space puzzlefs code [1] so that the puzzlefs kernel > module could present the directory hierarchy and implement the basic > read functionality.
> For some additional context, puzzlefs was started by Tycho Andersen an= d
> it's the successor of atomfs. This FOSDEM presentation from 2019 [12]<= br> > covers the rationale for a new oci image format and presents a higher<= br> > level overview of our goals with puzzlefs.
> I've split the rest of the cover letter in following sections (using a=
> markdown style):
> * Example: it describes a practical example of what was achieved
> * Limitations: it presents the existing limitations of this POC
> * Upstreaming steps: it describes the steps needed for upstreaming thi= s
>   driver
> * Setup: it shows how to setup the necessary environment for testing t= he
>   puzzlefs driver
> * Puzzlefs abstract: it provides a short overview of puzzlefs
>
> # Example
> An example is provided below:
>
> ```
> ~ # cat /proc/filesystems | grep puzzlefs
> nodev   puzzlefs
> ~ # mount -t puzzlefs -o oci_root_dir=3D"/home/puzzlefs_oci"= -o image_manifest=3D"2d
> 6602d678140540dc7e96de652a76a8b16e8aca190bae141297bcffdcae901b" n= one /mnt
> ~ # ls -lR /mnt/
> /mnt/:
> total 0
> drwxr-xr-x    2 0      &n= bsp; 0           &nb= sp;    0 Jun  8 12:26 dir-1
> drwxr-xr-x    2 0      &n= bsp; 0           &nb= sp;    0 Jun  8 12:26 dir-2
> drwxr-xr-x    2 0      &n= bsp; 0           &nb= sp;    0 Jun  8 12:26 dir-3
> drwxr-xr-x    2 0      &n= bsp; 0           &nb= sp;    0 Jun  8 12:26 dir-4
> -rw-r--r--    1 0      &n= bsp; 0           &nb= sp;    0 Jun  8 12:26 file1
> -rw-r--r--    1 0      &n= bsp; 0           &nb= sp;    0 Jun  8 12:26 file2
>
> /mnt/dir-1:
> total 0
>
> /mnt/dir-2:
> total 0
>
> /mnt/dir-3:
> total 0
>
> /mnt/dir-4:
> total 0
> ~ # cat /mnt/file2
> ana are mere bla bla bla
> ~ # wc /mnt/file1
>       202     &= nbsp; 202      5454 /mnt/file1
> ```
>
> In this example, /home/puzzlefs_oci is the puzzlefs oci directory:
> ```
> ~ # ls -lR /home/puzzlefs_oci/
> /home/puzzlefs_oci/:
> total 8
> drwxr-xr-x    3 1000     1000 =             0 Jun&nb= sp; 8 14:33 blobs
> -rw-r--r--    1 1000     1000 =           266 Jun  8 14:3= 3 index.json
> -rw-r--r--    1 1000     1000 =            37 Jun  8= 14:33 oci-layout
>
> /home/puzzlefs_oci/blobs:
> total 0
> drwxr-xr-x    2 1000     1000 =             0 Jun&nb= sp; 8 14:33 sha256
>
> /home/puzzlefs_oci/blobs/sha256:
> total 16
> -rw-------    1 1000     1000 =            89 Jun  8= 14:33 2d6602d678140540dc7e96de652a76a8b16eb
> -rw-------    1 1000     1000 =           925 Jun  8 14:3= 3 4df03518eea406343dbb55046720f6a478881
> -rw-------    1 1000     1000 =          5479 Jun  8 14:33 d86= a87b19bd9a2fec0d31687c1d669cdb59eb
> ```
>
> `2d6602d678140540dc7e96de652a76a8b16eb` is the puzzlefs image manifest=
> hash for the first_try tag:
> ```
> $ cat /tmp/oci-simple/index.json | jq .
> {
>   "schemaVersion": -1,
>   "manifests": [
>     {
>       "digest": "sha256:2= d6602d678140540dc7e96de652a76a8b16e8aca190bae141297bcffdcae901b",
>       "size": 89,
>       "media_type": "appl= ication/vnd.puzzlefs.image.rootfs.v1",
>       "annotations": {
>         "org.opencontaine= rs.image.ref.name": "first_try"
>       }
>     }
>   ],
>   "annotations": {}
> }
> ```
>
> I will describe how to build a puzzlefs image in the `Setup` section, = at
> step 5.
>
> # Limitations
> One limitation is that the puzzlefs driver doesn't implement any looku= p
> functionality and instead it inserts every directory entry into the > dcache during init (see the `DCACHE_BASED` constant). This is similar = to
> how the sample `rust_fs` driver works, but the goal is to implement > proper lookup functions.  However, more filesystem abstractions n= eed to
> be implemented before this can be achieved.
>
> # Upstreaming steps
> Before the puzzlefs driver can be upstreamed, the following need to be=
> merged:
> * Wedson's filesystem abstractions [3]
> * the necessary third-party crates [4] (with the preliminary discussio= n
> about whether this is desirable)
>
> # Setup
> My setup is based on Wedson's tutorial [8]. Next, I will describe the<= br> > necessary steps to build an initrd and run a custom kernel under qemu.=
>
> 1. Get the linux rust-next branch [9] and apply this patchset
>
> 2. Follow the rust quickstart guide [10]
>
> 3. configure and build the kernel
> ```
> $ make LLVM=3D1 allnoconfig qemu-busybox-min.config rust.config
> $ make LLVM=3D1 -j$(nproc)
> ```
>
> 4. setup busybox
> ```
> git clone git://git.busybox.net/busybox
> cd busybox
> make menuconfig # enable 'Build static binary' config
> make
> make install
> ```
> This will create the `_install` directory with the rootfs inside it. >
> 5. create a home directory in the rootfs and copy a puzzlefs oci
> directory in home/puzzlefs_oci
> To create a puzzlefs oci directory:
> * download this custom puzzlefs repository [11] (it's custom because w= e
>   want to build an image without verity data)
> * run `make release`
> * create a simple filesystem structure with a few directories and file= s
>   (I've created one at ../test-puzzlefs/simple_rootfs)
> * build a puzzlefs oci image at
>   `~/work/busybox/_install/home/puzzlefs_oci` (replace this = path with
>   your busybox path) with the tag `first_try`:
> ```
> $ target/release/puzzlefs build --omit-verity \
> ../test-puzzlefs/simple_rootfs ~/work/busybox/_install/home/puzzlefs_o= ci \
> first_try
> ```
> * get first_try's image manifest from index.json (inside `puzzlefs_oci= `)
> ```
> $ cat index.json | jq . | grep digest
>       "digest": "sha256:2= d6602d678140540dc7e96de652a76a8b16e8aca190bae141297bcffdcae901b",
> ```
>
> 6. add the following 'init' script in the busybox rootfs (rootfs path<= br> > defaults to `./_install'):
> ```
> #!/bin/sh
> mount -t devtmpfs none /dev
> mkdir -p /proc
> mount -t proc none /proc
>
> ifconfig lo up
> udhcpc -i eth0
>
> mkdir /mnt
> mount -t puzzlefs -o oci_root_dir=3D"/home/puzzlefs_oci" -o = \
> image_manifest=3D"2d6602d678140540dc7e96de652a76a8b16e8aca190bae1= 41297bcffdcae901b" \
> none /mnt
>
> setsid sh -c 'exec sh -l </dev/ttyS0 >/dev/ttyS0 2>&1' > ```
>
> Make sure to replace the `image_manifest` with your own digest. This > init script will be passed to rdinit in the kernel command line.
>
> 7. generate the initramfs
>
> Assuming busybox is in `~/work/busybox`:
> ```
> cd ~/work/busybox/_install && find . | cpio -H newc -o | gzip = > ../ramdisk.img
> ```
> This will generate a compressed ramdisk image in
> `~/work/busybox/ramdisk.img`.
>
> 8. run with qemu (this assumes the linux tree is at '../linux' and bus= ybox
> is at '../busybox'):
> ```
> qemu-system-x86_64 \
>     -accel kvm \
>     -cpu host \
>     -m 4G \
>     -initrd ../busybox/ramdisk.img \
>     -kernel ../linux/arch/x86/boot/bzImage \
>     -nographic \
>     -append 'console=3DttyS0 nokaslr debug rdinit= =3D/init' \
>     -nic user,model=3Drtl8139 \
>     -no-reboot
> ```
>
> 9. Check whether puzzlefs has been successfully mounted
> ```
> ~ # mount | grep puzzlefs
> none on /mnt type puzzlefs (rw,relatime)
> ~ # ls /mnt/
> dir-1  dir-2  dir-3  dir-4  file1  file2
> ```
>
>
> # Puzzlefs abstract
> Puzzlefs [1] is a container filesystem designed to address the
> limitations of the existing OCI format. The main goals of the project<= br> > are reduced duplication, reproducible image builds, direct mounting > support and memory safety guarantees, some inspired by the OCIv2 desig= n
> document [7].
>
> Reduced duplication is achieved using the content defined chunking
> algorithm FastCDC. This implementation allows chunks to be shared amon= g
> layers. Building a new layer starting from an existing one allows
> reusing most of the chunks.
>
> Another goal of the project is reproducible image builds, which is
> achieved by defining a canonical representation of the image format. >
> Direct mounting support is a key feature of puzzlefs and, together wit= h
> fs-verity, it provides data integrity. Currently, puzzlefs is
> implemented as a userspace filesystem (FUSE). A read-only kernel
> filesystem driver is underway.
>
> Lastly, memory safety is critical to puzzlefs, leading to the decision=
> to implement it in Rust. Another goal is to share the same code betwee= n
> user space and kernel space in order to provide one secure
> implementation.
>
>
> [1] https://github.com/a= nuvu/puzzlefs
> [2] https://gith= ub.com/wedsonaf/linux/tree/fs
> [3] ht= tps://github.com/Rust-for-Linux/linux/issues/1004
> [4] http= s://github.com/Rust-for-Linux/linux/pull/1007
> [5] https://= docs.rs/serde_cbor/latest/serde_cbor/
> [6] https://docs.rs/hex/0.4= .3/hex/
> [7] https://hac= kmd.io/@cyphar/ociv2-brainstorm
> [8] https://= www.youtube.com/watch?v=3DtPs1uRqOnlk
> [9] https://github.com/Rust-for-Linux/linux/tree/rust-next
> [10] https:/= /docs.kernel.org/rust/quick-start.html
> [11] https://github.com/ariel-miculas/puzzlefs/tree/support-no-verity-data > [12] https://archive.fosdem.org/2019/schedule/event/containers_atomfs/
>
> Ariel Miculas (58):
>   rust: kernel: add libraries required by the filesystem abs= tractions
>   rust: kernel: backport the delay module from the rust bran= ch
>   rust: kernel: add container_of macro
>   rust: kernel: add offset_of macro
>   drop: Add crate::pr_warn declaration
>   rust: kernel: rename from_kernel_errno to from_errno
>   rust: kernel: Rename from_pointer to from_foreing and into= _pointer to
>     into_foreign
>   rust: kernel: add count_paren_items macro, needed by defin= e_fs_params
>     macro
>   rust: helpers: add missing rust helper 'alloc_pages'
>   kernel: configs: add qemu-busybox-min.config
>   rust: kernel: format the rust code
>   samples: puzzlefs: add initial puzzlefs sample, copied fro= m rust_fs.rs
>   kernel: configs: enable rust samples in rust.config
>   Add SAMPLE_RUST_SERDE in rust.config
>   rust: kernel: fix compile errors after rebase to rust-next=
>   rust: serde_cbor: import crate
>   rust: serde_cbor: add SPDX License Identifiers
>   rust: serde_cbor: add no_fp_fmt_parse support
>   rust: Kbuild: enable serde_cbor
>   samples: rust: add cbor serialize/deserialize example
>   rust: serde_cbor: add support for serde_cbor's from_slice = method by
>     using a custom alloc_kernel feature
>   rust: serde: add support for deserializing Vec with kernel= _alloc
>     feature
>   rust: file: Replace UnsafeCell with Opaque for File
>   rust: kernel: implement fmt::Debug for CString
>   samples: puzzlefs: rename RustFs to PuzzleFs
>   samples: puzzlefs: add basic deserializing support for the= puzzlefs
>     metadata
>   rust: file: present the filesystem context to the open fun= ction
>   rust: kernel: add an abstraction over vfsmount to allow cl= oning a new
>     private mount
>   rust: file: add from_path, from_path_in_root_mnt and read_= with_offset
>     methods to File
>   samples: puzzlefs: pass the Vfsmount structure from open t= o read and
>     return the contents of the data file inside /h= ome/puzzlefs_oci
>   rust: file: move from_path, from_path_in_root_mnt and read= _with_offset
>     methods to a RegularFile newtype
>   rust: file: ensure RegularFile can only create regular fil= es
>   rust: file: add get_pos method to RegularFile
>   rust: file: add methods read_to_end, get_file_size and upd= ate_pos to
>     RegularFile
>   rust: file: define a minimal Read trait and implement it f= or
>     RegularFile
>   samples: puzzlefs: add cbor_get_array_size method
>   samples: puzzlefs: add KernelError to WireFormatError and = implement
>     From conversion
>   samples: puzzlefs: implement new for MetadataBlob
>   samples: puzzlefs: build puzzlefs into the kernel, thus av= oiding the
>     need to export rust symbols
>   rust: alloc: add try_clone for Vec<T>
>   rust: alloc: add from_iter_fallible for Vec<T>
>   samples: puzzlefs: implement to_errno and from_errno for >     WireFormatError
>   samples: puzzlefs: add TryReserveError (and from conversio= n) to
>     WireFormatError
>   samples: puzzlefs: add higher level inode related function= ality
>   samples: puzzlefs: populate the directory entries with the= inodes from
>     the puzzlefs metadata file
>   rust: hex: import crate
>   rust: hex: add SPDX license identifiers
>   rust: Kbuild: enable `hex`
>   rust: hex: implement FromHex trait and hex::decode using a= custom
>     kernel_alloc feature
>   rust: hex: add encode_hex_iter and encode_hex_upper_iter m= ethods
>   rust: puzzlefs: add HexError to WireFormatError and implem= ent the From
>     conversion
>   rust: puzzlefs: display the error value for
>     WireFormatError::KernelError
>   samples: puzzlefs: add Rootfs and Digest structs to types.= rs
>   samples: puzzlefs: implement the conversion from WireForma= tError to
>     kernel::error::Error
>   rust: puzzlefs: read the puzzlefs image manifest instead o= f an
>     individual metadata layer
>   rust: puzzlefs: rename PuzzleFs to PuzzleFsModule to avoid= confusion
>     with the PuzzleFS struct
>   rust: puzzlefs: add support for reading files
>   rust: puzzlefs: add oci_root_dir and image_manifest filesy= stem
>     parameters
>
> Miguel Ojeda (15):
>   rust: proc-macro2: import crate
>   rust: proc-macro2: add SPDX License Identifiers
>   rust: proc-macro2: remove `unicode_ident` dependency
>   rust: quote: import crate
>   rust: quote: add SPDX License Identifiers
>   rust: syn: import crate
>   rust: syn: add SPDX License Identifiers
>   rust: syn: remove `unicode-ident` dependency
>   rust: serde: import crate
>   rust: serde: add `no_fp_fmt_parse` support
>   rust: serde: add SPDX License Identifiers
>   rust: serde_derive: import crate
>   rust: serde_derive: add SPDX License Identifiers
>   rust: Kbuild: enable `proc-macro2`, `quote`, `syn`, `serde= ` and
>     `serde_derive`
>   rust: test `serde` support
>
> Wedson Almeida Filho (7):
>   rust: add definitions for ref-counted inodes and dentries<= br> >   rust: add ability to register a file system
>   rust: define fs context
>   rust: add support for file system parameters
>   rust: allow fs driver to initialise new superblocks
>   rust: add `module_fs` macro
>   WIP: rust: allow fs to be populated
>
>  Makefile         &n= bsp;            = ;            | =   14 +-
>  arch/x86/configs/qemu-busybox-min.config  |   11 = +
>  kernel/configs/qemu-busybox-min.config    | =   56 +
>  kernel/configs/rust.config      &n= bsp;         |   11 +
>  rust/.gitignore        &= nbsp;           &nbs= p;      |    1 +
>  rust/Makefile        &nb= sp;            =         |  232 +-
>  rust/alloc/vec/mod.rs       &= nbsp;           &nbs= p; |   48 +
>  rust/bindings/bindings_helper.h     &nb= sp;     |   14 +
>  rust/bindings/lib.rs       &n= bsp;            = ;  |    5 +
>  rust/helpers.c        &n= bsp;            = ;       |   76 +
>  rust/hex/error.rs        = ;            &n= bsp;    |   78 +
>  rust/hex/lib.rs        &= nbsp;           &nbs= p;      |  506 +++
>  rust/hex/serde.rs        = ;            &n= bsp;    |  104 +
>  rust/kernel/cred.rs       &nb= sp;            =    |   46 +
>  rust/kernel/delay.rs       &n= bsp;            = ;  |  104 +
>  rust/kernel/driver.rs       &= nbsp;           &nbs= p; |   28 +
>  rust/kernel/error.rs       &n= bsp;            = ;  |   52 +-
>  rust/kernel/file.rs       &nb= sp;            =    | 1117 ++++++
>  rust/kernel/fs.rs        = ;            &n= bsp;    | 1478 ++++++++
>  rust/kernel/fs/param.rs       = ;            | = 558 +++
>  rust/kernel/io_buffer.rs      &nbs= p;           |  153 = +
>  rust/kernel/iov_iter.rs       = ;            | =   81 +
>  rust/kernel/lib.rs       &nbs= p;            &= nbsp;   |   83 +
>  rust/kernel/mm.rs        = ;            &n= bsp;    |  149 +
>  rust/kernel/mount.rs       &n= bsp;            = ;  |   66 +
>  rust/kernel/pages.rs       &n= bsp;            = ;  |  144 +
>  rust/kernel/str.rs       &nbs= p;            &= nbsp;   |    6 +
>  rust/kernel/test_serde.rs      &nb= sp;          |   26 = +
>  rust/kernel/test_serde/de.rs      =         |  439 +++
>  rust/kernel/test_serde/error.rs     &nb= sp;     |   73 +
>  rust/kernel/test_serde/ser.rs      = ;       |  466 +++
>  rust/kernel/user_ptr.rs       = ;            | = 175 +
>  rust/proc-macro2/detection.rs      = ;       |   77 +
>  rust/proc-macro2/fallback.rs      =         | 1004 ++++++
>  rust/proc-macro2/lib.rs       = ;            | 1341 = ++++++++
>  rust/proc-macro2/marker.rs      &n= bsp;         |   20 +
>  rust/proc-macro2/parse.rs      &nb= sp;          |  874 +++++=
>  rust/proc-macro2/rcvec.rs      &nb= sp;          |  144 +
>  rust/proc-macro2/wrapper.rs      &= nbsp;        |  996 ++++++
>  rust/quote/ext.rs        = ;            &n= bsp;    |  112 +
>  rust/quote/format.rs       &n= bsp;            = ;  |  170 +
>  rust/quote/ident_fragment.rs      =         |   88 +
>  rust/quote/lib.rs        = ;            &n= bsp;    | 1436 ++++++++
>  rust/quote/runtime.rs       &= nbsp;           &nbs= p; |  440 +++
>  rust/quote/spanned.rs       &= nbsp;           &nbs= p; |   45 +
>  rust/quote/to_tokens.rs       = ;            | = 211 ++
>  rust/serde/de/format.rs       = ;            | =   32 +
>  rust/serde/de/ignored_any.rs      =         |  246 ++
>  rust/serde/de/impls.rs       =              | = 2755 +++++++++++++++
>  rust/serde/de/mod.rs       &n= bsp;            = ;  | 2313 +++++++++++++
>  rust/serde/de/seed.rs       &= nbsp;           &nbs= p; |   21 +
>  rust/serde/de/utf8.rs       &= nbsp;           &nbs= p; |   48 +
>  rust/serde/de/value.rs       =              | = 1718 ++++++++++
>  rust/serde/integer128.rs      &nbs= p;           |  = ; 84 +
>  rust/serde/lib.rs        = ;            &n= bsp;    |  351 ++
>  rust/serde/macros.rs       &n= bsp;            = ;  |  238 ++
>  rust/serde/private/de.rs      &nbs= p;           | 2997 +++++= +++++++++++
>  rust/serde/private/doc.rs      &nb= sp;          |  161 +
>  rust/serde/private/mod.rs      &nb= sp;          |   52 = +
>  rust/serde/private/ser.rs      &nb= sp;          | 1316 +++++++ >  rust/serde/private/size_hint.rs     &nb= sp;     |   23 +
>  rust/serde/ser/fmt.rs       &= nbsp;           &nbs= p; |  180 +
>  rust/serde/ser/impls.rs       = ;            | = 987 ++++++
>  rust/serde/ser/impossible.rs      =         |  218 ++
>  rust/serde/ser/mod.rs       &= nbsp;           &nbs= p; | 1992 +++++++++++
>  rust/serde/std_error.rs       = ;            | =   50 +
>  rust/serde_cbor/de.rs       &= nbsp;           &nbs= p; | 1370 ++++++++
>  rust/serde_cbor/error.rs      &nbs= p;           |  320 = ++
>  rust/serde_cbor/lib.rs       =              |&= nbsp; 371 ++
>  rust/serde_cbor/read.rs       = ;            | = 647 ++++
>  rust/serde_cbor/ser.rs       =              |&= nbsp; 748 ++++
>  rust/serde_cbor/tags.rs       = ;            | = 224 ++
>  rust/serde_cbor/value/de.rs      &= nbsp;        |  168 +
>  rust/serde_cbor/value/mod.rs      =         |  158 +
>  rust/serde_cbor/value/ser.rs      =         |  447 +++
>  rust/serde_cbor/write.rs      &nbs= p;           |  177 = +
>  rust/serde_derive/bound.rs      &n= bsp;         |  408 +++
>  rust/serde_derive/de.rs       = ;            | 3148 = +++++++++++++++++
>  rust/serde_derive/dummy.rs      &n= bsp;         |   46 +
>  rust/serde_derive/fragment.rs      = ;       |   76 +
>  rust/serde_derive/internals/ast.rs     =    |  204 ++
>  rust/serde_derive/internals/attr.rs     = ;  | 1908 +++++++++++
>  rust/serde_derive/internals/case.rs     = ;  |  199 ++
>  rust/serde_derive/internals/check.rs    &nbs= p; |  445 +++
>  rust/serde_derive/internals/ctxt.rs     = ;  |   64 +
>  rust/serde_derive/internals/mod.rs     =    |   30 +
>  rust/serde_derive/internals/receiver.rs   |  287 = ++
>  rust/serde_derive/internals/respan.rs     |&= nbsp;  18 +
>  rust/serde_derive/internals/symbol.rs     |&= nbsp;  71 +
>  rust/serde_derive/lib.rs      &nbs= p;           |  112 = +
>  rust/serde_derive/pretend.rs      =         |  203 ++
>  rust/serde_derive/ser.rs      &nbs= p;           | 1342 +++++= +++
>  rust/serde_derive/this.rs      &nb= sp;          |   34 = +
>  rust/serde_derive/try.rs      &nbs= p;           |  = ; 26 +
>  rust/syn/attr.rs        =             &nb= sp;     |  664 ++++
>  rust/syn/await.rs        = ;            &n= bsp;    |    4 +
>  rust/syn/bigint.rs       &nbs= p;            &= nbsp;   |   68 +
>  rust/syn/buffer.rs       &nbs= p;            &= nbsp;   |  400 +++
>  rust/syn/custom_keyword.rs      &n= bsp;         |  255 ++
>  rust/syn/custom_punctuation.rs     &nbs= p;      |  302 ++
>  rust/syn/data.rs        =             &nb= sp;     |  495 +++
>  rust/syn/derive.rs       &nbs= p;            &= nbsp;   |  276 ++
>  rust/syn/discouraged.rs       = ;            | = 196 ++
>  rust/syn/error.rs        = ;            &n= bsp;    |  430 +++
>  rust/syn/export.rs       &nbs= p;            &= nbsp;   |   41 +
>  rust/syn/expr.rs        =             &nb= sp;     | 3560 +++++++++++++++++++
>  rust/syn/ext.rs        &= nbsp;           &nbs= p;      |  141 +
>  rust/syn/file.rs        =             &nb= sp;     |  127 +
>  rust/syn/gen/clone.rs       &= nbsp;           &nbs= p; | 2243 ++++++++++++
>  rust/syn/gen/debug.rs       &= nbsp;           &nbs= p; | 3044 +++++++++++++++++
>  rust/syn/gen/eq.rs       &nbs= p;            &= nbsp;   | 2197 ++++++++++++
>  rust/syn/gen/fold.rs       &n= bsp;            = ;  | 3343 ++++++++++++++++++
>  rust/syn/gen/hash.rs       &n= bsp;            = ;  | 2871 ++++++++++++++++
>  rust/syn/gen/visit.rs       &= nbsp;           &nbs= p; | 3788 +++++++++++++++++++++
>  rust/syn/gen/visit_mut.rs      &nb= sp;          | 3788 ++++++++++= +++++++++++
>  rust/syn/gen_helper.rs       =              |&= nbsp; 156 +
>  rust/syn/generics.rs       &n= bsp;            = ;  | 1339 ++++++++
>  rust/syn/group.rs        = ;            &n= bsp;    |  284 ++
>  rust/syn/ident.rs        = ;            &n= bsp;    |  103 +
>  rust/syn/item.rs        =             &nb= sp;     | 3315 ++++++++++++++++++
>  rust/syn/lib.rs        &= nbsp;           &nbs= p;      |  985 ++++++
>  rust/syn/lifetime.rs       &n= bsp;            = ;  |  156 +
>  rust/syn/lit.rs        &= nbsp;           &nbs= p;      | 1602 +++++++++
>  rust/syn/lookahead.rs       &= nbsp;           &nbs= p; |  171 +
>  rust/syn/mac.rs        &= nbsp;           &nbs= p;      |  221 ++
>  rust/syn/macros.rs       &nbs= p;            &= nbsp;   |  179 +
>  rust/syn/op.rs        &n= bsp;            = ;       |  236 ++
>  rust/syn/parse.rs        = ;            &n= bsp;    | 1316 +++++++
>  rust/syn/parse_macro_input.rs      = ;       |  181 +
>  rust/syn/parse_quote.rs       = ;            | = 169 +
>  rust/syn/pat.rs        &= nbsp;           &nbs= p;      |  929 +++++
>  rust/syn/path.rs        =             &nb= sp;     |  856 +++++
>  rust/syn/print.rs        = ;            &n= bsp;    |   18 +
>  rust/syn/punctuated.rs       =              | = 1070 ++++++
>  rust/syn/reserved.rs       &n= bsp;            = ;  |   46 +
>  rust/syn/sealed.rs       &nbs= p;            &= nbsp;   |    6 +
>  rust/syn/span.rs        =             &nb= sp;     |   69 +
>  rust/syn/spanned.rs       &nb= sp;            =    |  116 +
>  rust/syn/stmt.rs        =             &nb= sp;     |  351 ++
>  rust/syn/thread.rs       &nbs= p;            &= nbsp;   |   43 +
>  rust/syn/token.rs        = ;            &n= bsp;    | 1015 ++++++
>  rust/syn/tt.rs        &n= bsp;            = ;       |  109 +
>  rust/syn/ty.rs        &n= bsp;            = ;       | 1288 +++++++
>  rust/syn/verbatim.rs       &n= bsp;            = ;  |   35 +
>  rust/syn/whitespace.rs       =              |&= nbsp;  67 +
>  samples/rust/Kconfig       &n= bsp;            = ;  |   28 +
>  samples/rust/Makefile       &= nbsp;           &nbs= p; |    3 +
>  samples/rust/local_data_format/de.rs    &nbs= p; |  422 +++
>  samples/rust/local_data_format/error.rs   |  = ; 73 +
>  samples/rust/local_data_format/ser.rs     |&= nbsp; 443 +++
>  samples/rust/puzzle.rs       =              |&= nbsp;   4 +
>  samples/rust/puzzle/error.rs      =         |   91 +
>  samples/rust/puzzle/inode.rs      =         |  150 +
>  samples/rust/puzzle/oci.rs      &n= bsp;         |   71 +
>  samples/rust/puzzle/types.rs      =         |  389 +++
>  samples/rust/puzzle/types/cbor_helpers.rs |   50 +
>  samples/rust/puzzlefs.rs      &nbs= p;           |  220 = ++
>  samples/rust/rust_fs.rs       = ;            | = 105 +
>  samples/rust/rust_serde.rs      &n= bsp;         |  125 +
>  scripts/Makefile.build       =              |&= nbsp;   4 +-
>  160 files changed, 89204 insertions(+), 29 deletions(-)
>  create mode 100644 arch/x86/configs/qemu-busybox-min.config
>  create mode 100644 kernel/configs/qemu-busybox-min.config
>  create mode 100644 rust/hex/error.rs
>  create mode 100644 rust/hex/lib.rs
>  create mode 100644 rust/hex/serde.rs
>  create mode 100644 rust/kernel/cred.rs
>  create mode 100644 rust/kernel/delay.rs
>  create mode 100644 rust/kernel/driver.rs
>  create mode 100644 rust/kernel/file.rs
>  create mode 100644 rust/kernel/fs.rs
>  create mode 100644 rust/kernel/fs/param.rs
>  create mode 100644 rust/kernel/io_buffer.rs
>  create mode 100644 rust/kernel/iov_iter.rs
>  create mode 100644 rust/kernel/mm.rs
>  create mode 100644 rust/kernel/mount.rs
>  create mode 100644 rust/kernel/pages.rs
>  create mode 100644 rust/kernel/test_serde.rs
>  create mode 100644 rust/kernel/test_serde/de.rs
>  create mode 100644 rust/kernel/test_serde/error.rs
>  create mode 100644 rust/kernel/test_serde/ser.rs
>  create mode 100644 rust/kernel/user_ptr.rs
>  create mode 100644 rust/proc-macro2/detection.rs
>  create mode 100644 rust/proc-macro2/fallback.rs
>  create mode 100644 rust/proc-macro2/lib.rs
>  create mode 100644 rust/proc-macro2/marker.rs
>  create mode 100644 rust/proc-macro2/parse.rs
>  create mode 100644 rust/proc-macro2/rcvec.rs
>  create mode 100644 rust/proc-macro2/wrapper.rs
>  create mode 100644 rust/quote/ext.rs
>  create mode 100644 rust/quote/format.rs
>  create mode 100644 rust/quote/ident_fragment.rs
>  create mode 100644 rust/quote/lib.rs
>  create mode 100644 rust/quote/runtime.rs
>  create mode 100644 rust/quote/spanned.rs
>  create mode 100644 rust/quote/to_tokens.rs
>  create mode 100644 rust/serde/de/format.rs
>  create mode 100644 rust/serde/de/ignored_any.rs
>  create mode 100644 rust/serde/de/impls.rs
>  create mode 100644 rust/serde/de/mod.rs
>  create mode 100644 rust/serde/de/seed.rs
>  create mode 100644 rust/serde/de/utf8.rs
>  create mode 100644 rust/serde/de/value.rs
>  create mode 100644 rust/serde/integer128.rs
>  create mode 100644 rust/serde/lib.rs
>  create mode 100644 rust/serde/macros.rs
>  create mode 100644 rust/serde/private/de.rs
>  create mode 100644 rust/serde/private/doc.rs
>  create mode 100644 rust/serde/private/mod.rs
>  create mode 100644 rust/serde/private/ser.rs
>  create mode 100644 rust/serde/private/size_hint.rs
>  create mode 100644 rust/serde/ser/fmt.rs
>  create mode 100644 rust/serde/ser/impls.rs
>  create mode 100644 rust/serde/ser/impossible.rs
>  create mode 100644 rust/serde/ser/mod.rs
>  create mode 100644 rust/serde/std_error.rs
>  create mode 100644 rust/serde_cbor/de.rs
>  create mode 100644 rust/serde_cbor/error.rs
>  create mode 100644 rust/serde_cbor/lib.rs
>  create mode 100644 rust/serde_cbor/read.rs
>  create mode 100644 rust/serde_cbor/ser.rs
>  create mode 100644 rust/serde_cbor/tags.rs
>  create mode 100644 rust/serde_cbor/value/de.rs
>  create mode 100644 rust/serde_cbor/value/mod.rs
>  create mode 100644 rust/serde_cbor/value/ser.rs
>  create mode 100644 rust/serde_cbor/write.rs
>  create mode 100644 rust/serde_derive/bound.rs
>  create mode 100644 rust/serde_derive/de.rs
>  create mode 100644 rust/serde_derive/dummy.rs
>  create mode 100644 rust/serde_derive/fragment.rs
>  create mode 100644 rust/serde_derive/internals/ast.rs
>  create mode 100644 rust/serde_derive/internals/attr.rs
>  create mode 100644 rust/serde_derive/internals/case.rs
>  create mode 100644 rust/serde_derive/internals/check.rs
>  create mode 100644 rust/serde_derive/internals/ctxt.rs
>  create mode 100644 rust/serde_derive/internals/mod.rs
>  create mode 100644 rust/serde_derive/internals/receiver.rs
>  create mode 100644 rust/serde_derive/internals/respan.rs
>  create mode 100644 rust/serde_derive/internals/symbol.rs
>  create mode 100644 rust/serde_derive/lib.rs
>  create mode 100644 rust/serde_derive/pretend.rs
>  create mode 100644 rust/serde_derive/ser.rs
>  create mode 100644 rust/serde_derive/this.rs
>  create mode 100644 rust/serde_derive/try.rs
>  create mode 100644 rust/syn/attr.rs
>  create mode 100644 rust/syn/await.rs
>  create mode 100644 rust/syn/bigint.rs
>  create mode 100644 rust/syn/buffer.rs
>  create mode 100644 rust/syn/custom_keyword.rs
>  create mode 100644 rust/syn/custom_punctuation.rs
>  create mode 100644 rust/syn/data.rs
>  create mode 100644 rust/syn/derive.rs
>  create mode 100644 rust/syn/discouraged.rs
>  create mode 100644 rust/syn/error.rs
>  create mode 100644 rust/syn/export.rs
>  create mode 100644 rust/syn/expr.rs
>  create mode 100644 rust/syn/ext.rs
>  create mode 100644 rust/syn/file.rs
>  create mode 100644 rust/syn/gen/clone.rs
>  create mode 100644 rust/syn/gen/debug.rs
>  create mode 100644 rust/syn/gen/eq.rs
>  create mode 100644 rust/syn/gen/fold.rs
>  create mode 100644 rust/syn/gen/hash.rs
>  create mode 100644 rust/syn/gen/visit.rs
>  create mode 100644 rust/syn/gen/visit_mut.rs
>  create mode 100644 rust/syn/gen_helper.rs
>  create mode 100644 rust/syn/generics.rs
>  create mode 100644 rust/syn/group.rs
>  create mode 100644 rust/syn/ident.rs
>  create mode 100644 rust/syn/item.rs
>  create mode 100644 rust/syn/lib.rs
>  create mode 100644 rust/syn/lifetime.rs
>  create mode 100644 rust/syn/lit.rs
>  create mode 100644 rust/syn/lookahead.rs
>  create mode 100644 rust/syn/mac.rs
>  create mode 100644 rust/syn/macros.rs
>  create mode 100644 rust/syn/op.rs
>  create mode 100644 rust/syn/parse.rs
>  create mode 100644 rust/syn/parse_macro_input.rs
>  create mode 100644 rust/syn/parse_quote.rs
>  create mode 100644 rust/syn/pat.rs
>  create mode 100644 rust/syn/path.rs
>  create mode 100644 rust/syn/print.rs
>  create mode 100644 rust/syn/punctuated.rs
>  create mode 100644 rust/syn/reserved.rs
>  create mode 100644 rust/syn/sealed.rs
>  create mode 100644 rust/syn/span.rs
>  create mode 100644 rust/syn/spanned.rs
>  create mode 100644 rust/syn/stmt.rs
>  create mode 100644 rust/syn/thread.rs
>  create mode 100644 rust/syn/token.rs
>  create mode 100644 rust/syn/tt.rs
>  create mode 100644 rust/syn/ty.rs
>  create mode 100644 rust/syn/verbatim.rs
>  create mode 100644 rust/syn/whitespace.rs
>  create mode 100644 samples/rust/local_data_format/de.rs
>  create mode 100644 samples/rust/local_data_format/error.rs
>  create mode 100644 samples/rust/local_data_format/ser.rs
>  create mode 100644 samples/rust/puzzle.rs
>  create mode 100644 samples/rust/puzzle/error.rs
>  create mode 100644 samples/rust/puzzle/inode.rs
>  create mode 100644 samples/rust/puzzle/oci.rs
>  create mode 100644 samples/rust/puzzle/types.rs
>  create mode 100644 samples/rust/puzzle/types/cbor_helpers.rs
>  create mode 100644 samples/rust/puzzlefs.rs
>  create mode 100644 samples/rust/rust_fs.rs
>  create mode 100644 samples/rust/rust_serde.rs
>
> --
> 2.40.1
>
--_000_CH0PR11MB529981313ED5A1F815350E41CD51ACH0PR11MB5299namp_--