From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by mx.groups.io with SMTP id smtpd.web12.7718.1592978205302585006 for ; Tue, 23 Jun 2020 22:56:45 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.136, mailfrom: zhichao.gao@intel.com) IronPort-SDR: +DxWQ5BPUbyyUwUcx0IXD7MnICRzjnAnI52ZU2ICl2EefSfZAUfTkD3zm/xIT2fgzS7jpgxYeo 0KrooXGlVjvQ== X-IronPort-AV: E=McAfee;i="6000,8403,9661"; a="124010229" X-IronPort-AV: E=Sophos;i="5.75,274,1589266800"; d="scan'208";a="124010229" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Jun 2020 22:56:43 -0700 IronPort-SDR: nsh7kFThxweDn2NHbLxgytsjAHyHaZGSZDuQVishO5UQQbXLr6zNIUV1xK6k2zijahnJgGbkYm 8zujYuQtkBNQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,274,1589266800"; d="scan'208";a="423261316" Received: from fieedk001.ccr.corp.intel.com ([10.239.33.114]) by orsmga004.jf.intel.com with ESMTP; 23 Jun 2020 22:56:37 -0700 From: "Gao, Zhichao" To: devel@edk2.groups.io Cc: Hao A Wu , Ray Ni , Jian J Wang , Liming Gao Subject: [PATCH] MdeModulePkg/PartitionDxe: Seperate the Udf handler Date: Wed, 24 Jun 2020 13:56:10 +0800 Message-Id: <20200624055610.13984-1-zhichao.gao@intel.com> X-Mailer: git-send-email 2.21.0.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2823 Some linux iso like Redhat would contain both MBR info in the first 512 bytes and volume info at the beginning of 32KB offset. But the partition driver would only choose one of the GPT, MBR, and UDF(el torito compatible) to install the partition. That would lose one info for such linux ISO during one connect. And UDF(el torito compatible) is not conflicted with MBR/GPT. So partition driver should check UDF and MBR/GPT separately. Cc: Hao A Wu Cc: Ray Ni Cc: Jian J Wang Cc: Liming Gao Signed-off-by: Zhichao Gao --- .../Universal/Disk/PartitionDxe/Partition.c | 52 +++++++++++++------ 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.c b/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.c index d1c878ad2e..562490db4f 100644 --- a/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.c +++ b/MdeModulePkg/Universal/Disk/PartitionDxe/Partition.c @@ -5,7 +5,7 @@ MBR, and GPT partition schemes are supported. Copyright (c) 2018 Qualcomm Datacenter Technologies, Inc. -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -39,7 +39,6 @@ EFI_DRIVER_BINDING_PROTOCOL gPartitionDriverBinding = { PARTITION_DETECT_ROUTINE mPartitionDetectRoutineTable[] = { PartitionInstallGptChildHandles, PartitionInstallMbrChildHandles, - PartitionInstallUdfChildHandles, NULL }; @@ -189,6 +188,8 @@ PartitionDriverBindingStart ( { EFI_STATUS Status; EFI_STATUS OpenStatus; + EFI_STATUS UdfStatus; + EFI_STATUS GptMbrStatus; EFI_BLOCK_IO_PROTOCOL *BlockIo; EFI_BLOCK_IO2_PROTOCOL *BlockIo2; EFI_DISK_IO_PROTOCOL *DiskIo; @@ -300,26 +301,47 @@ PartitionDriverBindingStart ( if (BlockIo->Media->MediaPresent || (BlockIo->Media->RemovableMedia && !BlockIo->Media->LogicalPartition)) { // - // Try for GPT, then legacy MBR partition types, and then UDF and El Torito. - // If the media supports a given partition type install child handles to - // represent the partitions described by the media. + // Try for UDF (El TOrito compatible) and GPT/MBR partition types. + // If the media supports a given partition type, it would install child handles + // to represent the partitions described by the media. + // Notes: GPT is conflicted with MBR. It would only install one of them to describe + // the partition. UDF (or El Torito) can exist with MBR, so need to check it along with + // GPT/MBR. // + UdfStatus = PartitionInstallUdfChildHandles ( + This, + ControllerHandle, + DiskIo, + DiskIo2, + BlockIo, + BlockIo2, + ParentDevicePath + ); + Routine = &mPartitionDetectRoutineTable[0]; while (*Routine != NULL) { - Status = (*Routine) ( - This, - ControllerHandle, - DiskIo, - DiskIo2, - BlockIo, - BlockIo2, - ParentDevicePath - ); - if (!EFI_ERROR (Status) || Status == EFI_MEDIA_CHANGED || Status == EFI_NO_MEDIA) { + GptMbrStatus = (*Routine) ( + This, + ControllerHandle, + DiskIo, + DiskIo2, + BlockIo, + BlockIo2, + ParentDevicePath + ); + if (!EFI_ERROR (GptMbrStatus) || GptMbrStatus == EFI_MEDIA_CHANGED || GptMbrStatus == EFI_NO_MEDIA) { break; } Routine++; } + + if (!EFI_ERROR (UdfStatus) || !EFI_ERROR (GptMbrStatus)) { + Status = EFI_SUCCESS; + } else if (UdfStatus == EFI_MEDIA_CHANGED || GptMbrStatus == EFI_MEDIA_CHANGED) { + Status = EFI_MEDIA_CHANGED; + } else if (UdfStatus == EFI_NO_MEDIA || GptMbrStatus == EFI_NO_MEDIA) { + Status = EFI_NO_MEDIA; + } } // // In the case that the driver is already started (OpenStatus == EFI_ALREADY_STARTED), -- 2.21.0.windows.1