Commit 466d9c49 authored by Dmitry Osipenko's avatar Dmitry Osipenko Committed by Jens Axboe
Browse files

partitions/efi: Support non-standard GPT location



Support looking up GPT at a non-standard location specified by a block
device driver.

Acked-by: default avatarDavidlohr Bueso <dbueso@suse.de>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarDmitry Osipenko <digetx@gmail.com>
Reviewed-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Link: https://lore.kernel.org/r/20210820004536.15791-3-digetx@gmail.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 0bdfbca8
Loading
Loading
Loading
Loading
+12 −0
Original line number Original line Diff line number Diff line
@@ -585,6 +585,8 @@ static int find_valid_gpt(struct parsed_partitions *state, gpt_header **gpt,
	gpt_header *pgpt = NULL, *agpt = NULL;
	gpt_header *pgpt = NULL, *agpt = NULL;
	gpt_entry *pptes = NULL, *aptes = NULL;
	gpt_entry *pptes = NULL, *aptes = NULL;
	legacy_mbr *legacymbr;
	legacy_mbr *legacymbr;
	struct gendisk *disk = state->disk;
	const struct block_device_operations *fops = disk->fops;
	sector_t total_sectors = get_capacity(state->disk);
	sector_t total_sectors = get_capacity(state->disk);
	u64 lastlba;
	u64 lastlba;


@@ -619,6 +621,16 @@ static int find_valid_gpt(struct parsed_partitions *state, gpt_header **gpt,
        if (!good_agpt && force_gpt)
        if (!good_agpt && force_gpt)
                good_agpt = is_gpt_valid(state, lastlba, &agpt, &aptes);
                good_agpt = is_gpt_valid(state, lastlba, &agpt, &aptes);


	if (!good_agpt && force_gpt && fops->alternative_gpt_sector) {
		sector_t agpt_sector;
		int err;

		err = fops->alternative_gpt_sector(disk, &agpt_sector);
		if (!err)
			good_agpt = is_gpt_valid(state, agpt_sector,
						 &agpt, &aptes);
	}

        /* The obviously unsuccessful case */
        /* The obviously unsuccessful case */
        if (!good_pgpt && !good_agpt)
        if (!good_pgpt && !good_agpt)
                goto fail;
                goto fail;