public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Wu, Hao A" <hao.a.wu@intel.com>
To: Paulo Alcantara <pcacjr@zytor.com>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Ni, Ruiyu" <ruiyu.ni@intel.com>,
	Laszlo Ersek <lersek@redhat.com>,
	"Dong, Eric" <eric.dong@intel.com>,
	"Zeng, Star" <star.zeng@intel.com>
Subject: Re: [PATCH v3 2/2] MdeModulePkg/PartitionDxe: Fix creation of UDF logical partition
Date: Thu, 21 Sep 2017 08:08:50 +0000	[thread overview]
Message-ID: <B80AF82E9BFB8E4FBD8C89DA810C6A0931D038E0@SHSMSX101.ccr.corp.intel.com> (raw)
In-Reply-To: <e969511c03927f9b785ec85b8252d24b593bae2b.1505929933.git.pcacjr@zytor.com>

I did a simple test on a Windows8.1 installation DVD, and here's the result
of a map command under shell:

Before the patch:
Mapping table
      FS0: Alias(s):CD0f65535a1:;BLK2:
          PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x5,0xFFFF,0x0)/CDROM(0x1)
     BLK0: Alias(s):
          PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x5,0xFFFF,0x0)
     BLK1: Alias(s):
          PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x5,0xFFFF,0x0)/CDROM(0x0)
      FS1: Alias(s):CD0f65535ab:;BLK5:
          PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x5,0xFFFF,0x0)/VenMedia(C5BD4D42-1A76-4996-8956-73CDA326CD0A)/CDROM(0x1)
     BLK3: Alias(s):
          PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x5,0xFFFF,0x0)/VenMedia(C5BD4D42-1A76-4996-8956-73CDA326CD0A)
     BLK4: Alias(s):
          PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x5,0xFFFF,0x0)/VenMedia(C5BD4D42-1A76-4996-8956-73CDA326CD0A)/CDROM(0x0)

After the patch:
Mapping table
      FS0: Alias(s):CD0f65535a1:;BLK2:
          PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x5,0xFFFF,0x0)/CDROM(0x1)
     BLK0: Alias(s):
          PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x5,0xFFFF,0x0)
     BLK1: Alias(s):
          PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x5,0xFFFF,0x0)/CDROM(0x0)
     BLK3: Alias(s):
          PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x5,0xFFFF,0x0)/VenMedia(C5BD4D42-1A76-4996-8956-73CDA326CD0A)


Since the additional file system is gone:
Tested-by: Hao Wu <hao.a.wu@intel.com>


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 <eric.dong@intel.com>
> Cc: Ruiyu Ni <ruiyu.ni@intel.com>
> Cc: Star Zeng <star.zeng@intel.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Reported-by: Ruiyu Ni <ruiyu.ni@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Paulo Alcantara <pcacjr@zytor.com>
> ---
>  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;
>    }
> 
> -  for (Index = 0; Index < Volume->PartitionDescsNo; Index++) {
> -    PartitionDesc = Volume->PartitionDescs[Index];
> -    if (PartitionDesc->PartitionNumber == PartitionNum) {
> -      return PartitionDesc;
> -    }
> +  //
> +  // Check if partition number matches Partition Descriptor found in Main
> Volume
> +  // Descriptor Sequence.
> +  //
> +  if (Volume->PartitionDesc.PartitionNumber == PartitionNum) {
> +    return &Volume->PartitionDesc;
>    }
> 
>    return NULL;
> @@ -329,13 +288,15 @@ GetLongAdLsn (
>    PartitionDesc = GetPdFromLongAd (Volume, LongAd);
>    ASSERT (PartitionDesc != NULL);
> 
> -  return (UINT64)PartitionDesc->PartitionStartingLocation +
> -                 LongAd->ExtentLocation.LogicalBlockNumber;
> +  return (UINT64)PartitionDesc->PartitionStartingLocation -
> +    Volume->MainVdsStartLocation +
> +    LongAd->ExtentLocation.LogicalBlockNumber;
>  }
> 
>  /**
>    Return logical sector number of a given Short Allocation Descriptor.
> 
> +  @param[in]  Volume              Volume pointer.
>    @param[in]  PartitionDesc       Partition Descriptor pointer.
>    @param[in]  ShortAd             Short Allocation Descriptor pointer.
> 
> @@ -344,14 +305,13 @@ GetLongAdLsn (
>  **/
>  UINT64
>  GetShortAdLsn (
> +  IN UDF_VOLUME_INFO                  *Volume,
>    IN UDF_PARTITION_DESCRIPTOR         *PartitionDesc,
>    IN UDF_SHORT_ALLOCATION_DESCRIPTOR  *ShortAd
>    )
>  {
> -  ASSERT (PartitionDesc != NULL);
> -
> -  return (UINT64)PartitionDesc->PartitionStartingLocation +
> -    ShortAd->ExtentPosition;
> +  return (UINT64)PartitionDesc->PartitionStartingLocation -
> +    Volume->MainVdsStartLocation + ShortAd->ExtentPosition;
>  }
> 
>  /**
> @@ -363,8 +323,6 @@ GetShortAdLsn (
>    @param[in]  BlockIo             BlockIo interface.
>    @param[in]  DiskIo              DiskIo interface.
>    @param[in]  Volume              Volume information pointer.
> -  @param[in]  LogicalVolDescNum   Index of Logical Volume Descriptor
> -  @param[out] FileSetDesc         File Set Descriptor pointer.
> 
>    @retval EFI_SUCCESS             File Set Descriptor pointer found.
>    @retval EFI_VOLUME_CORRUPTED    The file system structures are
> corrupted.
> @@ -375,36 +333,42 @@ EFI_STATUS
>  FindFileSetDescriptor (
>    IN   EFI_BLOCK_IO_PROTOCOL    *BlockIo,
>    IN   EFI_DISK_IO_PROTOCOL     *DiskIo,
> -  IN   UDF_VOLUME_INFO          *Volume,
> -  IN   UINTN                    LogicalVolDescNum,
> -  OUT  UDF_FILE_SET_DESCRIPTOR  *FileSetDesc
> +  IN   UDF_VOLUME_INFO          *Volume
>    )
>  {
>    EFI_STATUS                     Status;
>    UINT64                         Lsn;
>    UDF_LOGICAL_VOLUME_DESCRIPTOR  *LogicalVolDesc;
> +  UDF_DESCRIPTOR_TAG             *DescriptorTag;
> 
> -  LogicalVolDesc = Volume->LogicalVolDescs[LogicalVolDescNum];
> +  LogicalVolDesc = &Volume->LogicalVolDesc;
>    Lsn = GetLongAdLsn (Volume, &LogicalVolDesc->LogicalVolumeContentsUse);
> 
>    //
> -  // Read extent (Long Ad).
> +  // As per UDF 2.60 specification:
> +  //
> +  // There shall be exactly one File Set Descriptor recorded per Logical
> +  // Volume.
> +  //
> +  // Read disk block
>    //
>    Status = DiskIo->ReadDisk (
>      DiskIo,
>      BlockIo->Media->MediaId,
>      MultU64x32 (Lsn, LogicalVolDesc->LogicalBlockSize),
> -    sizeof (UDF_FILE_SET_DESCRIPTOR),
> -    (VOID *)FileSetDesc
> +    sizeof (Volume->FileSetDesc),
> +    &Volume->FileSetDesc
>      );
>    if (EFI_ERROR (Status)) {
>      return Status;
>    }
> 
> +  DescriptorTag = &Volume->FileSetDesc.DescriptorTag;
> +
>    //
> -  // Check if the read extent contains a valid FSD's tag identifier.
> +  // Check if read block is a File Set Descriptor
>    //
> -  if (!IS_FSD (FileSetDesc)) {
> +  if (UDF_TAG_ID (DescriptorTag) != UdfFileSetDescriptor) {
>      return EFI_VOLUME_CORRUPTED;
>    }
> 
> @@ -412,82 +376,6 @@ FindFileSetDescriptor (
>  }
> 
>  /**
> -  Get all File Set Descriptors for each Logical Volume Descriptor.
> -
> -  @param[in]      BlockIo         BlockIo interface.
> -  @param[in]      DiskIo          DiskIo interface.
> -  @param[in, out] Volume          Volume information pointer.
> -
> -  @retval EFI_SUCCESS             File Set Descriptors were got.
> -  @retval EFI_OUT_OF_RESOURCES    File Set Descriptors were not got due to
> lack
> -                                  of resources.
> -  @retval other                   Error occured when finding File Set
> -                                  Descriptor in Logical Volume Descriptor.
> -
> -**/
> -EFI_STATUS
> -GetFileSetDescriptors (
> -  IN      EFI_BLOCK_IO_PROTOCOL  *BlockIo,
> -  IN      EFI_DISK_IO_PROTOCOL   *DiskIo,
> -  IN OUT  UDF_VOLUME_INFO        *Volume
> -  )
> -{
> -  EFI_STATUS               Status;
> -  UINTN                    Index;
> -  UDF_FILE_SET_DESCRIPTOR  *FileSetDesc;
> -  UINTN                    Count;
> -
> -  Volume->FileSetDescs =
> -    (UDF_FILE_SET_DESCRIPTOR **)AllocateZeroPool (
> -      Volume->LogicalVolDescsNo * sizeof (UDF_FILE_SET_DESCRIPTOR));
> -  if (Volume->FileSetDescs == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  for (Index = 0; Index < Volume->LogicalVolDescsNo; Index++) {
> -    FileSetDesc = AllocateZeroPool (sizeof (UDF_FILE_SET_DESCRIPTOR));
> -    if (FileSetDesc == NULL) {
> -      Status = EFI_OUT_OF_RESOURCES;
> -      goto Error_Alloc_Fsd;
> -    }
> -
> -    //
> -    // Find a FSD for this LVD.
> -    //
> -    Status = FindFileSetDescriptor (
> -      BlockIo,
> -      DiskIo,
> -      Volume,
> -      Index,
> -      FileSetDesc
> -      );
> -    if (EFI_ERROR (Status)) {
> -      goto Error_Find_Fsd;
> -    }
> -
> -    //
> -    // Got one. Save it.
> -    //
> -    Volume->FileSetDescs[Index] = FileSetDesc;
> -  }
> -
> -  Volume->FileSetDescsNo = Volume->LogicalVolDescsNo;
> -  return EFI_SUCCESS;
> -
> -Error_Find_Fsd:
> -  Count = Index + 1;
> -  for (Index = 0; Index < Count; Index++) {
> -    FreePool ((VOID *)Volume->FileSetDescs[Index]);
> -  }
> -
> -  FreePool ((VOID *)Volume->FileSetDescs);
> -  Volume->FileSetDescs = NULL;
> -
> -Error_Alloc_Fsd:
> -  return Status;
> -}
> -
> -/**
>    Read Volume and File Structure on an UDF file system.
> 
>    @param[in]   BlockIo            BlockIo interface.
> @@ -507,9 +395,10 @@ ReadVolumeFileStructure (
>  {
>    EFI_STATUS                            Status;
>    UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER  AnchorPoint;
> +  UDF_EXTENT_AD                         *ExtentAd;
> 
>    //
> -  // Find an AVDP.
> +  // Find Anchor Volume Descriptor Pointer
>    //
>    Status = FindAnchorVolumeDescriptorPointer (
>      BlockIo,
> @@ -521,7 +410,14 @@ ReadVolumeFileStructure (
>    }
> 
>    //
> -  // AVDP has been found. Start MVDS.
> +  // Save Main VDS start block number
> +  //
> +  ExtentAd = &AnchorPoint.MainVolumeDescriptorSequenceExtent;
> +
> +  Volume->MainVdsStartLocation = (UINT64)ExtentAd->ExtentLocation;
> +
> +  //
> +  // Start Main Volume Descriptor Sequence.
>    //
>    Status = StartMainVolumeDescriptorSequence (
>      BlockIo,
> @@ -620,16 +516,19 @@ GetFileEntryData (
>    OUT  UINT64  *Length
>    )
>  {
> +  UDF_DESCRIPTOR_TAG       *DescriptorTag;
>    UDF_EXTENDED_FILE_ENTRY  *ExtendedFileEntry;
>    UDF_FILE_ENTRY           *FileEntry;
> 
> -  if (IS_EFE (FileEntryData)) {
> +  DescriptorTag = FileEntryData;
> +
> +  if (UDF_TAG_ID (DescriptorTag) == UdfExtendedFileEntry) {
>      ExtendedFileEntry = (UDF_EXTENDED_FILE_ENTRY *)FileEntryData;
> 
>      *Length  = ExtendedFileEntry->InformationLength;
>      *Data    = (VOID *)((UINT8 *)ExtendedFileEntry->Data +
>                          ExtendedFileEntry->LengthOfExtendedAttributes);
> -  } else if (IS_FE (FileEntryData)) {
> +  } else if (UDF_TAG_ID (DescriptorTag) == UdfFileEntry) {
>      FileEntry = (UDF_FILE_ENTRY *)FileEntryData;
> 
>      *Length  = FileEntry->InformationLength;
> @@ -654,16 +553,19 @@ GetAdsInformation (
>    OUT  UINT64  *Length
>    )
>  {
> +  UDF_DESCRIPTOR_TAG       *DescriptorTag;
>    UDF_EXTENDED_FILE_ENTRY  *ExtendedFileEntry;
>    UDF_FILE_ENTRY           *FileEntry;
> 
> -  if (IS_EFE (FileEntryData)) {
> +  DescriptorTag = FileEntryData;
> +
> +  if (UDF_TAG_ID (DescriptorTag) == UdfExtendedFileEntry) {
>      ExtendedFileEntry = (UDF_EXTENDED_FILE_ENTRY *)FileEntryData;
> 
>      *Length = ExtendedFileEntry->LengthOfAllocationDescriptors;
>      *AdsData = (VOID *)((UINT8 *)ExtendedFileEntry->Data +
>                          ExtendedFileEntry->LengthOfExtendedAttributes);
> -  } else if (IS_FE (FileEntryData)) {
> +  } else if (UDF_TAG_ID (DescriptorTag) == UdfFileEntry) {
>      FileEntry = (UDF_FILE_ENTRY *)FileEntryData;
> 
>      *Length = FileEntry->LengthOfAllocationDescriptors;
> @@ -850,6 +752,7 @@ GetAllocationDescriptorLsn (
>      return GetLongAdLsn (Volume, (UDF_LONG_ALLOCATION_DESCRIPTOR
> *)Ad);
>    } else if (RecordingFlags == ShortAdsSequence) {
>      return GetShortAdLsn (
> +      Volume,
>        GetPdFromLongAd (Volume, ParentIcb),
>        (UDF_SHORT_ALLOCATION_DESCRIPTOR *)Ad
>        );
> @@ -897,6 +800,7 @@ GetAedAdsOffset (
>    VOID                              *Data;
>    UINT32                            LogicalBlockSize;
>    UDF_ALLOCATION_EXTENT_DESCRIPTOR  *AllocExtDesc;
> +  UDF_DESCRIPTOR_TAG                *DescriptorTag;
> 
>    ExtentLength  = GET_EXTENT_LENGTH (RecordingFlags, Ad);
>    Lsn           = GetAllocationDescriptorLsn (RecordingFlags,
> @@ -909,7 +813,7 @@ GetAedAdsOffset (
>      return EFI_OUT_OF_RESOURCES;
>    }
> 
> -  LogicalBlockSize = LV_BLOCK_SIZE (Volume, UDF_DEFAULT_LV_NUM);
> +  LogicalBlockSize = Volume->LogicalVolDesc.LogicalBlockSize;
> 
>    //
>    // Read extent.
> @@ -925,11 +829,14 @@ GetAedAdsOffset (
>      goto Exit;
>    }
> 
> +  AllocExtDesc = (UDF_ALLOCATION_EXTENT_DESCRIPTOR *)Data;
> +
> +  DescriptorTag = &AllocExtDesc->DescriptorTag;
> +
>    //
>    // Check if read extent contains a valid tag identifier for AED.
>    //
> -  AllocExtDesc = (UDF_ALLOCATION_EXTENT_DESCRIPTOR *)Data;
> -  if (!IS_AED (AllocExtDesc)) {
> +  if (UDF_TAG_ID (DescriptorTag) != UdfAllocationExtentDescriptor) {
>      Status = EFI_VOLUME_CORRUPTED;
>      goto Exit;
>    }
> @@ -1102,7 +1009,7 @@ ReadFile (
>    UINT32                  ExtentLength;
>    UDF_FE_RECORDING_FLAGS  RecordingFlags;
> 
> -  LogicalBlockSize  = LV_BLOCK_SIZE (Volume, UDF_DEFAULT_LV_NUM);
> +  LogicalBlockSize  = Volume->LogicalVolDesc.LogicalBlockSize;
>    DoFreeAed         = FALSE;
> 
>    //
> @@ -1444,7 +1351,7 @@ InternalFindFile (
>    //
>    // Check if parent file is really directory.
>    //
> -  if (!IS_FE_DIRECTORY (Parent->FileEntry)) {
> +  if (FE_ICB_FILE_TYPE (Parent->FileEntry) != UdfFileEntryDirectory) {
>      return EFI_NOT_FOUND;
>    }
> 
> @@ -1489,7 +1396,7 @@ InternalFindFile (
>        break;
>      }
> 
> -    if (IS_FID_PARENT_FILE (FileIdentifierDesc)) {
> +    if (FileIdentifierDesc->FileCharacteristics & PARENT_FILE) {
>        //
>        // This FID contains the location (FE/EFE) of the parent directory of this
>        // directory (Parent), and if FileName is either ".." or "\\", then it's
> @@ -1592,6 +1499,9 @@ ReadUdfVolumeInformation (
>  {
>    EFI_STATUS Status;
> 
> +  //
> +  // Read all necessary UDF volume information and keep it private to the
> driver
> +  //
>    Status = ReadVolumeFileStructure (
>      BlockIo,
>      DiskIo,
> @@ -1601,13 +1511,12 @@ ReadUdfVolumeInformation (
>      return Status;
>    }
> 
> -  Status = GetFileSetDescriptors (
> -    BlockIo,
> -    DiskIo,
> -    Volume
> -    );
> +  //
> +  // Find File Set Descriptor
> +  //
> +  Status = FindFileSetDescriptor (BlockIo, DiskIo, Volume);
>    if (EFI_ERROR (Status)) {
> -    CleanupVolumeInformation (Volume);
> +    return Status;
>    }
> 
>    return Status;
> @@ -1644,7 +1553,7 @@ FindRootDirectory (
>      BlockIo,
>      DiskIo,
>      Volume,
> -    &Volume->FileSetDescs[0]->RootDirectoryIcb,
> +    &Volume->FileSetDesc.RootDirectoryIcb,
>      &File->FileEntry
>      );
>    if (EFI_ERROR (Status)) {
> @@ -1661,7 +1570,7 @@ FindRootDirectory (
>      L"\\",
>      NULL,
>      &Parent,
> -    &Volume->FileSetDescs[0]->RootDirectoryIcb,
> +    &Volume->FileSetDesc.RootDirectoryIcb,
>      File
>      );
>    if (EFI_ERROR (Status)) {
> @@ -1697,12 +1606,13 @@ FindFileEntry (
>    OUT  VOID                            **FileEntry
>    )
>  {
> -  EFI_STATUS  Status;
> -  UINT64      Lsn;
> -  UINT32      LogicalBlockSize;
> +  EFI_STATUS          Status;
> +  UINT64              Lsn;
> +  UINT32              LogicalBlockSize;
> +  UDF_DESCRIPTOR_TAG  *DescriptorTag;
> 
>    Lsn               = GetLongAdLsn (Volume, Icb);
> -  LogicalBlockSize  = LV_BLOCK_SIZE (Volume, UDF_DEFAULT_LV_NUM);
> +  LogicalBlockSize  = Volume->LogicalVolDesc.LogicalBlockSize;
> 
>    *FileEntry = AllocateZeroPool (Volume->FileEntrySize);
>    if (*FileEntry == NULL) {
> @@ -1723,11 +1633,14 @@ FindFileEntry (
>      goto Error_Read_Disk_Blk;
>    }
> 
> +  DescriptorTag = *FileEntry;
> +
>    //
>    // Check if the read extent contains a valid Tag Identifier for the expected
>    // FE/EFE.
>    //
> -  if (!IS_FE (*FileEntry) && !IS_EFE (*FileEntry)) {
> +  if (UDF_TAG_ID (DescriptorTag) != UdfFileEntry &&
> +      UDF_TAG_ID (DescriptorTag) != UdfExtendedFileEntry) {
>      Status = EFI_VOLUME_CORRUPTED;
>      goto Error_Invalid_Fe;
>    }
> @@ -1837,7 +1750,7 @@ FindFile (
>      // If the found file is a symlink, then find its respective FE/EFE and
>      // FID descriptors.
>      //
> -    if (IS_FE_SYMLINK (File->FileEntry)) {
> +    if (FE_ICB_FILE_TYPE (File->FileEntry) == UdfFileEntrySymlink) {
>        FreePool ((VOID *)File->FileIdentifierDesc);
> 
>        FileEntry = File->FileEntry;
> @@ -1951,7 +1864,7 @@ ReadDirectoryEntry (
>      // Update FidOffset to point to next FID.
>      //
>      ReadDirInfo->FidOffset += GetFidDescriptorLength (FileIdentifierDesc);
> -  } while (IS_FID_DELETED_FILE (FileIdentifierDesc));
> +  } while (FileIdentifierDesc->FileCharacteristics & DELETED_FILE);
> 
>    DuplicateFid (FileIdentifierDesc, FoundFid);
> 
> @@ -2197,43 +2110,6 @@ Error_Find_File:
>  }
> 
>  /**
> -  Clean up in-memory UDF volume information.
> -
> -  @param[in] Volume Volume information pointer.
> -
> -**/
> -VOID
> -CleanupVolumeInformation (
> -  IN UDF_VOLUME_INFO *Volume
> -  )
> -{
> -  UINTN Index;
> -
> -  if (Volume->LogicalVolDescs != NULL) {
> -    for (Index = 0; Index < Volume->LogicalVolDescsNo; Index++) {
> -      FreePool ((VOID *)Volume->LogicalVolDescs[Index]);
> -    }
> -    FreePool ((VOID *)Volume->LogicalVolDescs);
> -  }
> -
> -  if (Volume->PartitionDescs != NULL) {
> -    for (Index = 0; Index < Volume->PartitionDescsNo; Index++) {
> -      FreePool ((VOID *)Volume->PartitionDescs[Index]);
> -    }
> -    FreePool ((VOID *)Volume->PartitionDescs);
> -  }
> -
> -  if (Volume->FileSetDescs != NULL) {
> -    for (Index = 0; Index < Volume->FileSetDescsNo; Index++) {
> -      FreePool ((VOID *)Volume->FileSetDescs[Index]);
> -    }
> -    FreePool ((VOID *)Volume->FileSetDescs);
> -  }
> -
> -  ZeroMem ((VOID *)Volume, sizeof (UDF_VOLUME_INFO));
> -}
> -
> -/**
>    Clean up in-memory UDF file information.
> 
>    @param[in] File File information pointer.
> @@ -2333,6 +2209,7 @@ SetFileInfo (
>    EFI_FILE_INFO            *FileInfo;
>    UDF_FILE_ENTRY           *FileEntry;
>    UDF_EXTENDED_FILE_ENTRY  *ExtendedFileEntry;
> +  UDF_DESCRIPTOR_TAG       *DescriptorTag;
> 
>    //
>    // Calculate the needed size for the EFI_FILE_INFO structure.
> @@ -2367,7 +2244,9 @@ SetFileInfo (
>      FileInfo->Attribute |= EFI_FILE_HIDDEN;
>    }
> 
> -  if (IS_FE (File->FileEntry)) {
> +  DescriptorTag = File->FileEntry;
> +
> +  if (UDF_TAG_ID (DescriptorTag) == UdfFileEntry) {
>      FileEntry = (UDF_FILE_ENTRY *)File->FileEntry;
> 
>      //
> @@ -2403,7 +2282,7 @@ SetFileInfo (
>                                     FileEntry->AccessTime.Second;
>      FileInfo->LastAccessTime.Nanosecond  =
>                                     FileEntry->AccessTime.HundredsOfMicroseconds;
> -  } else if (IS_EFE (File->FileEntry)) {
> +  } else if (UDF_TAG_ID (DescriptorTag) == UdfExtendedFileEntry) {
>      ExtendedFileEntry = (UDF_EXTENDED_FILE_ENTRY *)File->FileEntry;
> 
>      //
> @@ -2487,91 +2366,103 @@ GetVolumeSize (
>    OUT  UINT64                 *FreeSpaceSize
>    )
>  {
> -  UDF_EXTENT_AD                 ExtentAd;
> -  UINT32                        LogicalBlockSize;
> -  UINT64                        Lsn;
> -  EFI_STATUS                    Status;
> -  UDF_LOGICAL_VOLUME_INTEGRITY  *LogicalVolInt;
> -  UINTN                         Index;
> -  UINTN                         Length;
> -  UINT32                        LsnsNo;
> -
> -  *VolumeSize     = 0;
> -  *FreeSpaceSize  = 0;
> -
> -  for (Index = 0; Index < Volume->LogicalVolDescsNo; Index++) {
> -    CopyMem ((VOID *)&ExtentAd,
> -             (VOID *)&Volume->LogicalVolDescs[Index]->IntegritySequenceExtent,
> -             sizeof (UDF_EXTENT_AD));
> -    if (ExtentAd.ExtentLength == 0) {
> -      continue;
> -    }
> +  EFI_STATUS                     Status;
> +  UDF_LOGICAL_VOLUME_DESCRIPTOR  *LogicalVolDesc;
> +  UDF_EXTENT_AD                  *ExtentAd;
> +  UINT64                         Lsn;
> +  UINT32                         LogicalBlockSize;
> +  UDF_LOGICAL_VOLUME_INTEGRITY   *LogicalVolInt;
> +  UDF_DESCRIPTOR_TAG             *DescriptorTag;
> +  UINTN                          Index;
> +  UINTN                          Length;
> +  UINT32                         LsnsNo;
> 
> -    LogicalBlockSize = LV_BLOCK_SIZE (Volume, Index);
> +  LogicalVolDesc = &Volume->LogicalVolDesc;
> 
> -  Read_Next_Sequence:
> -    LogicalVolInt = (UDF_LOGICAL_VOLUME_INTEGRITY *)
> -      AllocatePool (ExtentAd.ExtentLength);
> -    if (LogicalVolInt == NULL) {
> -      return EFI_OUT_OF_RESOURCES;
> -    }
> +  ExtentAd = &LogicalVolDesc->IntegritySequenceExtent;
> +
> +  if (ExtentAd->ExtentLength == 0) {
> +    return EFI_VOLUME_CORRUPTED;
> +  }
> 
> -    Lsn = (UINT64)ExtentAd.ExtentLocation;
> +  LogicalVolInt = AllocatePool (ExtentAd->ExtentLength);
> +  if (LogicalVolInt == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> 
> -    Status = DiskIo->ReadDisk (
> -      DiskIo,
> -      BlockIo->Media->MediaId,
> -      MultU64x32 (Lsn, LogicalBlockSize),
> -      ExtentAd.ExtentLength,
> -      (VOID *)LogicalVolInt
> -      );
> -    if (EFI_ERROR (Status)) {
> -      FreePool ((VOID *)LogicalVolInt);
> -      return Status;
> -    }
> +  //
> +  // Get location of Logical Volume Integrity Descriptor
> +  //
> +  Lsn = (UINT64)ExtentAd->ExtentLocation - Volume->MainVdsStartLocation;
> 
> -    if (!IS_LVID (LogicalVolInt)) {
> -      FreePool ((VOID *)LogicalVolInt);
> -      return EFI_VOLUME_CORRUPTED;
> -    }
> +  LogicalBlockSize = LogicalVolDesc->LogicalBlockSize;
> 
> -    Length = LogicalVolInt->NumberOfPartitions;
> -    for (Index = 0; Index < Length; Index += sizeof (UINT32)) {
> -      LsnsNo = *(UINT32 *)((UINT8 *)LogicalVolInt->Data + Index);
> -      if (LsnsNo == 0xFFFFFFFFUL) {
> -        //
> -        // Size not specified.
> -        //
> -        continue;
> -      }
> +  //
> +  // Read disk block
> +  //
> +  Status = DiskIo->ReadDisk (
> +    DiskIo,
> +    BlockIo->Media->MediaId,
> +    MultU64x32 (Lsn, LogicalBlockSize),
> +    ExtentAd->ExtentLength,
> +    LogicalVolInt
> +    );
> +  if (EFI_ERROR (Status)) {
> +    goto Out_Free;
> +  }
> 
> -      *FreeSpaceSize += MultU64x32 ((UINT64)LsnsNo, LogicalBlockSize);
> -    }
> +  DescriptorTag = &LogicalVolInt->DescriptorTag;
> 
> -    Length = (LogicalVolInt->NumberOfPartitions * sizeof (UINT32)) << 1;
> -    for (; Index < Length; Index += sizeof (UINT32)) {
> -      LsnsNo = *(UINT32 *)((UINT8 *)LogicalVolInt->Data + Index);
> -      if (LsnsNo == 0xFFFFFFFFUL) {
> -        //
> -        // Size not specified.
> -        //
> -        continue;
> -      }
> +  //
> +  // Check if read block is a Logical Volume Integrity Descriptor
> +  //
> +  if (UDF_TAG_ID (DescriptorTag) != UdfLogicalVolumeIntegrityDescriptor) {
> +    Status = EFI_VOLUME_CORRUPTED;
> +    goto Out_Free;
> +  }
> 
> -      *VolumeSize += MultU64x32 ((UINT64)LsnsNo, LogicalBlockSize);
> -    }
> +  *VolumeSize = 0;
> +  *FreeSpaceSize = 0;
> 
> -    CopyMem ((VOID *)&ExtentAd,(VOID *)&LogicalVolInt->NextIntegrityExtent,
> -             sizeof (UDF_EXTENT_AD));
> -    if (ExtentAd.ExtentLength > 0) {
> -      FreePool ((VOID *)LogicalVolInt);
> -      goto Read_Next_Sequence;
> +  Length = LogicalVolInt->NumberOfPartitions;
> +  for (Index = 0; Index < Length; Index += sizeof (UINT32)) {
> +    LsnsNo = *(UINT32 *)((UINT8 *)LogicalVolInt->Data + Index);
> +    //
> +    // Check if size is not specified
> +    //
> +    if (LsnsNo == 0xFFFFFFFFUL) {
> +      continue;
>      }
> +    //
> +    // Accumulate free space size
> +    //
> +    *FreeSpaceSize += MultU64x32 ((UINT64)LsnsNo, LogicalBlockSize);
> +  }
> 
> -    FreePool ((VOID *)LogicalVolInt);
> +  Length = LogicalVolInt->NumberOfPartitions * sizeof (UINT32) * 2;
> +  for (; Index < Length; Index += sizeof (UINT32)) {
> +    LsnsNo = *(UINT32 *)((UINT8 *)LogicalVolInt->Data + Index);
> +    //
> +    // Check if size is not specified
> +    //
> +    if (LsnsNo == 0xFFFFFFFFUL) {
> +      continue;
> +    }
> +    //
> +    // Accumulate used volume space
> +    //
> +    *VolumeSize += MultU64x32 ((UINT64)LsnsNo, LogicalBlockSize);
>    }
> 
> -  return EFI_SUCCESS;
> +  Status = EFI_SUCCESS;
> +
> +Out_Free:
> +  //
> +  // Free Logical Volume Integrity Descriptor
> +  //
> +  FreePool (LogicalVolInt);
> +
> +  return Status;
>  }
> 
>  /**
> diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
> b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
> index 49dc7077b7..d4163b89ca 100644
> --- a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
> +++ b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.c
> @@ -276,13 +276,6 @@ UdfDriverBindingStop (
>        NULL
>        );
> 
> -    //
> -    // Check if there's any open file. If so, clean them up.
> -    //
> -    if (PrivFsData->OpenFiles > 0) {
> -      CleanupVolumeInformation (&PrivFsData->Volume);
> -    }
> -
>      FreePool ((VOID *)PrivFsData);
>    }
> 
> diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.h
> b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.h
> index 44c843fd4d..ef2a3359ce 100644
> --- a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.h
> +++ b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.h
> @@ -49,61 +49,34 @@
>      { 0x89, 0x56, 0x73, 0xCD, 0xA3, 0x26, 0xCD, 0x0A }  \
>    }
> 
> -#define UDF_DEFAULT_LV_NUM 0
> -
> -#define IS_PVD(_Pointer) \
> -  ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 1))
> -#define IS_PD(_Pointer) \
> -  ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 5))
> -#define IS_LVD(_Pointer) \
> -  ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 6))
> -#define IS_TD(_Pointer) \
> -  ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 8))
> -#define IS_FSD(_Pointer) \
> -  ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 256))
> -#define IS_FE(_Pointer) \
> -  ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 261))
> -#define IS_EFE(_Pointer) \
> -  ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 266))
> -#define IS_FID(_Pointer) \
> -  ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 257))
> -#define IS_AED(_Pointer) \
> -  ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 258))
> -#define IS_LVID(_Pointer) \
> -  ((BOOLEAN)(_GET_TAG_ID (_Pointer) == 9))
> -
> -#define _GET_FILETYPE(_Pointer) \
> -  (IS_FE (_Pointer) ? \
> -   (((UDF_FILE_ENTRY *)(_Pointer))->IcbTag.FileType) \
> -   : \
> -   (((UDF_EXTENDED_FILE_ENTRY *)(_Pointer))->IcbTag.FileType))
> -
> -#define IS_FE_DIRECTORY(_Pointer) \
> -  ((BOOLEAN)(_GET_FILETYPE (_Pointer) == 4))
> -#define IS_FE_STANDARD_FILE(_Pointer) \
> -  ((BOOLEAN)(_GET_FILETYPE (_Pointer) == 5))
> -#define IS_FE_SYMLINK(_Pointer) \
> -  ((BOOLEAN)(_GET_FILETYPE (_Pointer) == 12))
> +#define FE_ICB_FILE_TYPE(_Ptr) \
> +  (UDF_FILE_ENTRY_TYPE)( \
> +  (UDF_TAG_ID ((UDF_DESCRIPTOR_TAG *)(_Ptr)) == UdfFileEntry ? \
> +   ((UDF_FILE_ENTRY *)(_Ptr))->IcbTag.FileType : \
> +   ((UDF_EXTENDED_FILE_ENTRY *)(_Ptr))->IcbTag.FileType))
> +
> +typedef enum {
> +  UdfFileEntryDirectory = 4,
> +  UdfFileEntryStandardFile = 5,
> +  UdfFileEntrySymlink = 12,
> +} UDF_FILE_ENTRY_TYPE;
> 
>  #define HIDDEN_FILE     (1 << 0)
>  #define DIRECTORY_FILE  (1 << 1)
>  #define DELETED_FILE    (1 << 2)
>  #define PARENT_FILE     (1 << 3)
> 
> -#define _GET_FILE_CHARS(_Pointer) \
> -  (((UDF_FILE_IDENTIFIER_DESCRIPTOR *)(_Pointer))->FileCharacteristics)
> -
> -#define IS_FID_HIDDEN_FILE(_Pointer) \
> -  ((BOOLEAN)(_GET_FILE_CHARS (_Pointer) & HIDDEN_FILE))
> -#define IS_FID_DIRECTORY_FILE(_Pointer) \
> -  ((BOOLEAN)(_GET_FILE_CHARS (_Pointer) & DIRECTORY_FILE))
> -#define IS_FID_DELETED_FILE(_Pointer) \
> -  ((BOOLEAN)(_GET_FILE_CHARS (_Pointer) & DELETED_FILE))
> -#define IS_FID_PARENT_FILE(_Pointer) \
> -  ((BOOLEAN)(_GET_FILE_CHARS (_Pointer) & PARENT_FILE))
> -#define IS_FID_NORMAL_FILE(_Pointer) \
> -  ((BOOLEAN)(!IS_FID_DIRECTORY_FILE (_Pointer) && \
> -         !IS_FID_PARENT_FILE (_Pointer)))
> +#define IS_FID_HIDDEN_FILE(_Fid) \
> +  (BOOLEAN)((_Fid)->FileCharacteristics & HIDDEN_FILE)
> +#define IS_FID_DIRECTORY_FILE(_Fid) \
> +  (BOOLEAN)((_Fid)->FileCharacteristics & DIRECTORY_FILE)
> +#define IS_FID_DELETED_FILE(_Fid) \
> +  (BOOLEAN)((_Fid)->FileCharacteristics & DELETED_FILE)
> +#define IS_FID_PARENT_FILE(_Fid) \
> +  (BOOLEAN)((_Fid)->FileCharacteristics & PARENT_FILE)
> +#define IS_FID_NORMAL_FILE(_Fid) \
> +  (BOOLEAN)(!IS_FID_DIRECTORY_FILE (_Fid) && \
> +            !IS_FID_PARENT_FILE (_Fid))
> 
>  typedef enum {
>    ShortAdsSequence,
> @@ -152,14 +125,8 @@ typedef enum {
>  #define IS_VALID_COMPRESSION_ID(_CompId) \
>    ((BOOLEAN)((_CompId) == 8 || (_CompId) == 16))
> 
> -#define LV_BLOCK_SIZE(_Vol, _LvNum) \
> -  (_Vol)->LogicalVolDescs[(_LvNum)]->LogicalBlockSize
> -
>  #define UDF_STANDARD_IDENTIFIER_LENGTH   5
> 
> -#define LV_UDF_REVISION(_Lv) \
> -  *(UINT16 *)(UINTN)(_Lv)->DomainIdentifier.IdentifierSuffix
> -
>  #pragma pack(1)
> 
>  typedef struct {
> @@ -186,17 +153,6 @@ typedef struct {
>  #pragma pack(1)
> 
>  typedef struct {
> -  UINT8           CharacterSetType;
> -  UINT8           CharacterSetInfo[63];
> -} UDF_CHAR_SPEC;
> -
> -typedef struct {
> -  UINT8           Flags;
> -  UINT8           Identifier[23];
> -  UINT8           IdentifierSuffix[8];
> -} UDF_ENTITY_ID;
> -
> -typedef struct {
>    UINT16          TypeAndTimezone;
>    INT16           Year;
>    UINT8           Month;
> @@ -210,17 +166,6 @@ typedef struct {
>  } UDF_TIMESTAMP;
> 
>  typedef struct {
> -  UINT32        LogicalBlockNumber;
> -  UINT16        PartitionReferenceNumber;
> -} UDF_LB_ADDR;
> -
> -typedef struct {
> -  UINT32                           ExtentLength;
> -  UDF_LB_ADDR                      ExtentLocation;
> -  UINT8                            ImplementationUse[6];
> -} UDF_LONG_ALLOCATION_DESCRIPTOR;
> -
> -typedef struct {
>    UDF_DESCRIPTOR_TAG                 DescriptorTag;
>    UINT32                             PrevAllocationExtentDescriptor;
>    UINT32                             LengthOfAllocationDescriptors;
> @@ -235,6 +180,17 @@ typedef struct {
>  } UDF_VOLUME_DESCRIPTOR;
> 
>  typedef struct {
> +  UDF_DESCRIPTOR_TAG             DescriptorTag;
> +  UDF_TIMESTAMP                  RecordingDateTime;
> +  UINT32                         IntegrityType;
> +  UDF_EXTENT_AD                  NextIntegrityExtent;
> +  UINT8                          LogicalVolumeContentsUse[32];
> +  UINT32                         NumberOfPartitions;
> +  UINT32                         LengthOfImplementationUse;
> +  UINT8                          Data[0];
> +} UDF_LOGICAL_VOLUME_INTEGRITY;
> +
> +typedef struct {
>    UDF_DESCRIPTOR_TAG         DescriptorTag;
>    UINT32                     VolumeDescriptorSequenceNumber;
>    UINT16                     PartitionFlags;
> @@ -251,33 +207,6 @@ typedef struct {
> 
>  typedef struct {
>    UDF_DESCRIPTOR_TAG              DescriptorTag;
> -  UINT32                          VolumeDescriptorSequenceNumber;
> -  UDF_CHAR_SPEC                   DescriptorCharacterSet;
> -  UINT8                           LogicalVolumeIdentifier[128];
> -  UINT32                          LogicalBlockSize;
> -  UDF_ENTITY_ID                   DomainIdentifier;
> -  UDF_LONG_ALLOCATION_DESCRIPTOR  LogicalVolumeContentsUse;
> -  UINT32                          MapTableLength;
> -  UINT32                          NumberOfPartitionMaps;
> -  UDF_ENTITY_ID                   ImplementationIdentifier;
> -  UINT8                           ImplementationUse[128];
> -  UDF_EXTENT_AD                   IntegritySequenceExtent;
> -  UINT8                           PartitionMaps[6];
> -} UDF_LOGICAL_VOLUME_DESCRIPTOR;
> -
> -typedef struct {
> -  UDF_DESCRIPTOR_TAG             DescriptorTag;
> -  UDF_TIMESTAMP                  RecordingDateTime;
> -  UINT32                         IntegrityType;
> -  UDF_EXTENT_AD                  NextIntegrityExtent;
> -  UINT8                          LogicalVolumeContentsUse[32];
> -  UINT32                         NumberOfPartitions;
> -  UINT32                         LengthOfImplementationUse;
> -  UINT8                          Data[0];
> -} UDF_LOGICAL_VOLUME_INTEGRITY;
> -
> -typedef struct {
> -  UDF_DESCRIPTOR_TAG              DescriptorTag;
>    UDF_TIMESTAMP                   RecordingDateAndTime;
>    UINT16                          InterchangeLevel;
>    UINT16                          MaximumInterchangeLevel;
> @@ -389,12 +318,10 @@ typedef struct {
>  // UDF filesystem driver's private data
>  //
>  typedef struct {
> -  UDF_LOGICAL_VOLUME_DESCRIPTOR  **LogicalVolDescs;
> -  UINTN                          LogicalVolDescsNo;
> -  UDF_PARTITION_DESCRIPTOR       **PartitionDescs;
> -  UINTN                          PartitionDescsNo;
> -  UDF_FILE_SET_DESCRIPTOR        **FileSetDescs;
> -  UINTN                          FileSetDescsNo;
> +  UINT64                         MainVdsStartLocation;
> +  UDF_LOGICAL_VOLUME_DESCRIPTOR  LogicalVolDesc;
> +  UDF_PARTITION_DESCRIPTOR       PartitionDesc;
> +  UDF_FILE_SET_DESCRIPTOR        FileSetDesc;
>    UINTN                          FileEntrySize;
>  } UDF_VOLUME_INFO;
> 
> @@ -884,17 +811,6 @@ ResolveSymlink (
>    );
> 
>  /**
> -  Clean up in-memory UDF volume information.
> -
> -  @param[in] Volume Volume information pointer.
> -
> -**/
> -VOID
> -CleanupVolumeInformation (
> -  IN UDF_VOLUME_INFO *Volume
> -  );
> -
> -/**
>    Clean up in-memory UDF file information.
> 
>    @param[in] File File information pointer.
> --
> 2.11.0
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel


  reply	other threads:[~2017-09-21  8:05 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-20 18:16 [PATCH v3 0/2] UDF partition driver fix Paulo Alcantara
2017-09-20 18:16 ` [PATCH v3 1/2] MdePkg: Add UDF volume structure definitions Paulo Alcantara
2017-09-22  2:50   ` Ni, Ruiyu
2017-09-22 13:54     ` Paulo Alcantara
2017-09-20 18:16 ` [PATCH v3 2/2] MdeModulePkg/PartitionDxe: Fix creation of UDF logical partition Paulo Alcantara
2017-09-21  8:08   ` Wu, Hao A [this message]
2017-09-21  8:49     ` Zeng, Star
2017-09-21 13:22       ` Paulo Alcantara
2017-09-21 12:44   ` Wu, Hao A
2017-09-21 13:29     ` Paulo Alcantara
2017-09-21 13:47       ` Zeng, Star
2017-09-21 13:52         ` Paulo Alcantara
2017-09-21 14:16           ` Paulo Alcantara
2017-09-22  2:26             ` Zeng, Star
2017-09-22  2:59               ` Ni, Ruiyu
2017-09-20 19:25 ` [PATCH v3 0/2] UDF partition driver fix Laszlo Ersek
2017-09-20 19:38   ` Paulo Alcantara

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=B80AF82E9BFB8E4FBD8C89DA810C6A0931D038E0@SHSMSX101.ccr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox