From nobody Mon Feb 9 09:09:10 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+69035+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+69035+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1608155755; cv=none; d=zohomail.com; s=zohoarc; b=IWjlsZBVoLnzDGqGxo7kZ+3YNz9mA11hFh1cPsafRQWJ/FER1VRw6FmafJNlC3Wl3PMqybDGXvah3hAioYVbTcCJiUPZDELhW+OShyNXYrN9o7u3/iOiV80AFBMTszXUjQ12oY/SqPg0MT2oiHAeBWj2VWqYj6w6H1owe4hOEfY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1608155755; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=QaELhLK2gl77uQEagTwcQMUf60n20oJ/tPRROTU1H+0=; b=ADp/wH4cXEQG7uX9sUcgY8oqZ9Mf8+KdzY9dZ3AV9FS/AKDTX8fWuSMnsdI3iWiZwCJi9NIEvY5bSsyB/2EyQ0jdaISnYDZycGuffBa6GCUxKRUSO2DdGq92ndSSio7mOlD1ueuiAux/LmptHz4f5/4vIrtbc0/z3RrncjkXWPU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+69035+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1608155755809407.5251216177777; Wed, 16 Dec 2020 13:55:55 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id H2ELYY1788612xKKNtKCaymv; Wed, 16 Dec 2020 13:55:55 -0800 X-Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by mx.groups.io with SMTP id smtpd.web10.4272.1608155749890947673 for ; Wed, 16 Dec 2020 13:55:50 -0800 X-Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-258-qRFhBgrsMvus0oSNKbSkNQ-1; Wed, 16 Dec 2020 16:55:45 -0500 X-MC-Unique: qRFhBgrsMvus0oSNKbSkNQ-1 X-Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 32FDBE758; Wed, 16 Dec 2020 21:55:44 +0000 (UTC) X-Received: from lacos-laptop-7.usersys.redhat.com (ovpn-114-152.ams2.redhat.com [10.36.114.152]) by smtp.corp.redhat.com (Postfix) with ESMTP id 990781A49B; Wed, 16 Dec 2020 21:55:39 +0000 (UTC) From: "Laszlo Ersek" To: devel@edk2.groups.io, virtio-fs@redhat.com, lersek@redhat.com Cc: Ard Biesheuvel , Jordan Justen , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [edk2-devel] [edk2 PATCH 21/48] OvmfPkg/VirtioFsDxe: convert FUSE inode attributes to EFI_FILE_INFO Date: Wed, 16 Dec 2020 22:10:58 +0100 Message-Id: <20201216211125.19496-22-lersek@redhat.com> In-Reply-To: <20201216211125.19496-1-lersek@redhat.com> References: <20201216211125.19496-1-lersek@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,lersek@redhat.com X-Gm-Message-State: tpjqn9ItQ0NjgsYr5aaTmhfCx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1608155755; bh=QaELhLK2gl77uQEagTwcQMUf60n20oJ/tPRROTU1H+0=; h=Cc:Content-Type:Date:From:Reply-To:Subject:To; b=fAJkCJzfeYdot7PrOVfhOJU3QTOMmmxNl2MjHLEcq7sXoyGb11Zfy6TTz5gMANRvGUi fI+6z6BF0go9A8KEpGlA6Ou1KNL9LSFDh/4lbmPxtoHD9ywjMjFpoHsPyaZ5KFGPlt4A1 SUZ7vWZcy9nNzem8exZgWj0+TCMkrIT1fHs= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" Introduce the VirtioFsFuseAttrToEfiFileInfo() function, for converting FUSE inode attributes to EFI_FILE_INFO. The EpochToEfiTime() function from EmbeddedPkg's TimeBaseLib proves invaluable for converting the file access times. This is the first time we consume TimeBaseLib in OvmfPkg, so add the necessary lib class resolution. We need not modify any ArmVirtPkg DSC files: see commit af5fed90bfbf ("ArmPlatformPkg,ArmVirtPkg: delete redundant PL031 functions", 2017-05-10). Cc: Ard Biesheuvel Cc: Jordan Justen Cc: Philippe Mathieu-Daud=C3=A9 Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3097 Signed-off-by: Laszlo Ersek --- OvmfPkg/OvmfPkgIa32.dsc | 1 + OvmfPkg/OvmfPkgIa32X64.dsc | 1 + OvmfPkg/OvmfPkgX64.dsc | 1 + OvmfPkg/Include/IndustryStandard/VirtioFs.h | 3 + OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf | 2 + OvmfPkg/VirtioFsDxe/VirtioFsDxe.h | 7 ++ OvmfPkg/VirtioFsDxe/Helpers.c | 119 ++++++++++++++++++++ 7 files changed, 134 insertions(+) diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc index 4ff70674fb6e..26a013ec353e 100644 --- a/OvmfPkg/OvmfPkgIa32.dsc +++ b/OvmfPkg/OvmfPkgIa32.dsc @@ -120,16 +120,17 @@ [SkuIds] [LibraryClasses] PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf ResetSystemLib|OvmfPkg/Library/ResetSystemLib/BaseResetSystemLib.inf PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf BaseMemoryLib|MdePkg/Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf BaseLib|MdePkg/Library/BaseLib/BaseLib.inf SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf + TimeBaseLib|EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.inf BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.i= nf SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchroniza= tionLib.inf CpuLib|MdePkg/Library/BaseCpuLib/BaseCpuLib.inf PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibN= ull.inf PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf CacheMaintenanceLib|MdePkg/Library/BaseCacheMaintenanceLib/BaseCacheMain= tenanceLib.inf UefiDecompressLib|MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompres= sLib.inf UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServic= esLib.inf diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index d40a59183c79..10579fe46c5b 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -124,16 +124,17 @@ [SkuIds] [LibraryClasses] PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf ResetSystemLib|OvmfPkg/Library/ResetSystemLib/BaseResetSystemLib.inf PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf BaseMemoryLib|MdePkg/Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf BaseLib|MdePkg/Library/BaseLib/BaseLib.inf SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf + TimeBaseLib|EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.inf BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.i= nf SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchroniza= tionLib.inf CpuLib|MdePkg/Library/BaseCpuLib/BaseCpuLib.inf PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibN= ull.inf PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf CacheMaintenanceLib|MdePkg/Library/BaseCacheMaintenanceLib/BaseCacheMain= tenanceLib.inf UefiDecompressLib|MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompres= sLib.inf UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServic= esLib.inf diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index ec7886235acf..c9235e48ad62 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -124,16 +124,17 @@ [SkuIds] [LibraryClasses] PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf ResetSystemLib|OvmfPkg/Library/ResetSystemLib/BaseResetSystemLib.inf PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf BaseMemoryLib|MdePkg/Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf BaseLib|MdePkg/Library/BaseLib/BaseLib.inf SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf + TimeBaseLib|EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.inf BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.i= nf SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchroniza= tionLib.inf CpuLib|MdePkg/Library/BaseCpuLib/BaseCpuLib.inf PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibN= ull.inf PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf CacheMaintenanceLib|MdePkg/Library/BaseCacheMaintenanceLib/BaseCacheMain= tenanceLib.inf UefiDecompressLib|MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompres= sLib.inf UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServic= esLib.inf diff --git a/OvmfPkg/Include/IndustryStandard/VirtioFs.h b/OvmfPkg/Include/= IndustryStandard/VirtioFs.h index 63aced229e9b..5d1d990a2d83 100644 --- a/OvmfPkg/Include/IndustryStandard/VirtioFs.h +++ b/OvmfPkg/Include/IndustryStandard/VirtioFs.h @@ -79,16 +79,19 @@ typedef struct { // // The inode number of the root directory. // #define VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID 1 =20 // // File mode bitmasks. // +#define VIRTIO_FS_FUSE_MODE_TYPE_MASK 0170000u +#define VIRTIO_FS_FUSE_MODE_TYPE_REG 0100000u +#define VIRTIO_FS_FUSE_MODE_TYPE_DIR 0040000u #define VIRTIO_FS_FUSE_MODE_PERM_RWXU 0000700u #define VIRTIO_FS_FUSE_MODE_PERM_RUSR 0000400u #define VIRTIO_FS_FUSE_MODE_PERM_WUSR 0000200u #define VIRTIO_FS_FUSE_MODE_PERM_RWXG 0000070u #define VIRTIO_FS_FUSE_MODE_PERM_RGRP 0000040u #define VIRTIO_FS_FUSE_MODE_PERM_WGRP 0000020u #define VIRTIO_FS_FUSE_MODE_PERM_RWXO 0000007u #define VIRTIO_FS_FUSE_MODE_PERM_ROTH 0000004u diff --git a/OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf b/OvmfPkg/VirtioFsDxe/Virt= ioFsDxe.inf index b942baa4a772..7d7272188465 100644 --- a/OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf +++ b/OvmfPkg/VirtioFsDxe/VirtioFsDxe.inf @@ -72,16 +72,17 @@ [Defines] INF_VERSION =3D 1.29 BASE_NAME =3D VirtioFsDxe FILE_GUID =3D 7BD9DDF7-8B83-488E-AEC9-24C786= 10289C MODULE_TYPE =3D UEFI_DRIVER ENTRY_POINT =3D VirtioFsEntryPoint =20 [Packages] + EmbeddedPkg/EmbeddedPkg.dec MdePkg/MdePkg.dec OvmfPkg/OvmfPkg.dec =20 [Sources] DriverBinding.c FuseFlush.c FuseForget.c FuseFsync.c @@ -105,16 +106,17 @@ [Sources] SimpleFsWrite.c VirtioFsDxe.h =20 [LibraryClasses] BaseLib BaseMemoryLib DebugLib MemoryAllocationLib + TimeBaseLib UefiBootServicesTableLib UefiDriverEntryPoint VirtioLib =20 [Protocols] gEfiComponentName2ProtocolGuid ## PRODUCES gEfiDriverBindingProtocolGuid ## PRODUCES gEfiSimpleFileSystemProtocolGuid ## BY_START diff --git a/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h b/OvmfPkg/VirtioFsDxe/Virtio= FsDxe.h index 795cf4ee5d7d..6cc5257bab40 100644 --- a/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h +++ b/OvmfPkg/VirtioFsDxe/VirtioFsDxe.h @@ -6,16 +6,17 @@ =20 SPDX-License-Identifier: BSD-2-Clause-Patent **/ =20 #ifndef VIRTIO_FS_DXE_H_ #define VIRTIO_FS_DXE_H_ =20 #include // SIGNATURE_64() +#include // EFI_FILE_INFO #include // VIRTIO_FS_TAG_BYTES #include // CR() #include // EFI_SIMPLE_FILE_SYSTEM_PROTOCOL #include // VIRTIO_DEVICE_PROTOCOL #include // EFI_EVENT =20 #define VIRTIO_FS_SIG SIGNATURE_64 ('V', 'I', 'R', 'T', 'I', 'O', 'F', 'S') =20 @@ -220,16 +221,22 @@ VirtioFsErrnoToEfiStatus ( EFI_STATUS VirtioFsAppendPath ( IN CHAR8 *LhsPath8, IN CHAR16 *RhsPath16, OUT CHAR8 **ResultPath8, OUT BOOLEAN *RootEscape ); =20 +EFI_STATUS +VirtioFsFuseAttrToEfiFileInfo ( + IN VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE *FuseAttr, + OUT EFI_FILE_INFO *FileInfo + ); + // // Wrapper functions for FUSE commands (primitives). // =20 EFI_STATUS VirtioFsFuseForget ( IN OUT VIRTIO_FS *VirtioFs, IN UINT64 NodeId diff --git a/OvmfPkg/VirtioFsDxe/Helpers.c b/OvmfPkg/VirtioFsDxe/Helpers.c index 4a7b59332ca9..fa656bb535b8 100644 --- a/OvmfPkg/VirtioFsDxe/Helpers.c +++ b/OvmfPkg/VirtioFsDxe/Helpers.c @@ -4,16 +4,17 @@ Copyright (C) 2020, Red Hat, Inc. =20 SPDX-License-Identifier: BSD-2-Clause-Patent **/ =20 #include // StrLen() #include // CopyMem() #include // AllocatePool() +#include // EpochToEfiTime() #include // Virtio10WriteFeatures() =20 #include "VirtioFsDxe.h" =20 /** Read the Virtio Filesystem device configuration structure in full. =20 @param[in] Virtio The Virtio protocol underlying the VIRTIO_FS object. @@ -1584,8 +1585,126 @@ VirtioFsAppendPath ( if (RhsPath8[0] !=3D '/') { FreePool (BufferToSanitize); } =20 FreeRhsPath8: FreePool (RhsPath8); return Status; } + +/** + Convert select fields of a VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE object to + corresponding fields in EFI_FILE_INFO. + + @param[in] FuseAttr The VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE object to + convert the relevant fields from. + + @param[out] FileInfo The EFI_FILE_INFO structure to modify. Importantly= , the + FileInfo->Size and FileInfo->FileName fields are n= ot + overwritten. + + @retval EFI_SUCCESS Conversion successful. + + @retval EFI_UNSUPPORTED The allocated size of the file is inexpressible= in + EFI_FILE_INFO. + + @retval EFI_UNSUPPORTED One of the file access times is inexpressible in + EFI_FILE_INFO. + + @retval EFI_UNSUPPORTED The file type is inexpressible in EFI_FILE_INFO. + + @retval EFI_UNSUPPORTED The file is a regular file that has multiple na= mes + on the host side (i.e., its hard link count is + greater than one). +**/ +EFI_STATUS +VirtioFsFuseAttrToEfiFileInfo ( + IN VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE *FuseAttr, + OUT EFI_FILE_INFO *FileInfo + ) +{ + UINT64 EpochTime[3]; + EFI_TIME *ConvertedTime[ARRAY_SIZE (EpochTime)]; + UINTN Idx; + + FileInfo->FileSize =3D FuseAttr->Size; + + // + // The unit for FuseAttr->Blocks is 512B. + // + if (FuseAttr->Blocks >=3D BIT55) { + return EFI_UNSUPPORTED; + } + FileInfo->PhysicalSize =3D LShiftU64 (FuseAttr->Blocks, 9); + + // + // Convert the timestamps. File creation time is not tracked by the Virt= io + // Filesystem device, so set FileInfo->CreateTime from FuseAttr->Mtime as + // well. + // + EpochTime[0] =3D FuseAttr->Mtime; + EpochTime[1] =3D FuseAttr->Atime; + EpochTime[2] =3D FuseAttr->Mtime; + ConvertedTime[0] =3D &FileInfo->CreateTime; + ConvertedTime[1] =3D &FileInfo->LastAccessTime; + ConvertedTime[2] =3D &FileInfo->ModificationTime; + + for (Idx =3D 0; Idx < ARRAY_SIZE (EpochTime); Idx++) { + // + // EpochToEfiTime() takes a UINTN for seconds. + // + if (EpochTime[Idx] > MAX_UINTN) { + return EFI_UNSUPPORTED; + } + // + // Set the following fields in the converted time: Year, Month, Day, H= our, + // Minute, Second, Nanosecond. + // + EpochToEfiTime ((UINTN)EpochTime[Idx], ConvertedTime[Idx]); + // + // The times are all expressed in UTC. Consequently, they are not affe= cted + // by daylight saving. + // + ConvertedTime[Idx]->TimeZone =3D 0; + ConvertedTime[Idx]->Daylight =3D 0; + // + // Clear the padding fields. + // + ConvertedTime[Idx]->Pad1 =3D 0; + ConvertedTime[Idx]->Pad2 =3D 0; + } + + // + // Set the attributes. + // + switch (FuseAttr->Mode & VIRTIO_FS_FUSE_MODE_TYPE_MASK) { + case VIRTIO_FS_FUSE_MODE_TYPE_DIR: + FileInfo->Attribute =3D EFI_FILE_DIRECTORY; + break; + case VIRTIO_FS_FUSE_MODE_TYPE_REG: + FileInfo->Attribute =3D 0; + break; + default: + // + // Other file types are not supported. + // + return EFI_UNSUPPORTED; + } + // + // Report the regular file or directory as read-only if all classes lack + // write permission. + // + if ((FuseAttr->Mode & (VIRTIO_FS_FUSE_MODE_PERM_WUSR | + VIRTIO_FS_FUSE_MODE_PERM_WGRP | + VIRTIO_FS_FUSE_MODE_PERM_WOTH)) =3D=3D 0) { + FileInfo->Attribute |=3D EFI_FILE_READ_ONLY; + } + + // + // A hard link count greater than 1 is not supported for regular files. + // + if ((FileInfo->Attribute & EFI_FILE_DIRECTORY) =3D=3D 0 && FuseAttr->Nli= nk > 1) { + return EFI_UNSUPPORTED; + } + + return EFI_SUCCESS; +} --=20 2.19.1.3.g30247aa5d201 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#69035): https://edk2.groups.io/g/devel/message/69035 Mute This Topic: https://groups.io/mt/79023450/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-