18.08.2021 08:25, Christoph Hellwig пишет: > On Wed, Aug 18, 2021 at 03:55:47AM +0300, Dmitry Osipenko wrote: >> Support looking up GPT at a non-standard location specified by a block >> device driver. >> >> Signed-off-by: Dmitry Osipenko <digetx@xxxxxxxxx> >> --- >> block/partitions/efi.c | 13 +++++++++++++ >> 1 file changed, 13 insertions(+) >> >> diff --git a/block/partitions/efi.c b/block/partitions/efi.c >> index aaa3dc487cb5..b9509f445b3c 100644 >> --- a/block/partitions/efi.c >> +++ b/block/partitions/efi.c >> @@ -585,6 +585,8 @@ static int find_valid_gpt(struct parsed_partitions *state, gpt_header **gpt, >> gpt_header *pgpt = NULL, *agpt = NULL; >> gpt_entry *pptes = NULL, *aptes = NULL; >> legacy_mbr *legacymbr; >> + struct gendisk *disk = state->disk; >> + const struct block_device_operations *fops = disk->fops; >> sector_t total_sectors = get_capacity(state->disk); >> u64 lastlba; >> >> @@ -619,6 +621,17 @@ static int find_valid_gpt(struct parsed_partitions *state, gpt_header **gpt, >> if (!good_agpt && force_gpt) >> good_agpt = is_gpt_valid(state, lastlba, &agpt, &aptes); >> >> + if (!good_agpt && force_gpt && fops->alternative_gpt_sector) { >> + struct block_device *bdev = disk->part0; >> + sector_t agpt_sector; >> + int err; >> + >> + err = fops->alternative_gpt_sector(bdev, &agpt_sector); > > Please call the method with the disk as the argument. I've been moving > the block layer to generally pass the gendisk whenever we're dealing > with the whole device, as that makes the intent very clear. I'll change it in v6. > Also do we really need the force_gpt check? That is we always require > the user to pass a command line argument to use this? User indeed must pass the 'gpt' argument to kernel cmdline. That's what all those Android devices do. Should be okay to keep that requirement.