From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 8382621E945E6 for ; Sun, 17 Sep 2017 17:57:31 -0700 (PDT) Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 17 Sep 2017 18:00:34 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.42,410,1500966000"; d="scan'208";a="129655755" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by orsmga004.jf.intel.com with ESMTP; 17 Sep 2017 18:00:33 -0700 Received: from fmsmsx154.amr.corp.intel.com (10.18.116.70) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.319.2; Sun, 17 Sep 2017 18:00:33 -0700 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by FMSMSX154.amr.corp.intel.com (10.18.116.70) with Microsoft SMTP Server (TLS) id 14.3.319.2; Sun, 17 Sep 2017 18:00:32 -0700 Received: from shsmsx151.ccr.corp.intel.com ([169.254.3.98]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.213]) with mapi id 14.03.0319.002; Mon, 18 Sep 2017 09:00:30 +0800 From: "Ni, Ruiyu" To: Paulo Alcantara , "edk2-devel@lists.01.org" CC: "Dong, Eric" , "Zeng, Star" , Laszlo Ersek Thread-Topic: [PATCH v2 3/3] MdeModulePkg/UdfDxe: Rework driver to support PartitionDxe changes Thread-Index: AQHTL7bbu43uCkCp2U6F9eE1B79p1qK50vwQ Date: Mon, 18 Sep 2017 01:00:29 +0000 Message-ID: <734D49CCEBEEF84792F5B80ED585239D5BA44272@SHSMSX151.ccr.corp.intel.com> References: <600e6e752b285bbe960ad22d8ae969cbbd84b85b.1505653040.git.pcacjr@zytor.com> In-Reply-To: <600e6e752b285bbe960ad22d8ae969cbbd84b85b.1505653040.git.pcacjr@zytor.com> Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH v2 3/3] MdeModulePkg/UdfDxe: Rework driver to support PartitionDxe changes 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: Mon, 18 Sep 2017 00:57:31 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Paulo, With the change in partition driver, I suppose UdfDxe driver only needs to take care of area covered by the partition descriptor. But why StartMainVolumeDescriptorSequence() still reads LVD, TD, and PD? I thought the UdfDxe driver's logic can be simplified a lot. There should be no duplicated logic in Partition driver and udf driver. Can you explain more? Thanks/Ray > -----Original Message----- > From: Paulo Alcantara [mailto:pcacjr@zytor.com] > Sent: Sunday, September 17, 2017 9:13 PM > To: edk2-devel@lists.01.org > Cc: Paulo Alcantara ; Dong, Eric ; > Ni, Ruiyu ; Zeng, Star ; Laszlo > Ersek > Subject: [PATCH v2 3/3] MdeModulePkg/UdfDxe: Rework driver to support > PartitionDxe changes >=20 > This patch reworks the driver to support Partition driver changes. >=20 > Cc: Eric Dong > Cc: Paulo Alcantara > Cc: Ruiyu Ni > Cc: Star Zeng > Cc: Laszlo Ersek > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Paulo Alcantara > --- > MdeModulePkg/Universal/Disk/UdfDxe/File.c | 13 +- > MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c | 515 > ++++++++------------ > MdeModulePkg/Universal/Disk/UdfDxe/Udf.c | 7 - > MdeModulePkg/Universal/Disk/UdfDxe/Udf.h | 88 +--- > 4 files changed, 204 insertions(+), 419 deletions(-) >=20 > diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/File.c > b/MdeModulePkg/Universal/Disk/UdfDxe/File.c > index 01361141bb..f2c62967e8 100644 > --- a/MdeModulePkg/Universal/Disk/UdfDxe/File.c > +++ b/MdeModulePkg/Universal/Disk/UdfDxe/File.c > @@ -100,6 +100,7 @@ UdfOpenVolume ( > &PrivFsData->Volume, > &PrivFsData->Root > ); > + ASSERT_EFI_ERROR (Status); > if (EFI_ERROR (Status)) { > goto Error_Find_Root_Dir; > } > @@ -131,7 +132,6 @@ Error_Alloc_Priv_File_Data: > CleanupFileInformation (&PrivFsData->Root); >=20 > Error_Find_Root_Dir: > - CleanupVolumeInformation (&PrivFsData->Volume); >=20 > Error_Read_Udf_Volume: > Error_Invalid_Params: > @@ -528,7 +528,6 @@ UdfClose ( > EFI_TPL OldTpl; > EFI_STATUS Status; > PRIVATE_UDF_FILE_DATA *PrivFileData; > - PRIVATE_UDF_SIMPLE_FS_DATA *PrivFsData; >=20 > OldTpl =3D gBS->RaiseTPL (TPL_CALLBACK); >=20 > @@ -541,8 +540,6 @@ UdfClose ( >=20 > PrivFileData =3D PRIVATE_UDF_FILE_DATA_FROM_THIS (This); >=20 > - PrivFsData =3D PRIVATE_UDF_SIMPLE_FS_DATA_FROM_THIS (PrivFileData- > >SimpleFs); > - > if (!PrivFileData->IsRootDirectory) { > CleanupFileInformation (&PrivFileData->File); >=20 > @@ -551,10 +548,6 @@ UdfClose ( > } > } >=20 > - if (--PrivFsData->OpenFiles =3D=3D 0) { > - CleanupVolumeInformation (&PrivFsData->Volume); > - } > - > FreePool ((VOID *)PrivFileData); >=20 > Exit: > @@ -787,7 +780,7 @@ UdfGetInfo ( > } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { > String =3D VolumeLabel; >=20 > - FileSetDesc =3D PrivFsData->Volume.FileSetDescs[0]; > + FileSetDesc =3D &PrivFsData->Volume.FileSetDesc; >=20 > OstaCompressed =3D &FileSetDesc->LogicalVolumeIdentifier[0]; >=20 > @@ -846,7 +839,7 @@ UdfGetInfo ( > FileSystemInfo->Size =3D FileSystemInfoLength; > FileSystemInfo->ReadOnly =3D TRUE; > FileSystemInfo->BlockSize =3D > - LV_BLOCK_SIZE (&PrivFsData->Volume, UDF_DEFAULT_LV_NUM); > + PrivFsData->Volume.LogicalVolDesc.LogicalBlockSize; > FileSystemInfo->VolumeSize =3D VolumeSize; > FileSystemInfo->FreeSpace =3D FreeSpaceSize; >=20 > diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c > b/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c > index 4609580b30..63b643e60a 100644 > --- a/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c > +++ b/MdeModulePkg/Universal/Disk/UdfDxe/FileSystemOperations.c > @@ -60,154 +60,111 @@ FindAnchorVolumeDescriptorPointer ( >=20 > EFI_STATUS > StartMainVolumeDescriptorSequence ( > - IN EFI_BLOCK_IO_PROTOCOL *BlockIo, > - IN EFI_DISK_IO_PROTOCOL *DiskIo, > - IN UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER *AnchorPoint, > - OUT UDF_VOLUME_INFO *Volume > + IN EFI_BLOCK_IO_PROTOCOL *BlockIo, > + IN EFI_DISK_IO_PROTOCOL *DiskIo, > + 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; > + UINT64 BlockOffset; > + VOID *Buffer; > + UINT32 LogicalBlockSize; > + > + BlockSize =3D BlockIo->Media->BlockSize; >=20 > // > - // 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 Descripto= rs and > - // Partitions Descriptors and save them in memory, accordingly. > - // > - // Note also that each descriptor will be aligned on a block size (Blo= ckSize) > - // boundary, so we need to read one block at a time. > + // Allocate buffer for reading disk blocks > // > - BlockSize =3D BlockIo->Media->BlockSize; > - ExtentAd =3D &AnchorPoint->MainVolumeDescriptorSequenceExtent; > - StartingLsn =3D (UINT64)ExtentAd->ExtentLocation; > - EndingLsn =3D StartingLsn + DivU64x32 ( > - (UINT64)ExtentAd->ExtentLength, > - BlockSize > - ); > - > - Volume->LogicalVolDescs =3D > - (UDF_LOGICAL_VOLUME_DESCRIPTOR **)AllocateZeroPool (ExtentAd- > >ExtentLength); > - if (Volume->LogicalVolDescs =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - Volume->PartitionDescs =3D > - (UDF_PARTITION_DESCRIPTOR **)AllocateZeroPool (ExtentAd- > >ExtentLength); > - if (Volume->PartitionDescs =3D=3D NULL) { > - Status =3D EFI_OUT_OF_RESOURCES; > - goto Error_Alloc_Pds; > - } > - > - Buffer =3D AllocateZeroPool (BlockSize); > + Buffer =3D AllocateZeroPool ((UINTN)BlockSize); > if (Buffer =3D=3D NULL) { > - Status =3D EFI_OUT_OF_RESOURCES; > - goto Error_Alloc_Buf; > + return EFI_OUT_OF_RESOURCES; > } >=20 > - Volume->LogicalVolDescsNo =3D 0; > - Volume->PartitionDescsNo =3D 0; > - > - while (StartingLsn <=3D EndingLsn) { > + // > + // As per UDF 2.60 specification: > + // > + // --- > + // For the purpose of interchange, Partition Maps shall be limited to > + // Partition Map type 1, except type 2 maps. > + // --- > + // A Partition Descriptor Access Type of read-only, rewritable, // > + overwritable, write-once and pseudo-overwritable shall be // > + supported. There shall be exactly one prevailing Partition // > + Descriptor recorded per volume, with one exception. For Volume // > + Sets that consist of single volume, the volume may contain 2 non- // > + overlapping Partitions with 2 prevailing Partition Descriptors only > + // if one has an Access Type of read-only and the other has an // > + Access Type of rewritable, overwritable, or write-once. The // > + Logical Volume for this volume would consist of the contents of // > + both partitions. > + // --- > + // > + // 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 make sure we got both LVD and PD -- that is, if > + we are // here, that means Partition driver was able to find them both > previously. > + // > + for (BlockOffset =3D 0; > + BlockOffset < MultU64x32 (BlockIo->Media->LastBlock, > + BlockIo->Media->BlockSize); > + BlockOffset +=3D BlockSize) { > + // Read disk block > + // > Status =3D DiskIo->ReadDisk ( > DiskIo, > BlockIo->Media->MediaId, > - MultU64x32 (StartingLsn, BlockSize), > + BlockOffset, > BlockSize, > Buffer > ); > if (EFI_ERROR (Status)) { > - goto Error_Read_Disk_Blk; > + goto Out_Free; > } >=20 > + // > + // Check if read block is a Terminating Descriptor > + // > if (IS_TD (Buffer)) { > // > - // Found a Terminating Descriptor. Stop the sequence then. > + // Terminate Main Volume Descriptor Sequence > // > break; > } >=20 > if (IS_LVD (Buffer)) { > // > - // Found a Logical Volume Descriptor. > + // Save Logical Volume Descriptor > // > - LogicalVolDesc =3D > - (UDF_LOGICAL_VOLUME_DESCRIPTOR *) > - AllocateZeroPool (sizeof (UDF_LOGICAL_VOLUME_DESCRIPTOR)); > - if (LogicalVolDesc =3D=3D NULL) { > - Status =3D EFI_OUT_OF_RESOURCES; > - goto Error_Alloc_Lvd; > - } > - > - CopyMem ((VOID *)LogicalVolDesc, Buffer, > - sizeof (UDF_LOGICAL_VOLUME_DESCRIPTOR)); > - Volume->LogicalVolDescs[Volume->LogicalVolDescsNo++] =3D > LogicalVolDesc; > + CopyMem (&Volume->LogicalVolDesc, Buffer, sizeof > + (Volume->LogicalVolDesc)); > } else if (IS_PD (Buffer)) { > // > - // Found a Partition Descriptor. > + // Save Partition Descriptor > // > - PartitionDesc =3D > - (UDF_PARTITION_DESCRIPTOR *) > - AllocateZeroPool (sizeof (UDF_PARTITION_DESCRIPTOR)); > - if (PartitionDesc =3D=3D NULL) { > - Status =3D EFI_OUT_OF_RESOURCES; > - goto Error_Alloc_Pd; > - } > - > - CopyMem ((VOID *)PartitionDesc, Buffer, > - sizeof (UDF_PARTITION_DESCRIPTOR)); > - Volume->PartitionDescs[Volume->PartitionDescsNo++] =3D PartitionDe= sc; > + CopyMem (&Volume->PartitionDesc, Buffer, sizeof > + (Volume->PartitionDesc)); > } > - > - StartingLsn++; > } >=20 > // > - // 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 =3D LV_BLOCK_SIZE (Volume, UDF_DEFAULT_LV_NUM); > + LogicalBlockSize =3D Volume->LogicalVolDesc.LogicalBlockSize; > if (LogicalBlockSize >=3D UDF_LOGICAL_SECTOR_SIZE) { > - Volume->FileEntrySize =3D LogicalBlockSize; > + Volume->FileEntrySize =3D (UINTN)LogicalBlockSize; > } else { > Volume->FileEntrySize =3D UDF_LOGICAL_SECTOR_SIZE; > } >=20 > - FreePool (Buffer); > - > - return EFI_SUCCESS; > - > -Error_Alloc_Pd: > -Error_Alloc_Lvd: > - for (Index =3D 0; Index < Volume->PartitionDescsNo; Index++) { > - FreePool ((VOID *)Volume->PartitionDescs[Index]); > - } > - > - for (Index =3D 0; Index < Volume->LogicalVolDescsNo; Index++) { > - FreePool ((VOID *)Volume->LogicalVolDescs[Index]); > - } > + Status =3D EFI_SUCCESS; >=20 > -Error_Read_Disk_Blk: > +Out_Free: > + // > + // Free block read buffer > + // > FreePool (Buffer); >=20 > -Error_Alloc_Buf: > - FreePool ((VOID *)Volume->PartitionDescs); > - Volume->PartitionDescs =3D NULL; > - > -Error_Alloc_Pds: > - FreePool ((VOID *)Volume->LogicalVolDescs); > - Volume->LogicalVolDescs =3D NULL; > - > return Status; > } >=20 > @@ -223,11 +180,9 @@ GetPdFromLongAd ( > ) > { > UDF_LOGICAL_VOLUME_DESCRIPTOR *LogicalVolDesc; > - UINTN Index; > - UDF_PARTITION_DESCRIPTOR *PartitionDesc; > UINT16 PartitionNum; >=20 > - LogicalVolDesc =3D Volume->LogicalVolDescs[UDF_DEFAULT_LV_NUM]; > + LogicalVolDesc =3D &Volume->LogicalVolDesc; >=20 > switch (LV_UDF_REVISION (LogicalVolDesc)) { > case 0x0102: > @@ -252,19 +207,21 @@ GetPdFromLongAd ( > PartitionNum =3D *(UINT16 *)((UINTN)&LogicalVolDesc->PartitionMaps[4= ]); > break; > case 0x0260: > - // > - // Fall through. > - // > - default: > PartitionNum =3D LongAd->ExtentLocation.PartitionReferenceNumber; > break; > + default: > + // > + // Unhandled UDF revision > + // > + return NULL; > } >=20 > - for (Index =3D 0; Index < Volume->PartitionDescsNo; Index++) { > - PartitionDesc =3D Volume->PartitionDescs[Index]; > - if (PartitionDesc->PartitionNumber =3D=3D PartitionNum) { > - return PartitionDesc; > - } > + // > + // Check if partition number matches Partition Descriptor found in > + Main Volume // Descriptor Sequence. > + // > + if (Volume->PartitionDesc.PartitionNumber =3D=3D PartitionNum) { > + return &Volume->PartitionDesc; > } >=20 > return NULL; > @@ -284,8 +241,9 @@ GetLongAdLsn ( > PartitionDesc =3D GetPdFromLongAd (Volume, LongAd); > ASSERT (PartitionDesc !=3D NULL); >=20 > - return (UINT64)PartitionDesc->PartitionStartingLocation + > - LongAd->ExtentLocation.LogicalBlockNumber; > + return (UINT64)PartitionDesc->PartitionStartingLocation - > + Volume->MainVdsStartLocation + > + LongAd->ExtentLocation.LogicalBlockNumber; > } >=20 > // > @@ -293,12 +251,13 @@ GetLongAdLsn ( > // > UINT64 > GetShortAdLsn ( > + IN UDF_VOLUME_INFO *Volume, > IN UDF_PARTITION_DESCRIPTOR *PartitionDesc, > IN UDF_SHORT_ALLOCATION_DESCRIPTOR *ShortAd > ) > { > - return (UINT64)PartitionDesc->PartitionStartingLocation + > - ShortAd->ExtentPosition; > + return (UINT64)PartitionDesc->PartitionStartingLocation - > + Volume->MainVdsStartLocation + ShortAd->ExtentPosition; > } >=20 > // > @@ -311,36 +270,39 @@ 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; >=20 > - LogicalVolDesc =3D Volume->LogicalVolDescs[LogicalVolDescNum]; > + LogicalVolDesc =3D &Volume->LogicalVolDesc; > Lsn =3D GetLongAdLsn (Volume, &LogicalVolDesc- > >LogicalVolumeContentsUse); >=20 > // > - // 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 =3D 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; > } >=20 > // > - // 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 (!IS_FSD (&Volume->FileSetDesc)) { > return EFI_VOLUME_CORRUPTED; > } >=20 > @@ -348,71 +310,6 @@ FindFileSetDescriptor ( } >=20 > // > -// Get all File Set Descriptors for each 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 =3D > - (UDF_FILE_SET_DESCRIPTOR **)AllocateZeroPool ( > - Volume->LogicalVolDescsNo * sizeof (UDF_FILE_SET_DESCRIPTOR)); > - if (Volume->FileSetDescs =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - for (Index =3D 0; Index < Volume->LogicalVolDescsNo; Index++) { > - FileSetDesc =3D AllocateZeroPool (sizeof (UDF_FILE_SET_DESCRIPTOR)); > - if (FileSetDesc =3D=3D NULL) { > - Status =3D EFI_OUT_OF_RESOURCES; > - goto Error_Alloc_Fsd; > - } > - > - // > - // Find a FSD for this LVD. > - // > - Status =3D FindFileSetDescriptor ( > - BlockIo, > - DiskIo, > - Volume, > - Index, > - FileSetDesc > - ); > - if (EFI_ERROR (Status)) { > - goto Error_Find_Fsd; > - } > - > - // > - // Got one. Save it. > - // > - Volume->FileSetDescs[Index] =3D FileSetDesc; > - } > - > - Volume->FileSetDescsNo =3D Volume->LogicalVolDescsNo; > - return EFI_SUCCESS; > - > -Error_Find_Fsd: > - Count =3D Index + 1; > - for (Index =3D 0; Index < Count; Index++) { > - FreePool ((VOID *)Volume->FileSetDescs[Index]); > - } > - > - FreePool ((VOID *)Volume->FileSetDescs); > - Volume->FileSetDescs =3D NULL; > - > -Error_Alloc_Fsd: > - return Status; > -} > - > -// > // Read Volume and File Structure on an UDF file system. > // > EFI_STATUS > @@ -424,9 +321,10 @@ ReadVolumeFileStructure ( { > EFI_STATUS Status; > UDF_ANCHOR_VOLUME_DESCRIPTOR_POINTER AnchorPoint; > + UDF_EXTENT_AD *ExtentAd; >=20 > // > - // Find an AVDP. > + // Find Anchor Volume Descriptor Pointer > // > Status =3D FindAnchorVolumeDescriptorPointer ( > BlockIo, > @@ -438,12 +336,18 @@ ReadVolumeFileStructure ( > } >=20 > // > - // AVDP has been found. Start MVDS. > + // Save Main VDS start block number > + // > + ExtentAd =3D &AnchorPoint.MainVolumeDescriptorSequenceExtent; > + > + Volume->MainVdsStartLocation =3D (UINT64)ExtentAd->ExtentLocation; > + > + // > + // Start Main Volume Descriptor Sequence. > // > Status =3D StartMainVolumeDescriptorSequence ( > BlockIo, > DiskIo, > - &AnchorPoint, > Volume > ); > if (EFI_ERROR (Status)) { > @@ -699,6 +603,7 @@ GetAllocationDescriptorLsn ( > return GetLongAdLsn (Volume, (UDF_LONG_ALLOCATION_DESCRIPTOR > *)Ad); > } else if (RecordingFlags =3D=3D SHORT_ADS_SEQUENCE) { > return GetShortAdLsn ( > + Volume, > GetPdFromLongAd (Volume, ParentIcb), > (UDF_SHORT_ALLOCATION_DESCRIPTOR *)Ad > ); > @@ -740,7 +645,7 @@ GetAedAdsOffset ( > return EFI_OUT_OF_RESOURCES; > } >=20 > - LogicalBlockSize =3D LV_BLOCK_SIZE (Volume, UDF_DEFAULT_LV_NUM); > + LogicalBlockSize =3D Volume->LogicalVolDesc.LogicalBlockSize; >=20 > // > // Read extent. > @@ -890,7 +795,7 @@ ReadFile ( > UINT32 ExtentLength; > UDF_FE_RECORDING_FLAGS RecordingFlags; >=20 > - LogicalBlockSize =3D LV_BLOCK_SIZE (Volume, UDF_DEFAULT_LV_NUM); > + LogicalBlockSize =3D Volume->LogicalVolDesc.LogicalBlockSize; > DoFreeAed =3D FALSE; >=20 > // > @@ -1355,6 +1260,9 @@ ReadUdfVolumeInformation ( { > EFI_STATUS Status; >=20 > + // > + // Read all necessary UDF volume information and keep it private to > + the driver // > Status =3D ReadVolumeFileStructure ( > BlockIo, > DiskIo, > @@ -1364,13 +1272,12 @@ ReadUdfVolumeInformation ( > return Status; > } >=20 > - Status =3D GetFileSetDescriptors ( > - BlockIo, > - DiskIo, > - Volume > - ); > + // > + // Find File Set Descriptor > + // > + Status =3D FindFileSetDescriptor (BlockIo, DiskIo, Volume); > if (EFI_ERROR (Status)) { > - CleanupVolumeInformation (Volume); > + return Status; > } >=20 > return Status; > @@ -1407,7 +1314,7 @@ FindRootDirectory ( > BlockIo, > DiskIo, > Volume, > - &Volume->FileSetDescs[0]->RootDirectoryIcb, > + &Volume->FileSetDesc.RootDirectoryIcb, > &File->FileEntry > ); > if (EFI_ERROR (Status)) { > @@ -1424,7 +1331,7 @@ FindRootDirectory ( > L"\\", > NULL, > &Parent, > - &Volume->FileSetDescs[0]->RootDirectoryIcb, > + &Volume->FileSetDesc.RootDirectoryIcb, > File > ); > if (EFI_ERROR (Status)) { > @@ -1465,7 +1372,7 @@ FindFileEntry ( > UINT32 LogicalBlockSize; >=20 > Lsn =3D GetLongAdLsn (Volume, Icb); > - LogicalBlockSize =3D LV_BLOCK_SIZE (Volume, UDF_DEFAULT_LV_NUM); > + LogicalBlockSize =3D Volume->LogicalVolDesc.LogicalBlockSize; >=20 > *FileEntry =3D AllocateZeroPool (Volume->FileEntrySize); > if (*FileEntry =3D=3D NULL) { > @@ -1959,43 +1866,6 @@ Error_Find_File: > } >=20 > /** > - 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 !=3D NULL) { > - for (Index =3D 0; Index < Volume->LogicalVolDescsNo; Index++) { > - FreePool ((VOID *)Volume->LogicalVolDescs[Index]); > - } > - FreePool ((VOID *)Volume->LogicalVolDescs); > - } > - > - if (Volume->PartitionDescs !=3D NULL) { > - for (Index =3D 0; Index < Volume->PartitionDescsNo; Index++) { > - FreePool ((VOID *)Volume->PartitionDescs[Index]); > - } > - FreePool ((VOID *)Volume->PartitionDescs); > - } > - > - if (Volume->FileSetDescs !=3D NULL) { > - for (Index =3D 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. >=20 > @param[in] File File information pointer. > @@ -2249,91 +2119,100 @@ 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 =3D 0; > - *FreeSpaceSize =3D 0; > - > - for (Index =3D 0; Index < Volume->LogicalVolDescsNo; Index++) { > - CopyMem ((VOID *)&ExtentAd, > - (VOID *)&Volume->LogicalVolDescs[Index]- > >IntegritySequenceExtent, > - sizeof (UDF_EXTENT_AD)); > - if (ExtentAd.ExtentLength =3D=3D 0) { > - continue; > - } > + EFI_STATUS Status; > + UDF_LOGICAL_VOLUME_DESCRIPTOR *LogicalVolDesc; > + UDF_EXTENT_AD *ExtentAd; > + UINT64 Lsn; > + UINT32 LogicalBlockSize; > + UDF_LOGICAL_VOLUME_INTEGRITY *LogicalVolInt; > + UINTN Index; > + UINTN Length; > + UINT32 LsnsNo; >=20 > - LogicalBlockSize =3D LV_BLOCK_SIZE (Volume, Index); > + LogicalVolDesc =3D &Volume->LogicalVolDesc; >=20 > - Read_Next_Sequence: > - LogicalVolInt =3D (UDF_LOGICAL_VOLUME_INTEGRITY *) > - AllocatePool (ExtentAd.ExtentLength); > - if (LogicalVolInt =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > + ExtentAd =3D &LogicalVolDesc->IntegritySequenceExtent; >=20 > - Lsn =3D (UINT64)ExtentAd.ExtentLocation; > + if (ExtentAd->ExtentLength =3D=3D 0) { > + return EFI_VOLUME_CORRUPTED; > + } >=20 > - Status =3D DiskIo->ReadDisk ( > - DiskIo, > - BlockIo->Media->MediaId, > - MultU64x32 (Lsn, LogicalBlockSize), > - ExtentAd.ExtentLength, > - (VOID *)LogicalVolInt > - ); > - if (EFI_ERROR (Status)) { > - FreePool ((VOID *)LogicalVolInt); > - return Status; > - } > + LogicalVolInt =3D AllocatePool (ExtentAd->ExtentLength); if > + (LogicalVolInt =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } >=20 > - if (!IS_LVID (LogicalVolInt)) { > - FreePool ((VOID *)LogicalVolInt); > - return EFI_VOLUME_CORRUPTED; > - } > + // > + // Get location of Logical Volume Integrity Descriptor // Lsn =3D > + (UINT64)ExtentAd->ExtentLocation - Volume->MainVdsStartLocation; >=20 > - Length =3D LogicalVolInt->NumberOfPartitions; > - for (Index =3D 0; Index < Length; Index +=3D sizeof (UINT32)) { > - LsnsNo =3D *(UINT32 *)((UINT8 *)LogicalVolInt->Data + Index); > - if (LsnsNo =3D=3D 0xFFFFFFFFUL) { > - // > - // Size not specified. > - // > - continue; > - } > + LogicalBlockSize =3D LogicalVolDesc->LogicalBlockSize; >=20 > - *FreeSpaceSize +=3D MultU64x32 ((UINT64)LsnsNo, LogicalBlockSize); > - } > + // > + // Read disk block > + // > + Status =3D DiskIo->ReadDisk ( > + DiskIo, > + BlockIo->Media->MediaId, > + MultU64x32 (Lsn, LogicalBlockSize), > + ExtentAd->ExtentLength, > + LogicalVolInt > + ); > + if (EFI_ERROR (Status)) { > + goto Out_Free; > + } >=20 > - Length =3D (LogicalVolInt->NumberOfPartitions * sizeof (UINT32)) << = 1; > - for (; Index < Length; Index +=3D sizeof (UINT32)) { > - LsnsNo =3D *(UINT32 *)((UINT8 *)LogicalVolInt->Data + Index); > - if (LsnsNo =3D=3D 0xFFFFFFFFUL) { > - // > - // Size not specified. > - // > - continue; > - } > + // > + // Check if read block is a Logical Volume Integrity Descriptor // > + if (!IS_LVID (LogicalVolInt)) { > + Status =3D EFI_VOLUME_CORRUPTED; > + goto Out_Free; > + } >=20 > - *VolumeSize +=3D MultU64x32 ((UINT64)LsnsNo, LogicalBlockSize); > - } > + *VolumeSize =3D 0; > + *FreeSpaceSize =3D 0; >=20 > - CopyMem ((VOID *)&ExtentAd,(VOID *)&LogicalVolInt- > >NextIntegrityExtent, > - sizeof (UDF_EXTENT_AD)); > - if (ExtentAd.ExtentLength > 0) { > - FreePool ((VOID *)LogicalVolInt); > - goto Read_Next_Sequence; > + Length =3D LogicalVolInt->NumberOfPartitions; > + for (Index =3D 0; Index < Length; Index +=3D sizeof (UINT32)) { > + LsnsNo =3D *(UINT32 *)((UINT8 *)LogicalVolInt->Data + Index); > + // > + // Check if size is not specified > + // > + if (LsnsNo =3D=3D 0xFFFFFFFFUL) { > + continue; > } > + // > + // Accumulate free space size > + // > + *FreeSpaceSize +=3D MultU64x32 ((UINT64)LsnsNo, LogicalBlockSize); = } >=20 > - FreePool ((VOID *)LogicalVolInt); > + Length =3D LogicalVolInt->NumberOfPartitions * sizeof (UINT32) * 2; > + for (; Index < Length; Index +=3D sizeof (UINT32)) { > + LsnsNo =3D *(UINT32 *)((UINT8 *)LogicalVolInt->Data + Index); > + // > + // Check if size is not specified > + // > + if (LsnsNo =3D=3D 0xFFFFFFFFUL) { > + continue; > + } > + // > + // Accumulate used volume space > + // > + *VolumeSize +=3D MultU64x32 ((UINT64)LsnsNo, LogicalBlockSize); > } >=20 > - return EFI_SUCCESS; > + Status =3D EFI_SUCCESS; > + > +Out_Free: > + // > + // Free Logical Volume Integrity Descriptor > + // > + FreePool (LogicalVolInt); > + > + return Status; > } >=20 > /** > 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 > ); >=20 > - // > - // Check if there's any open file. If so, clean them up. > - // > - if (PrivFsData->OpenFiles > 0) { > - CleanupVolumeInformation (&PrivFsData->Volume); > - } > - > FreePool ((VOID *)PrivFsData); > } >=20 > diff --git a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.h > b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.h > index 240d420ff5..c5f83914d8 100644 > --- a/MdeModulePkg/Universal/Disk/UdfDxe/Udf.h > +++ b/MdeModulePkg/Universal/Disk/UdfDxe/Udf.h > @@ -49,16 +49,8 @@ > { 0x89, 0x56, 0x73, 0xCD, 0xA3, 0x26, 0xCD, 0x0A } \ > } >=20 > -#define UDF_DEFAULT_LV_NUM 0 > - > #define IS_PVD(_Pointer) \ > ((BOOLEAN)(_GET_TAG_ID (_Pointer) =3D=3D 1)) -#define IS_PD(_Pointer) = \ > - ((BOOLEAN)(_GET_TAG_ID (_Pointer) =3D=3D 5)) -#define IS_LVD(_Pointer)= \ > - ((BOOLEAN)(_GET_TAG_ID (_Pointer) =3D=3D 6)) -#define IS_TD(_Pointer) = \ > - ((BOOLEAN)(_GET_TAG_ID (_Pointer) =3D=3D 8)) #define IS_FSD(_Pointer)= \ > ((BOOLEAN)(_GET_TAG_ID (_Pointer) =3D=3D 256)) #define IS_FE(_Pointer= ) \ > @@ -152,14 +144,8 @@ typedef enum { #define > IS_VALID_COMPRESSION_ID(_CompId) \ > ((BOOLEAN)((_CompId) =3D=3D 8 || (_CompId) =3D=3D 16)) >=20 > -#define LV_BLOCK_SIZE(_Vol, _LvNum) \ > - (_Vol)->LogicalVolDescs[(_LvNum)]->LogicalBlockSize > - > #define UDF_STANDARD_IDENTIFIER_LENGTH 5 >=20 > -#define LV_UDF_REVISION(_Lv) \ > - *(UINT16 *)(UINTN)(_Lv)->DomainIdentifier.IdentifierSuffix > - > #pragma pack(1) >=20 > typedef struct { > @@ -186,17 +172,6 @@ typedef struct { > #pragma pack(1) >=20 > 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 +185,6 @@ typedef struct { > } UDF_TIMESTAMP; >=20 > 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,37 +199,6 @@ typedef struct { > } UDF_VOLUME_DESCRIPTOR; >=20 > typedef struct { > - UDF_DESCRIPTOR_TAG DescriptorTag; > - UINT32 VolumeDescriptorSequenceNumber; > - UINT16 PartitionFlags; > - UINT16 PartitionNumber; > - UDF_ENTITY_ID PartitionContents; > - UINT8 PartitionContentsUse[128]; > - UINT32 AccessType; > - UINT32 PartitionStartingLocation; > - UINT32 PartitionLength; > - UDF_ENTITY_ID ImplementationIdentifier; > - UINT8 ImplementationUse[128]; > - UINT8 Reserved[156]; > -} UDF_PARTITION_DESCRIPTOR; > - > -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; > @@ -389,12 +322,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; >=20 > @@ -883,17 +814,6 @@ ResolveSymlink ( > ); >=20 > /** > - 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. >=20 > @param[in] File File information pointer. > -- > 2.11.0