10/24/23 14:03, Crystal Kolipe пишет:
> On Tue, Oct 24, 2023 at 01:44:08AM +0000, Klemens Nanni wrote:
>> Rereading the code, I now question why it checks the 'a' label type at all.
>>
>> Taking your sd0d example through devboot():
>>
>> |#ifdef SOFTRAID
>> | /*
>> | * Determine the partition type for the 'a' partition of the
>> | * boot device.
>> | */
>> | TAILQ_FOREACH(dip, &disklist, list)
>> | if (dip->bios_info.bios_number == bootdev &&
>> | (dip->bios_info.flags & BDI_BADLABEL) == 0)
>> | part_type = dip->disklabel.d_partitions[0].p_fstype;
>>
>> Whatever sd0a's type is...
>>
>> |
>> | /*
>> | * See if we booted from a disk that is a member of a bootable
>> | * softraid volume.
>> | */
>> | SLIST_FOREACH(bv, &sr_volumes, sbv_link) {
>> | if (bv->sbv_flags & BIOC_SCBOOTABLE)
>> | SLIST_FOREACH(bc, &bv->sbv_chunks, sbc_link)
>> | if (bc->sbc_disk == bootdev)
>>
>> ... the boot loader sees we booted from a bootable softraid chunk,
>> matching disk sd0 by number and not partition.
>>
>> | sr_boot_vol = bv->sbv_unit;
>> | if (sr_boot_vol != -1)
>> | break;
>> | }
>> |#endif
>> |
>> | if (sr_boot_vol != -1 && part_type != FS_BSDFFS) {
>>
>> With softraid chunk on sd0d, sd0a happens to be not FFS (likely unused),
>> but that's still enough for the boot loader to stick to softraid on sd0!
>>
>> | *p++ = 's';
>> | *p++ = 'r';
>> | *p++ = '0' + sr_boot_vol;
>> | } else if (bootdev & 0x100) {
>>
>> So why check the 'a' label type if that's not relevant?
>
> The only reason I can see for that check is to better support the unusual
> configuration of booting from a disk which happens to be part of a bootable
> softraid volume, but which also has a regular FFS partition outside of the
> RAID, and for whatever reason the user wants to automatically boot from that
> instead.
>
> Maybe that was useful before support for booting from softraid crypto volumes
> was introduced, (when it was raid-1 only). It doesn't seem very useful now.
>
>> It is confusing and
>> Doubling down on the assumption that bootable chunks are always on 'a'
>> like my diff did shows that's a mistake and dropping the check actually
>> makes more sense to me now.
>
> I agree it is confusing.
>
> Effectively the code is there to treat part_type == FS_BSDFFS an 'edge case'
> as described above.
>
>> This boots with root on softraid on sd0a and sd0d.
>>
>> Thoughts?
>> Am I missing something?
>
> It works OK here, so I'm fine with removing this.
>
That matches sys/arch/amd64/stand/libsa/dev_i386.c r1.12 from 2012
which introduced this code; my second diff would be a revert:
If we have booted from a disk that is a member of a bootable
softraid volume, always select the srX device unless the 'a'
partition of the disk is FFS.
(Other architectures copied that, except sparc64 checking FS_RAID.)