Date: Sun, 11 Feb 2001 13:47:07 +0900 (JST) From: HASEGAWA Tomoki <thasegawa@mta.biglobe.ne.jp> To: FreeBSD-gnats-submit@freebsd.org Subject: i386/24997: /boot/loader cannot handle extended dos partitions Message-ID: <20010211.134707.59464862.thasegawa@mta.biglobe.ne.jp>
next in thread | raw e-mail | index | archive | help
>Number: 24997 >Category: i386 >Synopsis: /boot/loader cannot handle extended dos partitions >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sat Feb 10 21:00:01 PST 2001 >Closed-Date: >Last-Modified: >Originator: HASEGAWA Tomoki >Release: FreeBSD 4.2-STABLE i386 >Organization: >Environment: FreeBSD 4.2-STABLE(2001/02/10) i386 FreeBSD 5.0-CURRENT(2001/02/10) i386 >Description: /boot/loader cannot handle extended dos partitions in ide disks (except slice 5(eg disk0s5)). I cannot boot with root partition /dev/ad0s9a. devices in FreeBSD corresponding disk name in /boot/loader /dev/ad0s5 -> disk0s5 /dev/ad0s6 -> disk0s7 /dev/ad0s7 or higher -> cannot handle >How-To-Repeat: make extended dos partitions and use 'lsdev' command in the /boot/loader command line. >Fix: I referred to sys/kern/subr_diskmbr.c and revised sys/boot/i386/libi386/biosdisk.c. The patch is following. Index: biosdisk.c =================================================================== RCS file: /home/ncvs/src/sys/boot/i386/libi386/biosdisk.c,v retrieving revision 1.26.2.6 diff -u -r1.26.2.6 biosdisk.c --- biosdisk.c 2000/12/28 13:10:47 1.26.2.6 +++ biosdisk.c 2001/02/10 05:59:00 @@ -132,7 +132,7 @@ static int bd_opendisk(struct open_disk **odp, struct i386_devdesc *dev); static void bd_closedisk(struct open_disk *od); static int bd_bestslice(struct open_disk *od); -static void bd_checkextended(struct open_disk *od, int slicenum); +static void bd_checkextended(struct open_disk *od, int slicenum, int basenum); /* * Translate between BIOS device numbers and our private unit numbers. @@ -512,7 +512,7 @@ sizeof(struct dos_partition) * NDOSPART); od->od_nslices = 4; /* extended slices start here */ for (i = 0; i < NDOSPART; i++) - bd_checkextended(od, i); + bd_checkextended(od, i, i); od->od_flags |= BD_PARTTABOK; dptr = &od->od_slicetab[0]; @@ -624,12 +624,12 @@ } static void -bd_checkextended(struct open_disk *od, int slicenum) +bd_checkextended(struct open_disk *od, int slicenum, int basenum) { char buf[BIOSDISK_SECSIZE]; struct dos_partition *dp; u_int base; - int i, start, end; + int i, start; dp = &od->od_slicetab[slicenum]; start = od->od_nslices; @@ -651,17 +651,21 @@ continue; if (od->od_nslices == MAX_SLICES) goto done; - dp->dp_start += base; - bcopy(dp, &od->od_slicetab[od->od_nslices], sizeof(*dp)); - od->od_nslices++; + if (dp->dp_typ == DOSPTYP_EXT) { + dp->dp_start += od->od_slicetab[basenum].dp_start;; + bcopy(dp, &od->od_slicetab[od->od_nslices], sizeof(*dp)); + } else { + dp->dp_start += base; + bcopy(dp, &od->od_slicetab[od->od_nslices], sizeof(*dp)); + od->od_nslices++; + } } - end = od->od_nslices; /* * now, recursively check the slices we just added */ - for (i = start; i < end; i++) - bd_checkextended(od, i); + for (i = start; i < start + NDOSPART; i++) + bd_checkextended(od, i, basenum); done: return; } >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010211.134707.59464862.thasegawa>