From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ua0-x22a.google.com (mail-ua0-x22a.google.com [IPv6:2607:f8b0:400c:c08::22a]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id EF8AC21E1B748 for ; Thu, 21 Sep 2017 07:13:59 -0700 (PDT) Received: by mail-ua0-x22a.google.com with SMTP id g34so3668423uah.7 for ; Thu, 21 Sep 2017 07:17:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=h1FHzvJgEfvr8mCoGJIy6VMgZIVfDEllGc/6MfJ/vb0=; b=IjLkC91IncixuiOFJRw/NtWsa294rbQUKd5yl8cx6WQnaFV5+0z1MLKQLCnly+rOOB UY3SY8uXuloaWYjPUk2McENLCy+uBAnVPwkvdnqCkZhswCtn1sgYDPYz9VVGvZzPO6EE xhfI46EfCRjgEK40PNE/Go/Oac+7y4GFQnIi44gMLyrT4Rx+utzE+FIi55Sbt+SaSbWc EGpoPrkgXNSSR+X2PLyhcaVmJqoNujF8wSkcTFnWKTPGvnhpRNe/k21XsxmkwmfCMeP7 wHEC5wI3nxtfhqdMdBK/VcdJmseIClMxK7zcXjq6ZqZdQJTb2gCNBbUvo+4nB+YN5etF Qn7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=h1FHzvJgEfvr8mCoGJIy6VMgZIVfDEllGc/6MfJ/vb0=; b=C+sVmVmmnzeA6vbrIKZFYoDqbwnotXAcCZ+4yuy9vD0N2x+Xg2rbQjonHq7X4vNgRo ifqaFjNyKR2iMMiadLLFuGlnPmctmDFD9Mco6jeO8Rl76pfAE2srXctzF/ApRe49MQWr eMBebmwmb4pW+653zAdpiEm+6Q2H2kUq3tQrgXhTqLP9Z8OVQCikBbUuQrVVfq32lCBq zWFp7Fgi7HKPpmJ31BjxNRCpMqOFLr8pR57R8BZXPi4sp3EBBkjRmFHyI7yu07VPjhtN cru08ly33TyPZmGuBdDo1PubEFipW72WvOycI8w8eqUvos55hVFC8qB2jAHpc59xUKpR 0RLQ== X-Gm-Message-State: AHPjjUifg7pt3v/a0g3e+tAbjWkFPc+l4aoCDGD7bRVu7qRq6/KE6QVJ fYJzo2KwxiXNBrgfAtZvGqGmGAuwSXpscqFCS+M= X-Google-Smtp-Source: AOwi7QBsMY2PpoAvbuO08GxDzUxl7a4SwS4YT+nKjgp+eh0XqQmlwz9yZhhBu6lyhcT78/QPpPZHbYRqDGGNcNTnsRU= X-Received: by 10.176.89.168 with SMTP id g37mr2123634uad.53.1506003425366; Thu, 21 Sep 2017 07:17:05 -0700 (PDT) MIME-Version: 1.0 Received: by 10.176.79.47 with HTTP; Thu, 21 Sep 2017 07:16:34 -0700 (PDT) In-Reply-To: <7CD2E165-74AE-4E76-A686-BA8CE17720DE@zytor.com> References: <33171F84-A619-43B3-B9A8-0EC2CA8BA110@zytor.com> <0C09AFA07DD0434D9E2A0C6AEB0483103B97756A@shsmsx102.ccr.corp.intel.com> <7CD2E165-74AE-4E76-A686-BA8CE17720DE@zytor.com> From: Paulo Alcantara Date: Thu, 21 Sep 2017 11:16:34 -0300 Message-ID: To: "Zeng, Star" , "Wu, Hao A" , "edk2-devel@lists.01.org" Cc: "Ni, Ruiyu" , Laszlo Ersek , "Dong, Eric" Subject: Re: [PATCH v3 2/2] MdeModulePkg/PartitionDxe: Fix creation of UDF logical partition X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 21 Sep 2017 14:14:00 -0000 Content-Type: text/plain; charset="UTF-8" On Thu, Sep 21, 2017 at 10:52 AM, Paulo Alcantara wrote: > > > On September 21, 2017 10:47:07 AM GMT-03:00, "Zeng, Star" wrote: >>Does it have functional impact? > > Nope. When Partition driver walks the partition detect routine table, it executes each routine and then checks for EFI_NO_MEDIA and EFI_MEDIA_CHANGED only. So, the child handle is installed and the EFI_NOT_FOUND is a no-op in that case. BTW, I performed a quick test with UdfDxe enabled and disabled in OVMF and the removal did not seem to break or change any behavior. Thanks! Paulo > > Thanks! > Paulo > >> >>Thanks, >>Star >>-----Original Message----- >>From: Paulo Alcantara [mailto:pcacjr@zytor.com] >>Sent: Thursday, September 21, 2017 9:29 PM >>To: Wu, Hao A ; edk2-devel@lists.01.org >>Cc: Ni, Ruiyu ; Laszlo Ersek ; >>Dong, Eric ; Zeng, Star >>Subject: RE: [edk2] [PATCH v3 2/2] MdeModulePkg/PartitionDxe: Fix >>creation of UDF logical partition >> >> >> >>On September 21, 2017 9:44:10 AM GMT-03:00, "Wu, Hao A" >> wrote: >>>One small comment, within function PartitionInstallUdfChildHandles(): >>> >>> ... >>> // >>> // Install partition child handle for UDF file system >>> // >>> Status = PartitionInstallChildHandle ( >>> ... >>> ); >>>if (!EFI_ERROR (Status)) { <----- Is this a typo? "if (EFI_ERROR >>>(Status)) {" >>> Status = EFI_NOT_FOUND; >>> } >> >>Yes, it is. Good catch! Could you please fix that for me by removing >>the if condition? Otherwise I can send a v4 later with that. >> >>Thanks! >>Paulo >> >>> >>> >>>Best Regards, >>>Hao Wu >>> >>> >>>> -----Original Message----- >>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf >>>Of Paulo >>>> Alcantara >>>> Sent: Thursday, September 21, 2017 2:16 AM >>>> To: edk2-devel@lists.01.org >>>> Cc: Ni, Ruiyu; Laszlo Ersek; Dong, Eric; Zeng, Star >>>> Subject: [edk2] [PATCH v3 2/2] MdeModulePkg/PartitionDxe: Fix >>>creation of >>>> UDF logical partition >>>> >>>> Do not reserve entire block device size for an UDF file system - >>>> instead, reserve the appropriate space (UDF logical volume space) >>for >>>> it. >>>> >>>> Additionally, only create a logical partition for UDF logical >>volumes >>>> that are currently supported by EDK2 UDF file system implementation. >>>For >>>> instance, an UDF volume with a single LVD and a single Physical >>(Type >>>1) >>>> Partition will be supported. >>>> >>>> Cc: Eric Dong >>>> Cc: Ruiyu Ni >>>> Cc: Star Zeng >>>> Cc: Laszlo Ersek >>>> Reported-by: Ruiyu Ni >>>> Contributed-under: TianoCore Contribution Agreement 1.1 >>>> Signed-off-by: Paulo Alcantara >>>> --- >>>> MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c | 363 >>>++++++++++-- >>>> MdeModulePkg/Universal/Disk/UdfDxe/File.c | 16 +- >>>> MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c | 627 >>>> ++++++++------------ >>>> MdeModulePkg/Universal/Disk/UdfDxe/Udf.c | 7 - >>>> MdeModulePkg/Universal/Disk/UdfDxe/Udf.h | 158 >>>++--- >>>> 5 files changed, 606 insertions(+), 565 deletions(-) >>>> >>>> diff --git a/MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c >>>> b/MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c >>>> index 609f56cef6..572ba7a81a 100644 >>>> --- a/MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c >>>> +++ b/MdeModulePkg/Universal/Disk/PartitionDxe/Udf.c >>>> @@ -64,11 +64,12 @@ FindAnchorVolumeDescriptorPointer ( >>>> OUT UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER *AnchorPoint >>>> ) >>>> { >>>> - EFI_STATUS Status; >>>> - UINT32 BlockSize; >>>> - EFI_LBA EndLBA; >>>> - EFI_LBA DescriptorLBAs[4]; >>>> - UINTN Index; >>>> + EFI_STATUS Status; >>>> + UINT32 BlockSize; >>>> + EFI_LBA EndLBA; >>>> + EFI_LBA DescriptorLBAs[4]; >>>> + UINTN Index; >>>> + UDF_DESCRIPTOR_TAG *DescriptorTag; >>>> >>>> BlockSize = BlockIo->Media->BlockSize; >>>> EndLBA = BlockIo->Media->LastBlock; @@ -88,10 +89,13 @@ >>>> FindAnchorVolumeDescriptorPointer ( >>>> if (EFI_ERROR (Status)) { >>>> return Status; >>>> } >>>> + >>>> + DescriptorTag = &AnchorPoint->DescriptorTag; >>>> + >>>> // >>>> // Check if read LBA has a valid AVDP descriptor. >>>> // >>>> - if (IS_AVDP (AnchorPoint)) { >>>> + if (DescriptorTag->TagIdentifier == >>>UdfAnchorVolumeDescriptorPointer) { >>>> return EFI_SUCCESS; >>>> } >>>> } >>>> @@ -102,23 +106,18 @@ FindAnchorVolumeDescriptorPointer ( } >>>> >>>> /** >>>> - Check if block device supports a valid UDF file system as >>>specified by OSTA >>>> - Universal Disk Format Specification 2.60. >>>> + Find UDF volume identifiers in a Volume Recognition Sequence. >>>> >>>> - @param[in] BlockIo BlockIo interface. >>>> - @param[in] DiskIo DiskIo interface. >>>> + @param[in] BlockIo BlockIo interface. >>>> + @param[in] DiskIo DiskIo interface. >>>> >>>> - @retval EFI_SUCCESS UDF file system found. >>>> - @retval EFI_UNSUPPORTED UDF file system not found. >>>> - @retval EFI_NO_MEDIA The device has no media. >>>> - @retval EFI_DEVICE_ERROR The device reported an error. >>>> - @retval EFI_VOLUME_CORRUPTED The file system structures are >>>corrupted. >>>> - @retval EFI_OUT_OF_RESOURCES The scan was not successful due to >>>lack of >>>> - resources. >>>> + @retval EFI_SUCCESS UDF volume identifiers were >>found. >>>> + @retval EFI_NOT_FOUND UDF volume identifiers were not >>>found. >>>> + @retval other Failed to perform disk I/O. >>>> >>>> **/ >>>> EFI_STATUS >>>> -SupportUdfFileSystem ( >>>> +FindUdfVolumeIdentifiers ( >>>> IN EFI_BLOCK_IO_PROTOCOL *BlockIo, >>>> IN EFI_DISK_IO_PROTOCOL *DiskIo >>>> ) >>>> @@ -128,7 +127,6 @@ SupportUdfFileSystem ( >>>> UINT64 EndDiskOffset; >>>> CDROM_VOLUME_DESCRIPTOR VolDescriptor; >>>> CDROM_VOLUME_DESCRIPTOR TerminatingVolDescriptor; >>>> - UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER AnchorPoint; >>>> >>>> ZeroMem ((VOID *)&TerminatingVolDescriptor, sizeof >>>> (CDROM_VOLUME_DESCRIPTOR)); >>>> >>>> @@ -167,7 +165,7 @@ SupportUdfFileSystem ( >>>> (CompareMem ((VOID *)&VolDescriptor, >>>> (VOID *)&TerminatingVolDescriptor, >>>> sizeof (CDROM_VOLUME_DESCRIPTOR)) == 0)) { >>>> - return EFI_UNSUPPORTED; >>>> + return EFI_NOT_FOUND; >>>> } >>>> } >>>> >>>> @@ -176,7 +174,7 @@ SupportUdfFileSystem ( >>>> // >>>> Offset += UDF_LOGICAL_SECTOR_SIZE; >>>> if (Offset >= EndDiskOffset) { >>>> - return EFI_UNSUPPORTED; >>>> + return EFI_NOT_FOUND; >>>> } >>>> >>>> Status = DiskIo->ReadDisk ( >>>> @@ -196,7 +194,7 @@ SupportUdfFileSystem ( >>>> (CompareMem ((VOID *)VolDescriptor.Unknown.Id, >>>> (VOID *)UDF_NSR3_IDENTIFIER, >>>> sizeof (VolDescriptor.Unknown.Id)) != 0)) { >>>> - return EFI_UNSUPPORTED; >>>> + return EFI_NOT_FOUND; >>>> } >>>> >>>> // >>>> @@ -204,7 +202,7 @@ SupportUdfFileSystem ( >>>> // >>>> Offset += UDF_LOGICAL_SECTOR_SIZE; >>>> if (Offset >= EndDiskOffset) { >>>> - return EFI_UNSUPPORTED; >>>> + return EFI_NOT_FOUND; >>>> } >>>> >>>> Status = DiskIo->ReadDisk ( >>>> @@ -221,15 +219,291 @@ SupportUdfFileSystem ( >>>> if (CompareMem ((VOID *)VolDescriptor.Unknown.Id, >>>> (VOID *)UDF_TEA_IDENTIFIER, >>>> sizeof (VolDescriptor.Unknown.Id)) != 0) { >>>> - return EFI_UNSUPPORTED; >>>> + return EFI_NOT_FOUND; >>>> + } >>>> + >>>> + return EFI_SUCCESS; >>>> +} >>>> + >>>> +/** >>>> + Check if Logical Volume Descriptor is supported by current EDK2 >>>UDF file >>>> + system implementation. >>>> + >>>> + @param[in] LogicalVolDesc Logical Volume Descriptor pointer. >>>> + >>>> + @retval TRUE Logical Volume Descriptor is >>>supported. >>>> + @retval FALSE Logical Volume Descriptor is not >>>supported. >>>> + >>>> +**/ >>>> +BOOLEAN >>>> +IsLogicalVolumeDescriptorSupported ( >>>> + UDF_LOGICAL_VOLUME_DESCRIPTOR *LogicalVolDesc >>>> + ) >>>> +{ >>>> + // >>>> + // Check for a valid UDF revision range >>>> + // >>>> + switch (UDF_LVD_REVISION (LogicalVolDesc)) { >>>> + case 0x0102: >>>> + case 0x0150: >>>> + case 0x0200: >>>> + case 0x0201: >>>> + case 0x0250: >>>> + case 0x0260: >>>> + break; >>>> + default: >>>> + return FALSE; >>>> + } >>>> + >>>> + // >>>> + // Check for a single Partition Map // if >>>> + (LogicalVolDesc->NumberOfPartitionMaps > 1) { >>>> + return FALSE; >>>> + } >>>> + // >>>> + // UDF 1.02 revision supports only Type 1 (Physical) partitions, >>>but >>>> + // let's check it any way. >>>> + // >>>> + // PartitionMap[0] -> type >>>> + // PartitionMap[1] -> length (in bytes) // if >>>> + (LogicalVolDesc->PartitionMaps[0] != 1 || >>>> + LogicalVolDesc->PartitionMaps[1] != 6) { >>>> + return FALSE; >>>> + } >>>> + >>>> + return TRUE; >>>> +} >>>> + >>>> +/** >>>> + Find UDF logical volume location and whether it is supported by >>>current EDK2 >>>> + UDF file system implementation. >>>> + >>>> + @param[in] BlockIo BlockIo interface. >>>> + @param[in] DiskIo DiskIo interface. >>>> + @param[in] AnchorPoint Anchor volume descriptor pointer. >>>> + @param[out] MainVdsStartBlock Main VDS starting block number. >>>> + @param[out] MainVdsEndBlock Main VDS ending block number. >>>> + >>>> + @retval EFI_SUCCESS UDF logical volume was found. >>>> + @retval EFI_VOLUME_CORRUPTED UDF file system structures are >>>> corrupted. >>>> + @retval EFI_UNSUPPORTED UDF logical volume is not >>>supported. >>>> + @retval other Failed to perform disk I/O. >>>> + >>>> +**/ >>>> +EFI_STATUS >>>> +FindLogicalVolumeLocation ( >>>> + IN EFI_BLOCK_IO_PROTOCOL *BlockIo, >>>> + IN EFI_DISK_IO_PROTOCOL *DiskIo, >>>> + IN UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER *AnchorPoint, >>>> + OUT UINT64 *MainVdsStartBlock, >>>> + OUT UINT64 *MainVdsEndBlock >>>> + ) >>>> +{ >>>> + EFI_STATUS Status; >>>> + UINT32 BlockSize; >>>> + EFI_LBA LastBlock; >>>> + UDF_EXTENT_AD *ExtentAd; >>>> + UINT64 SeqBlocksNum; >>>> + UINT64 SeqStartBlock; >>>> + UINT64 GuardMainVdsStartBlock; >>>> + VOID *Buffer; >>>> + UINT64 SeqEndBlock; >>>> + BOOLEAN StopSequence; >>>> + UINTN LvdsCount; >>>> + UDF_LOGICAL_VOLUME_DESCRIPTOR *LogicalVolDesc; >>>> + UDF_DESCRIPTOR_TAG *DescriptorTag; >>>> + >>>> + BlockSize = BlockIo->Media->BlockSize; LastBlock = >>>> + BlockIo->Media->LastBlock; ExtentAd = >>>> + &AnchorPoint->MainVolumeDescriptorSequenceExtent; >>>> + >>>> + // >>>> + // UDF 2.60, 2.2.3.1 struct MainVolumeDescriptorSequenceExtent >>>> + // >>>> + // The Main Volume Descriptor Sequence Extent shall have a >>minimum >>>length >>>> of >>>> + // 16 logical sectors. >>>> + // >>>> + // Also make sure it does not exceed maximum number of blocks in >>>the disk. >>>> + // >>>> + SeqBlocksNum = DivU64x32 ((UINT64)ExtentAd->ExtentLength, >>>BlockSize); >>>> + if (SeqBlocksNum < 16 || (EFI_LBA)SeqBlocksNum > LastBlock + 1) { >>>> + return EFI_VOLUME_CORRUPTED; >>>> + } >>>> + >>>> + // >>>> + // Check for valid Volume Descriptor Sequence starting block >>>number >>>> + // >>>> + SeqStartBlock = (UINT64)ExtentAd->ExtentLocation; if >>>> + (SeqStartBlock > LastBlock || >>>> + SeqStartBlock + SeqBlocksNum - 1 > LastBlock) { >>>> + return EFI_VOLUME_CORRUPTED; >>>> } >>>> >>>> + GuardMainVdsStartBlock = SeqStartBlock; >>>> + >>>> + // >>>> + // Allocate buffer for reading disk blocks // Buffer = >>>> + AllocateZeroPool ((UINTN)BlockSize); if (Buffer == NULL) { >>>> + return EFI_OUT_OF_RESOURCES; >>>> + } >>>> + >>>> + SeqEndBlock = SeqStartBlock + SeqBlocksNum; StopSequence = >>FALSE; >>>> + LvdsCount = 0; Status = EFI_VOLUME_CORRUPTED; // // Start Main >>>> + Volume Descriptor Sequence // for (; SeqStartBlock < SeqEndBlock >> >>>> + && !StopSequence; >>>SeqStartBlock++) { >>>> + // >>>> + // Read disk block >>>> + // >>>> + Status = BlockIo->ReadBlocks ( >>>> + BlockIo, >>>> + BlockIo->Media->MediaId, >>>> + SeqStartBlock, >>>> + BlockSize, >>>> + Buffer >>>> + ); >>>> + if (EFI_ERROR (Status)) { >>>> + goto Out_Free; >>>> + } >>>> + >>>> + DescriptorTag = Buffer; >>>> + >>>> + // >>>> + // ECMA 167, 8.4.1 Contents of a Volume Descriptor Sequence >>>> + // >>>> + // - A Volume Descriptor Sequence shall contain one or more >>>Primary >>>> Volume >>>> + // Descriptors. >>>> + // - A Volume Descriptor Sequence shall contain zero or more >>>> Implementation >>>> + // Use Volume Descriptors. >>>> + // - A Volume Descriptor Sequence shall contain zero or more >>>Partition >>>> + // Descriptors. >>>> + // - A Volume Descriptor Sequence shall contain zero or more >>>Logical >>>> Volume >>>> + // Descriptors. >>>> + // - A Volume Descriptor Sequence shall contain zero or more >>>Unallocated >>>> + // Space Descriptors. >>>> + // >>>> + switch (UDF_TAG_ID (DescriptorTag)) { >>>> + case UdfPrimaryVolumeDescriptor: >>>> + case UdfImplemenationUseVolumeDescriptor: >>>> + case UdfPartitionDescriptor: >>>> + case UdfUnallocatedSpaceDescriptor: >>>> + break; >>>> + >>>> + case UdfLogicalVolumeDescriptor: >>>> + LogicalVolDesc = Buffer; >>>> + >>>> + // >>>> + // Check for existence of a single LVD and whether it is >>>supported by >>>> + // current EDK2 UDF file system implementation. >>>> + // >>>> + if (++LvdsCount > 1 || >>>> + !IsLogicalVolumeDescriptorSupported (LogicalVolDesc)) { >>>> + Status = EFI_UNSUPPORTED; >>>> + StopSequence = TRUE; >>>> + } >>>> + >>>> + break; >>>> + >>>> + case UdfTerminatingDescriptor: >>>> + // >>>> + // Stop the sequence when we find a Terminating Descriptor >>>> + // (aka Unallocated Sector), se we don't have to walk all the >>>unallocated >>>> + // area unnecessarily. >>>> + // >>>> + StopSequence = TRUE; >>>> + break; >>>> + >>>> + default: >>>> + // >>>> + // An invalid Volume Descriptor has been found in the >>sequece. >>>Volume is >>>> + // corrupted. >>>> + // >>>> + Status = EFI_VOLUME_CORRUPTED; >>>> + goto Out_Free; >>>> + } >>>> + } >>>> + >>>> + // >>>> + // Check if LVD was found >>>> + // >>>> + if (!EFI_ERROR (Status) && LvdsCount == 1) { >>>> + *MainVdsStartBlock = GuardMainVdsStartBlock; >>>> + // >>>> + // We do not need to read either LVD or PD descriptors to know >>>the last >>>> + // valid block in the found UDF file system. It's already >>>LastBlock. >>>> + // >>>> + *MainVdsEndBlock = LastBlock; >>>> + >>>> + Status = EFI_SUCCESS; >>>> + } >>>> + >>>> +Out_Free: >>>> + // >>>> + // Free block read buffer >>>> + // >>>> + FreePool (Buffer); >>>> + >>>> + return Status; >>>> +} >>>> + >>>> +/** >>>> + Find a supported UDF file system in block device. >>>> + >>>> + @param[in] BlockIo BlockIo interface. >>>> + @param[in] DiskIo DiskIo interface. >>>> + @param[out] StartingLBA UDF file system starting LBA. >>>> + @param[out] EndingLBA UDF file system starting LBA. >>>> + >>>> + @retval EFI_SUCCESS UDF file system was found. >>>> + @retval other UDF file system was not found. >>>> + >>>> +**/ >>>> +EFI_STATUS >>>> +FindUdfFileSystem ( >>>> + IN EFI_BLOCK_IO_PROTOCOL *BlockIo, >>>> + IN EFI_DISK_IO_PROTOCOL *DiskIo, >>>> + OUT EFI_LBA *StartingLBA, >>>> + OUT EFI_LBA *EndingLBA >>>> + ) >>>> +{ >>>> + EFI_STATUS Status; >>>> + UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER AnchorPoint; >>>> + >>>> + // >>>> + // Find UDF volume identifiers >>>> + // >>>> + Status = FindUdfVolumeIdentifiers (BlockIo, DiskIo); if >>>> + (EFI_ERROR (Status)) { >>>> + return Status; >>>> + } >>>> + >>>> + // >>>> + // Find Anchor Volume Descriptor Pointer // >>>> Status = FindAnchorVolumeDescriptorPointer (BlockIo, DiskIo, >>>&AnchorPoint); >>>> if (EFI_ERROR (Status)) { >>>> - return EFI_UNSUPPORTED; >>>> + return Status; >>>> } >>>> >>>> - return EFI_SUCCESS; >>>> + // >>>> + // Find Logical Volume location >>>> + // >>>> + Status = FindLogicalVolumeLocation ( >>>> + BlockIo, >>>> + DiskIo, >>>> + &AnchorPoint, >>>> + (UINT64 *)StartingLBA, >>>> + (UINT64 *)EndingLBA >>>> + ); >>>> + >>>> + return Status; >>>> } >>>> >>>> /** >>>> @@ -263,9 +537,9 @@ PartitionInstallUdfChildHandles ( >>>> UINT32 RemainderByMediaBlockSize; >>>> EFI_STATUS Status; >>>> EFI_BLOCK_IO_MEDIA *Media; >>>> - EFI_DEVICE_PATH_PROTOCOL *DevicePathNode; >>>> - EFI_GUID *VendorDefinedGuid; >>>> EFI_PARTITION_INFO_PROTOCOL PartitionInfo; >>>> + EFI_LBA StartingLBA; >>>> + EFI_LBA EndingLBA; >>>> >>>> Media = BlockIo->Media; >>>> >>>> @@ -281,35 +555,10 @@ PartitionInstallUdfChildHandles ( >>>> return EFI_NOT_FOUND; >>>> } >>>> >>>> - DevicePathNode = DevicePath; >>>> - while (!IsDevicePathEnd (DevicePathNode)) { >>>> - // >>>> - // Do not allow checking for UDF file systems in CDROM "El >>>Torito" >>>> - // partitions, and skip duplicate installation of UDF file >>>system child >>>> - // nodes. >>>> - // >>>> - if (DevicePathType (DevicePathNode) == MEDIA_DEVICE_PATH) { >>>> - if (DevicePathSubType (DevicePathNode) == MEDIA_CDROM_DP) { >>>> - return EFI_NOT_FOUND; >>>> - } >>>> - if (DevicePathSubType (DevicePathNode) == MEDIA_VENDOR_DP) { >>>> - VendorDefinedGuid = (EFI_GUID *)((UINTN)DevicePathNode + >>>> - OFFSET_OF >>>(VENDOR_DEVICE_PATH, Guid)); >>>> - if (CompareGuid (VendorDefinedGuid, &gUdfDevPathGuid)) { >>>> - return EFI_NOT_FOUND; >>>> - } >>>> - } >>>> - } >>>> - // >>>> - // Try next device path node >>>> - // >>>> - DevicePathNode = NextDevicePathNode (DevicePathNode); >>>> - } >>>> - >>>> // >>>> - // Check if block device supports an UDF file system >>>> + // Search for an UDF file system on block device >>>> // >>>> - Status = SupportUdfFileSystem (BlockIo, DiskIo); >>>> + Status = FindUdfFileSystem (BlockIo, DiskIo, &StartingLBA, >>>&EndingLBA); >>>> if (EFI_ERROR (Status)) { >>>> return EFI_NOT_FOUND; >>>> } >>>> @@ -334,8 +583,8 @@ PartitionInstallUdfChildHandles ( >>>> DevicePath, >>>> (EFI_DEVICE_PATH_PROTOCOL *)&gUdfDevicePath, >>>> &PartitionInfo, >>>> - 0, >>>> - Media->LastBlock, >>>> + StartingLBA, >>>> + EndingLBA, >>>> Media->BlockSize >>>> ); >>>> if (!EFI_ERROR (Status)) { >>>> diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/File.c >>>> b/MdeModulePkg/Universal/Disk/UdfDxe/File.c >>>> index 625f2c5637..6f07bf2066 100644 >>>> --- a/MdeModulePkg/Universal/Disk/UdfDxe/File.c >>>> +++ b/MdeModulePkg/Universal/Disk/UdfDxe/File.c >>>> @@ -131,7 +131,6 @@ Error_Alloc_Priv_File_Data: >>>> CleanupFileInformation (&PrivFsData->Root); >>>> >>>> Error_Find_Root_Dir: >>>> - CleanupVolumeInformation (&PrivFsData->Volume); >>>> >>>> Error_Read_Udf_Volume: >>>> Error_Invalid_Params: >>>> @@ -429,7 +428,7 @@ UdfRead ( >>>> } >>>> ASSERT (NewFileEntryData != NULL); >>>> >>>> - if (IS_FE_SYMLINK (NewFileEntryData)) { >>>> + if (FE_ICB_FILE_TYPE (NewFileEntryData) == UdfFileEntrySymlink) >>>{ >>>> Status = ResolveSymlink ( >>>> BlockIo, >>>> DiskIo, >>>> @@ -529,7 +528,6 @@ UdfClose ( >>>> EFI_TPL OldTpl; >>>> EFI_STATUS Status; >>>> PRIVATE_UDF_FILE_DATA *PrivFileData; >>>> - PRIVATE_UDF_SIMPLE_FS_DATA *PrivFsData; >>>> >>>> OldTpl = gBS->RaiseTPL (TPL_CALLBACK); >>>> >>>> @@ -542,8 +540,6 @@ UdfClose ( >>>> >>>> PrivFileData = PRIVATE_UDF_FILE_DATA_FROM_THIS (This); >>>> >>>> - PrivFsData = PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (PrivFileData- >>>> >SimpleFs); >>>> - >>>> if (!PrivFileData->IsRootDirectory) { >>>> CleanupFileInformation (&PrivFileData->File); >>>> >>>> @@ -552,10 +548,6 @@ UdfClose ( >>>> } >>>> } >>>> >>>> - if (--PrivFsData->OpenFiles == 0) { >>>> - CleanupVolumeInformation (&PrivFsData->Volume); >>>> - } >>>> - >>>> FreePool ((VOID *)PrivFileData); >>>> >>>> Exit: >>>> @@ -652,7 +644,7 @@ UdfGetPosition ( >>>> // As per UEFI spec, if the file handle is a directory, then the >>>current file >>>> // position has no meaning and the operation is not supported. >>>> // >>>> - if (IS_FID_DIRECTORY_FILE >>>(&PrivFileData->File.FileIdentifierDesc)) { >>>> + if (IS_FID_DIRECTORY_FILE >>(PrivFileData->File.FileIdentifierDesc)) >>>{ >>>> return EFI_UNSUPPORTED; >>>> } >>>> >>>> @@ -788,7 +780,7 @@ UdfGetInfo ( >>>> } else if (CompareGuid (InformationType, >>&gEfiFileSystemInfoGuid)) >>>{ >>>> String = VolumeLabel; >>>> >>>> - FileSetDesc = PrivFsData->Volume.FileSetDescs[0]; >>>> + FileSetDesc = &PrivFsData->Volume.FileSetDesc; >>>> >>>> OstaCompressed = &FileSetDesc->LogicalVolumeIdentifier[0]; >>>> >>>> @@ -847,7 +839,7 @@ UdfGetInfo ( >>>> FileSystemInfo->Size = FileSystemInfoLength; >>>> FileSystemInfo->ReadOnly = TRUE; >>>> FileSystemInfo->BlockSize = >>>> - LV_BLOCK_SIZE (&PrivFsData->Volume, UDF_DEFAULT_LV_NUM); >>>> + PrivFsData->Volume.LogicalVolDesc.LogicalBlockSize; >>>> FileSystemInfo->VolumeSize = VolumeSize; >>>> FileSystemInfo->FreeSpace = FreeSpaceSize; >>>> >>>> diff --git >>>a/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c >>>> b/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c >>>> index 5df267761f..62d817989f 100644 >>>> --- a/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c >>>> +++ b/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c >>>> @@ -38,11 +38,12 @@ FindAnchorVolumeDescriptorPointer ( >>>> OUT UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER *AnchorPoint >>>> ) >>>> { >>>> - EFI_STATUS Status; >>>> - UINT32 BlockSize; >>>> - EFI_LBA EndLBA; >>>> - EFI_LBA DescriptorLBAs[4]; >>>> - UINTN Index; >>>> + EFI_STATUS Status; >>>> + UINT32 BlockSize; >>>> + EFI_LBA EndLBA; >>>> + EFI_LBA DescriptorLBAs[4]; >>>> + UINTN Index; >>>> + UDF_DESCRIPTOR_TAG *DescriptorTag; >>>> >>>> BlockSize = BlockIo->Media->BlockSize; >>>> EndLBA = BlockIo->Media->LastBlock; @@ -62,10 +63,13 @@ >>>> FindAnchorVolumeDescriptorPointer ( >>>> if (EFI_ERROR (Status)) { >>>> return Status; >>>> } >>>> + >>>> + DescriptorTag = &AnchorPoint->DescriptorTag; >>>> + >>>> // >>>> // Check if read LBA has a valid AVDP descriptor. >>>> // >>>> - if (IS_AVDP (AnchorPoint)) { >>>> + if (DescriptorTag->TagIdentifier == >>>UdfAnchorVolumeDescriptorPointer) { >>>> return EFI_SUCCESS; >>>> } >>>> } >>>> @@ -99,148 +103,98 @@ StartMainVolumeDescriptorSequence ( >>>> OUT UDF_VOLUME_INFO *Volume >>>> ) >>>> { >>>> - EFI_STATUS Status; >>>> - UINT32 BlockSize; >>>> - UDF_EXTENT_AD *ExtentAd; >>>> - UINT64 StartingLsn; >>>> - UINT64 EndingLsn; >>>> - VOID *Buffer; >>>> - UDF_LOGICAL_VOLUME_DESCRIPTOR *LogicalVolDesc; >>>> - UDF_PARTITION_DESCRIPTOR *PartitionDesc; >>>> - UINTN Index; >>>> - UINT32 LogicalBlockSize; >>>> + EFI_STATUS Status; >>>> + UINT32 BlockSize; >>>> + UDF_EXTENT_AD *ExtentAd; >>>> + EFI_LBA SeqStartBlock; >>>> + EFI_LBA SeqEndBlock; >>>> + BOOLEAN StopSequence; >>>> + VOID *Buffer; >>>> + UDF_DESCRIPTOR_TAG *DescriptorTag; >>>> + UINT32 LogicalBlockSize; >>>> + >>>> + BlockSize = BlockIo->Media->BlockSize; ExtentAd = >>>> + &AnchorPoint->MainVolumeDescriptorSequenceExtent; >>>> >>>> // >>>> - // We've already found an ADVP on the volume. It contains the >>>extent >>>> - // (MainVolumeDescriptorSequenceExtent) where the Main Volume >>>> Descriptor >>>> - // Sequence starts. Therefore, we'll look for Logical Volume >>>Descriptors and >>>> - // Partitions Descriptors and save them in memory, accordingly. >>>> - // >>>> - // Note also that each descriptor will be aligned on a block size >>>(BlockSize) >>>> - // boundary, so we need to read one block at a time. >>>> + // Allocate buffer for reading disk blocks >>>> // >>>> - BlockSize = BlockIo->Media->BlockSize; >>>> - ExtentAd = &AnchorPoint->MainVolumeDescriptorSequenceExtent; >>>> - StartingLsn = (UINT64)ExtentAd->ExtentLocation; >>>> - EndingLsn = StartingLsn + DivU64x32 ( >>>> - >>(UINT64)ExtentAd->ExtentLength, >>>> - BlockSize >>>> - ); >>>> - >>>> - Volume->LogicalVolDescs = >>>> - (UDF_LOGICAL_VOLUME_DESCRIPTOR **)AllocateZeroPool (ExtentAd- >>>> >ExtentLength); >>>> - if (Volume->LogicalVolDescs == NULL) { >>>> - return EFI_OUT_OF_RESOURCES; >>>> - } >>>> - >>>> - Volume->PartitionDescs = >>>> - (UDF_PARTITION_DESCRIPTOR **)AllocateZeroPool (ExtentAd- >>>> >ExtentLength); >>>> - if (Volume->PartitionDescs == NULL) { >>>> - Status = EFI_OUT_OF_RESOURCES; >>>> - goto Error_Alloc_Pds; >>>> - } >>>> - >>>> - Buffer = AllocateZeroPool (BlockSize); >>>> + Buffer = AllocateZeroPool ((UINTN)BlockSize); >>>> if (Buffer == NULL) { >>>> - Status = EFI_OUT_OF_RESOURCES; >>>> - goto Error_Alloc_Buf; >>>> + return EFI_OUT_OF_RESOURCES; >>>> } >>>> >>>> - Volume->LogicalVolDescsNo = 0; >>>> - Volume->PartitionDescsNo = 0; >>>> - >>>> - while (StartingLsn <= EndingLsn) { >>>> - Status = DiskIo->ReadDisk ( >>>> - DiskIo, >>>> + // >>>> + // The logical partition created by Partition driver is relative >>>to the main >>>> + // VDS extent location, so we start the Main Volume Descriptor >>>Sequence at >>>> + // LBA 0. >>>> + // >>>> + // We don't need to check again if we have valid Volume >>>Descriptors here >>>> since >>>> + // Partition driver already did. >>>> + // >>>> + SeqStartBlock = 0; >>>> + SeqEndBlock = SeqStartBlock + DivU64x32 >>>((UINT64)ExtentAd->ExtentLength, >>>> + BlockSize); >>StopSequence >>>> + = FALSE; for (; SeqStartBlock < SeqEndBlock && !StopSequence; >>>SeqStartBlock++) { >>>> + // >>>> + // Read disk block >>>> + // >>>> + Status = BlockIo->ReadBlocks ( >>>> + BlockIo, >>>> BlockIo->Media->MediaId, >>>> - MultU64x32 (StartingLsn, BlockSize), >>>> + SeqStartBlock, >>>> BlockSize, >>>> Buffer >>>> ); >>>> if (EFI_ERROR (Status)) { >>>> - goto Error_Read_Disk_Blk; >>>> + goto Out_Free; >>>> } >>>> >>>> - if (IS_TD (Buffer)) { >>>> + DescriptorTag = Buffer; >>>> + >>>> + switch (UDF_TAG_ID (DescriptorTag)) { >>>> + case UdfPartitionDescriptor: >>>> // >>>> - // Found a Terminating Descriptor. Stop the sequence then. >>>> + // Save Partition Descriptor >>>> // >>>> + CopyMem (&Volume->PartitionDesc, Buffer, sizeof (Volume- >>>> >PartitionDesc)); >>>> break; >>>> - } >>>> >>>> - if (IS_LVD (Buffer)) { >>>> + case UdfLogicalVolumeDescriptor: >>>> // >>>> - // Found a Logical Volume Descriptor. >>>> + // Save Logical Volume Descriptor >>>> // >>>> - LogicalVolDesc = >>>> - (UDF_LOGICAL_VOLUME_DESCRIPTOR *) >>>> - AllocateZeroPool (sizeof (UDF_LOGICAL_VOLUME_DESCRIPTOR)); >>>> - if (LogicalVolDesc == NULL) { >>>> - Status = EFI_OUT_OF_RESOURCES; >>>> - goto Error_Alloc_Lvd; >>>> - } >>>> + CopyMem (&Volume->LogicalVolDesc, Buffer, sizeof (Volume- >>>> >LogicalVolDesc)); >>>> + break; >>>> >>>> - CopyMem ((VOID *)LogicalVolDesc, Buffer, >>>> - sizeof (UDF_LOGICAL_VOLUME_DESCRIPTOR)); >>>> - Volume->LogicalVolDescs[Volume->LogicalVolDescsNo++] = >>>> LogicalVolDesc; >>>> - } else if (IS_PD (Buffer)) { >>>> - // >>>> - // Found a Partition Descriptor. >>>> - // >>>> - PartitionDesc = >>>> - (UDF_PARTITION_DESCRIPTOR *) >>>> - AllocateZeroPool (sizeof (UDF_PARTITION_DESCRIPTOR)); >>>> - if (PartitionDesc == NULL) { >>>> - Status = EFI_OUT_OF_RESOURCES; >>>> - goto Error_Alloc_Pd; >>>> - } >>>> + case UdfTerminatingDescriptor: >>>> + StopSequence = TRUE; >>>> + break; >>>> >>>> - CopyMem ((VOID *)PartitionDesc, Buffer, >>>> - sizeof (UDF_PARTITION_DESCRIPTOR)); >>>> - Volume->PartitionDescs[Volume->PartitionDescsNo++] = >>>PartitionDesc; >>>> + default: >>>> + ; >>>> } >>>> - >>>> - StartingLsn++; >>>> } >>>> >>>> // >>>> - // When an UDF volume (revision 2.00 or higher) contains a File >>>Entry rather >>>> - // than an Extended File Entry (which is not recommended as per >>>spec), we >>>> need >>>> - // to make sure the size of a FE will be _at least_ 2048 >>>> - // (UDF_LOGICAL_SECTOR_SIZE) bytes long to keep backward >>>compatibility. >>>> + // Determine FE (File Entry) size >>>> // >>>> - LogicalBlockSize = LV_BLOCK_SIZE (Volume, UDF_DEFAULT_LV_NUM); >>>> + LogicalBlockSize = Volume->LogicalVolDesc.LogicalBlockSize; >>>> if (LogicalBlockSize >= UDF_LOGICAL_SECTOR_SIZE) { >>>> - Volume->FileEntrySize = LogicalBlockSize; >>>> + Volume->FileEntrySize = (UINTN)LogicalBlockSize; >>>> } else { >>>> Volume->FileEntrySize = UDF_LOGICAL_SECTOR_SIZE; >>>> } >>>> >>>> - FreePool (Buffer); >>>> + Status = EFI_SUCCESS; >>>> >>>> - return EFI_SUCCESS; >>>> - >>>> -Error_Alloc_Pd: >>>> -Error_Alloc_Lvd: >>>> - for (Index = 0; Index < Volume->PartitionDescsNo; Index++) { >>>> - FreePool ((VOID *)Volume->PartitionDescs[Index]); >>>> - } >>>> - >>>> - for (Index = 0; Index < Volume->LogicalVolDescsNo; Index++) { >>>> - FreePool ((VOID *)Volume->LogicalVolDescs[Index]); >>>> - } >>>> - >>>> -Error_Read_Disk_Blk: >>>> +Out_Free: >>>> + // >>>> + // Free block read buffer >>>> + // >>>> FreePool (Buffer); >>>> >>>> -Error_Alloc_Buf: >>>> - FreePool ((VOID *)Volume->PartitionDescs); >>>> - Volume->PartitionDescs = NULL; >>>> - >>>> -Error_Alloc_Pds: >>>> - FreePool ((VOID *)Volume->LogicalVolDescs); >>>> - Volume->LogicalVolDescs = NULL; >>>> - >>>> return Status; >>>> } >>>> >>>> @@ -262,48 +216,53 @@ GetPdFromLongAd ( >>>> ) >>>> { >>>> UDF_LOGICAL_VOLUME_DESCRIPTOR *LogicalVolDesc; >>>> - UINTN Index; >>>> - UDF_PARTITION_DESCRIPTOR *PartitionDesc; >>>> UINT16 PartitionNum; >>>> >>>> - LogicalVolDesc = Volume->LogicalVolDescs[UDF_DEFAULT_LV_NUM]; >>>> + LogicalVolDesc = &Volume->LogicalVolDesc; >>>> >>>> - switch (LV_UDF_REVISION (LogicalVolDesc)) { >>>> + switch (UDF_LVD_REVISION (LogicalVolDesc)) { >>>> case 0x0102: >>>> + case 0x0150: >>>> + case 0x0200: >>>> + case 0x0201: >>>> + case 0x0250: >>>> + case 0x0260: >>>> // >>>> - // As per UDF 1.02 specification: >>>> + // UDF 1.02 specification: >>>> // >>>> // There shall be exactly one prevailing Logical Volume >>>Descriptor recorded >>>> // per Volume Set. The Partition Maps field shall contain only >>>Type 1 >>>> // Partition Maps. >>>> // >>>> - PartitionNum = *(UINT16 >>>*)((UINTN)&LogicalVolDesc->PartitionMaps[4]); >>>> - break; >>>> - case 0x0150: >>>> + // UDF 1.50 through 2.60 specs say: >>>> // >>>> - // Ensure Type 1 Partition map. Other types aren't supported in >>>this >>>> - // implementation. >>>> + // For the purpose of interchange partition maps shall be >>>limited to >>>> + // Partition Map type 1, except type 2 maps as described in the >>>document. >>>> + // >>>> + // NOTE: Only one Type 1 (Physical) Partition is supported. It >>>has been >>>> + // checked already in Partition driver for existence of a >>single >>>Type 1 >>>> + // Partition map, so we don't have to double check here. >>>> + // >>>> + // Partition reference number can also be retrieved from >>>> + // LongAd->ExtentLocation.PartitionReferenceNumber, however the >>>spec >>>> says >>>> + // it may be 0, so let's not rely on it. >>>> // >>>> - if (LogicalVolDesc->PartitionMaps[0] != 1 || >>>> - LogicalVolDesc->PartitionMaps[1] != 6) { >>>> - return NULL; >>>> - } >>>> PartitionNum = *(UINT16 >>>*)((UINTN)&LogicalVolDesc->PartitionMaps[4]); >>>> break; >>>> - case 0x0260: >>>> + >>>> + default: >>>> // >>>> - // Fall through. >>>> + // Unsupported UDF revision >>>> // >>>> - default: >>>> - PartitionNum = LongAd->ExtentLocation.PartitionReferenceNumber; >>>> - break; >>>> + return NULL; >>>> } >>>> >>>> - > > -- > Sent from my Android device with K-9 Mail. Please excuse my brevity. > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel -- Paulo Alcantara, HP Speaking for myself only.