MdeModulePkg/UDF: 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>
Tested-by: Hao Wu <hao.a.wu@intel.com>
Build-tested-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
Build-tested-by: Star Zeng <star.zeng@intel.com>
Build-tested-by: Paulo Alcantara <paulo@hp.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
This commit is contained in:
Paulo Alcantara
2017-09-23 02:11:32 +08:00
committed by Star Zeng
parent 264d16fcbf
commit baaa3cee1e
5 changed files with 626 additions and 588 deletions

View File

@@ -49,61 +49,34 @@
{ 0x89, 0x56, 0x73, 0xCD, 0xA3, 0x26, 0xCD, 0x0A } \
}
#define UDF_DEFAULT_LV_NUM 0
#define FE_ICB_FILE_TYPE(_Ptr) \
(UDF_FILE_ENTRY_TYPE)( \
((UDF_DESCRIPTOR_TAG *)(_Ptr))->TagIdentifier == UdfFileEntry ? \
((UDF_FILE_ENTRY *)(_Ptr))->IcbTag.FileType : \
((UDF_EXTENDED_FILE_ENTRY *)(_Ptr))->IcbTag.FileType)
#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))
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 {
@@ -185,17 +152,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;
@@ -209,17 +165,6 @@ typedef struct {
UINT8 Microseconds;
} 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;
@@ -234,6 +179,17 @@ typedef struct {
UINT8 StructureData[2040];
} 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;
@@ -249,33 +205,6 @@ typedef struct {
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;
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;
@@ -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;
@@ -883,17 +810,6 @@ ResolveSymlink (
OUT UDF_FILE_INFO *File
);
/**
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.