Message ID | 20210818221920.3893-3-digetx@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Support EFI partition on NVIDIA Tegra devices | expand |
On Thu, Aug 19, 2021 at 01:19:17AM +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@gmail.com> Looks good, Reviewed-by: Christoph Hellwig <hch@lst.de>
On Thu, 19 Aug 2021, Dmitry Osipenko wrote: >Support looking up GPT at a non-standard location specified by a block >device driver. > >Signed-off-by: Dmitry Osipenko <digetx@gmail.com> Acked-by: Davidlohr Bueso <dbueso@suse.de>
On Thu, Aug 19, 2021 at 01:19:17AM +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@gmail.com> > --- > block/partitions/efi.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/block/partitions/efi.c b/block/partitions/efi.c > index aaa3dc487cb5..7ca5c4c374d4 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,16 @@ 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) { > + 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); > + } > + When alternative_gpt_sector is provided I would expect it to override the default, not be a fallback for it. But if someone tries to put a broken (decoy, garbage) GPT at a standard place, current ordering will prevent overriding it. Best Regards Michał Mirosław
21.08.2021 01:45, Michał Mirosław пишет: > On Thu, Aug 19, 2021 at 01:19:17AM +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@gmail.com> >> --- >> block/partitions/efi.c | 12 ++++++++++++ >> 1 file changed, 12 insertions(+) >> >> diff --git a/block/partitions/efi.c b/block/partitions/efi.c >> index aaa3dc487cb5..7ca5c4c374d4 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,16 @@ 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) { >> + 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); >> + } >> + > > When alternative_gpt_sector is provided I would expect it to override > the default, not be a fallback for it. But if someone tries to put > a broken (decoy, garbage) GPT at a standard place, current ordering > will prevent overriding it. This will break devices that have GPT at standard location. If someone tries to manipulate with GPT entries, then it's a problem of that someone.
diff --git a/block/partitions/efi.c b/block/partitions/efi.c index aaa3dc487cb5..7ca5c4c374d4 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,16 @@ 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) { + 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 */ if (!good_pgpt && !good_agpt) goto fail;
Support looking up GPT at a non-standard location specified by a block device driver. Signed-off-by: Dmitry Osipenko <digetx@gmail.com> --- block/partitions/efi.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)