Annotation of Gnu-Mach/scsi/disk_label.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1996 The University of Utah and
                      3:  * the Computer Systems Laboratory at the University of Utah (CSL).
                      4:  * All rights reserved.
                      5:  *
                      6:  * Permission to use, copy, modify and distribute this software is hereby
                      7:  * granted provided that (1) source code retains these copyright, permission,
                      8:  * and disclaimer notices, and (2) redistributions including binaries
                      9:  * reproduce the notices in supporting documentation, and (3) all advertising
                     10:  * materials mentioning features or use of this software display the following
                     11:  * acknowledgement: ``This product includes software developed by the
                     12:  * Computer Systems Laboratory at the University of Utah.''
                     13:  *
                     14:  * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS
                     15:  * IS" CONDITION.  THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF
                     16:  * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     17:  *
                     18:  * CSL requests users of this software to return to [email protected] any
                     19:  * improvements that they make and grant CSL redistribution rights.
                     20:  *
                     21:  *      Author: Kevin T. Van Maren, University of Utah CSL
                     22:  */
                     23: 
                     24: /*
                     25:  * Mach Operating System
                     26:  * Copyright (c) 1991,1990 Carnegie Mellon University
                     27:  * All Rights Reserved.
                     28:  *
                     29:  * Permission to use, copy, modify and distribute this software and its
                     30:  * documentation is hereby granted, provided that both the copyright
                     31:  * notice and this permission notice appear in all copies of the
                     32:  * software, derivative works or modified versions, and any portions
                     33:  * thereof, and that both notices appear in supporting documentation.
                     34:  *
                     35:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     36:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     37:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     38:  *
                     39:  * Carnegie Mellon requests users of this software to return to
                     40:  *
                     41:  *  Software Distribution Coordinator  or  [email protected]
                     42:  *  School of Computer Science
                     43:  *  Carnegie Mellon University
                     44:  *  Pittsburgh PA 15213-3890
                     45:  *
                     46:  * any improvements or extensions that they make and grant Carnegie Mellon
                     47:  * the rights to redistribute these changes.
                     48:  */
                     49: 
                     50: /*
                     51:  * Copyright (c) 1994 Shantanu Goel
                     52:  * All Rights Reserved.
                     53:  *
                     54:  * Permission to use, copy, modify and distribute this software and its
                     55:  * documentation is hereby granted, provided that both the copyright
                     56:  * notice and this permission notice appear in all copies of the
                     57:  * software, derivative works or modified versions, and any portions
                     58:  * thereof, and that both notices appear in supporting documentation.
                     59:  *
                     60:  * THE AUTHOR ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     61:  * CONDITION.  THE AUTHOR DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     62:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     63:  *
                     64:  */
                     65: 
                     66: /* This file contains the partition code that is used by the Mach
                     67:  * device drivers (ide & scsi).  */
                     68: 
                     69: #include <scsi/compat_30.h>
                     70: #include <sys/types.h> 
                     71: 
                     72: #include <scsi/rz_labels.h>
                     73: #include <i386at/disk.h>       /* combine & rename these... */
                     74: 
                     75: #define SECTOR_SIZE 512                /* BAD!!! */
                     76: 
                     77: #define DSLICE(dev) ((dev >> 4) & 0x3f)
                     78: #define DPART(dev) (dev & 0xf)
                     79: 
                     80: /* note: 0 will supress ALL output;
                     81:        1 is 'normal' output; 2 is verbose; 3 is Very verbose */
                     82: #define PARTITION_DEBUG 1
                     83: 
                     84: #define min(x,y) (x<y?x:y)
                     85: 
                     86: /*
                     87:  * Label that is filled in with extra info
                     88:  */
                     89: struct disklabel default_label =
                     90: {
                     91:         DISKMAGIC, DTYPE_SCSI, 0,
                     92:         "SCSI", "",
                     93:         DEV_BSIZE, 1, 1, 1, 1, 1, 0, 0, 0,
                     94:         3600, 1, 1, 1, 0, 0, 0,
                     95:         {0,}, {0,},
                     96:         DISKMAGIC, 0,
                     97:         8, 8192, 8192,
                     98:         {{ -1, 0, 1024, FS_BSDFFS, 8, 3 },
                     99:          { -1, 0, 1024, FS_BSDFFS, 8, 3 },
                    100:          { -1, 0, 1024, FS_BSDFFS, 8, 3 },
                    101:          { -1, 0, 1024, FS_BSDFFS, 8, 3 },
                    102:          { -1, 0, 1024, FS_BSDFFS, 8, 3 },
                    103:          { -1, 0, 1024, FS_BSDFFS, 8, 3 },
                    104:          { -1, 0, 1024, FS_BSDFFS, 8, 3 },
                    105:          { -1, 0, 1024, FS_BSDFFS, 8, 3 }}
                    106: };
                    107:  
                    108: 
                    109: 
                    110: /* the device driver calls this just to save some info it got from the HW */
                    111: /* This is a bad holdover from the disklabel days, and needs to go */
                    112: fudge_bsd_label(struct disklabel *label, int type, int total_secs, int heads, int sectors, int sectorsize, int n)
                    113: {
                    114:        *label=default_label;
                    115: 
                    116:         label->d_ncylinders = total_secs/(heads*sectors);
                    117:         label->d_ntracks = heads; 
                    118:         label->d_nsectors = sectors;
                    119: 
                    120:         label->d_secpercyl = heads*sectors;
                    121:         label->d_secperunit = total_secs;
                    122: 
                    123:        /* this is never used, but ... */
                    124:         label->d_partitions[MAXPARTITIONS].p_offset = 0;
                    125:         label->d_partitions[MAXPARTITIONS].p_size = total_secs;
                    126:         
                    127:         /* ??   
                    128:          */             
                    129:         label->d_secsize = sectorsize;
                    130:         label->d_type = type;
                    131:         label->d_subtype = 0xa;  /* ??? */
                    132:                         
                    133:         label->d_npartitions = n;               /* up to 'c' */ 
                    134:         label->d_checksum = 0;
                    135: 
                    136:        /* should do a checksum on it now */
                    137: }
                    138:         
                    139: 
                    140: 
                    141: /* This is placed here to
                    142:        a. provide comparability with existing servers
                    143:        b. allow the use of FreeBSD-style slices to access ANY disk partition
                    144:        c. provide an easy migration path to lites-based partition code
                    145:                by only passing the drive name to get the entire disk (sd0).
                    146: 
                    147:    This will be called by every routine that needs to access partition info
                    148:    based on a device number.  It is slower than the old method of indexing
                    149:    into a disklabel, but is more flexible, and reasonably fast in the (future)
                    150:    case where Lites will access the whole disk.  An array of disklabels
                    151:    could have been used, but this is more compact and general.  The underlying
                    152:    structure does not limit it to 2-levels, but keeping the kernel interface
                    153:    simple does. */
                    154: 
                    155: 
                    156: /* this code and data structure based on conversation with Bryan Ford */
                    157: /* Note: this is called ON EVERY read or write.  It makes sense to
                    158:    optimize this for the common case.  Hopefully the common case
                    159:    will become the '0,0' case, as partitioning is moved out of the
                    160:    kernel.  (Downside is kernel can't protect filesystems from each other).
                    161:    It is slower than indexing into a 1-D array, but not much. */
                    162: 
                    163: struct diskpart *lookup_part(struct diskpart *array, int dev_number)
                    164: {
                    165: /* Note: 10 bit encoding to get partitions 0-15 (0,a-h typically), and slices
                    166:  * 0-63 
                    167:  */
                    168: 
                    169:         int slice = DSLICE(dev_number);
                    170:         int part = DPART(dev_number);
                    171:         struct diskpart *s;
                    172: 
                    173:         if (slice == 0)        /* compatability slice */
                    174:         {
                    175:                 if (part == 0) /* whole disk */
                    176:                         return &array[0];
                    177: 
                    178:                 if (array[0].type == DISKPART_DOS)
                    179:                 {
                    180:                         int i;
                    181:                         for (i = 0; i < array[0].nsubs; i++)
                    182:                         {
                    183:                                 s = &array[0].subs[i];
                    184:                                 if (   s->type == DISKPART_BSD
                    185:                                    || s->type == DISKPART_VTOC)
                    186:                                 {
                    187:                                         if (part > s->nsubs)
                    188:                                                 return 0;
                    189:                                         return (&s->subs[part-1]);
                    190:                                 }
                    191:                         }
                    192:                }
                    193: 
                    194:                 if (part > array[0].nsubs)
                    195:                         return 0;
                    196:                 return(&array[0].subs[part-1]);
                    197:         }
                    198:         else
                    199:         {
                    200:                 if (   array[0].type != DISKPART_DOS
                    201:                    || slice > array[0].nsubs)
                    202:                         return 0;
                    203: 
                    204:                 s = &array[0].subs[slice-1];
                    205: 
                    206:                 if (part == 0) /* whole slice */
                    207:                         return (s);
                    208:                 if (part > s->nsubs)
                    209:                         return 0;
                    210: 
                    211:                 return (&s->subs[part-1]);
                    212:         }
                    213: }
                    214: 
                    215: 
                    216: 
                    217: 
                    218: static inline void fill_array(struct diskpart *array, int start, int size, 
                    219:                struct diskpart *subs, int nsubs, short type, short fsys)
                    220: {
                    221:        array->start=start;
                    222:        array->size=size;
                    223:        array->subs=subs;
                    224:        array->nsubs=nsubs;
                    225:        array->type=type;
                    226:        array->fsys=fsys;
                    227: #if (PARTITION_DEBUG > 2) 
                    228:        printf("fill: type %d:%d, start %d, size %d, %d parts\n",type,fsys,
                    229:                        start,size,nsubs);
                    230: #endif
                    231: }
                    232: 
                    233: 
                    234: 
                    235: 
                    236: void print_array(struct diskpart *array, int level)
                    237: {
                    238:        int i,j;
                    239:        struct diskpart *subs;
                    240: 
                    241: #if (PARTITION_DEBUG)
                    242:        subs=array[0].subs;
                    243: 
                    244:         for (i=0;i<array[0].nsubs;i++) {
                    245:                for (j=0;j<level;j++)
                    246:                        printf("  ");
                    247:                printf("%c: %d, %d, %d, %d (%d subparts)\n",'a'+i,
                    248:                        subs[i].start, subs[i].size, subs[i].fsys, 
                    249:                        subs[i].type, subs[i].nsubs);
                    250:                if (subs[i].nsubs>0)
                    251:                        print_array(&subs[i], level+1);
                    252:        }
                    253: #endif
                    254: }
                    255: 
                    256: 
                    257: 
                    258: /* individual routines to find the drive labels.
                    259:    There needs to be a function for every different method for partitioning
                    260:    much of the following code is derived from the SCSI/IDE drivers */
                    261: 
                    262: int get_dos(struct diskpart *array, char *buff, int start,
                    263:                void *driver_info, int (*bottom_read_fun)(),
                    264:                char *name, int max_part)
                    265: {
                    266: 
                    267:        bios_label_t *mp;
                    268:        struct bios_partition_info *pp;
                    269: 
                    270:        int count, i, j;
                    271:        int pstart, psize;
                    272:        int ext=-1, mystart=start, mybase;
                    273:        int first=1;
                    274: 
                    275:        /* note: start is added, although a start != 0 is meaningless
                    276:           to DOS and anything else... */
                    277: 
                    278:        /* check the boot sector for a partition table. */
                    279:         (*bottom_read_fun)(driver_info, start, buff);  /* always in sector 0 */
                    280: 
                    281:         /*
                    282:          * Check for valid partition table.
                    283:          */
                    284:         mp = (bios_label_t *)&buff[BIOS_LABEL_BYTE_OFFSET];
                    285:         if (mp->magic != BIOS_LABEL_MAGIC) {
                    286: #if (PARTITION_DEBUG>1)
                    287:                 printf("%s invalid partition table\n", name);
                    288: #endif
                    289:                 return(0);   /* didn't add any partitions */
                    290:         }
                    291: #if (PARTITION_DEBUG>1)
                    292:        printf("DOS partition table found\n");
                    293: #endif 
                    294: 
                    295:        count=min(4,max_part);  /* always 4 (primary) partitions */
                    296: #if (PARTITION_DEBUG)
                    297:        if (count<4) printf("More partitions than space!\n");
                    298: #endif
                    299: 
                    300: 
                    301:        /* fill the next 4 entries in the array */
                    302:        for (i=0, pp=(struct bios_partition_info *)mp->partitions;
                    303:                i<count; i++,pp++) {
                    304: 
                    305:                fill_array(&array[i], pp->offset, pp->n_sectors, NULL, 0, 
                    306:                        DISKPART_NONE, pp->systid);
                    307:                if ((pp->systid == DOS_EXTENDED) &&(ext<0)) {
                    308:                        mystart+=pp->offset; 
                    309:                        ext=i;
                    310:                }
                    311:        }
                    312: 
                    313:        /* if there is an extended partition, find all the logical partitions */
                    314:        /* note: logical start at '5' (extended is one of the numbered 1-4) */
                    315: 
                    316:        /* logical partitions 'should' be nested inside the primary, but
                    317:           then it would be impossible to NAME a disklabel inside a logical
                    318:           partition, which would be nice to do */
                    319: #if (PARTITION_DEBUG>1)
                    320:        if (ext>=0)
                    321:                printf("extended partition found: %d\n",ext);
                    322: #endif 0
                    323: 
                    324:        while (ext>=0) {
                    325:                pp = &(((struct bios_partition_info *)mp->partitions)[ext]);
                    326: 
                    327:                /* read the EXTENDED partition table */
                    328:                if (first) {
                    329:                        mybase=mystart;
                    330:                        first=0;
                    331:                } else {
                    332:                        mybase=mystart+pp->offset;
                    333:                }
                    334: 
                    335:                (*bottom_read_fun)(driver_info, mybase, buff);
                    336: 
                    337:                if (mp->magic != BIOS_LABEL_MAGIC) {
                    338: #if (PARTITION_DEBUG>1)
                    339:                        printf("%s invalid expanded magic\n", name);
                    340: #endif 
                    341:                                return(count);/*don't add any more partitions*/
                    342:                }
                    343: 
                    344:                /* just in case more than one partition is there...*/
                    345:                /* search the EXTENDED partition table */
                    346:                ext=-1;
                    347:                for (j=0,pp=(struct bios_partition_info *)mp->partitions;
                    348:                                j<4; j++,pp++) {    
                    349: 
                    350:                        if (pp->systid && (pp->systid!=DOS_EXTENDED)) {
                    351:                           if (count<max_part) {
                    352:                                fill_array(&array[count], 
                    353:                                    mybase +pp->offset, 
                    354:                                    pp->n_sectors, NULL, 0, DISKPART_NONE, 
                    355:                                    pp->systid);
                    356:                                count++; }
                    357:                            else {
                    358: #if (PARTITION_DEBUG)
                    359:                                printf("More partitions than space!\n");
                    360: #endif
                    361:                                return(count);
                    362:                            }
                    363:                        } else if ((ext<0) &&(pp->systid==DOS_EXTENDED)) {
                    364:                                ext=j;
                    365:                                /* recursivly search the chain here */
                    366:                        }
                    367:                        }
                    368:        }
                    369: #if (PARTITION_DEBUG>1)
                    370:        printf("%d dos partitions\n",count);
                    371: #endif 0
                    372:        return(count);  /* number dos partitions found */
                    373: 
                    374: }
                    375: 
                    376: 
                    377: 
                    378: /* this should work on the bare drive, or in a dos partition */
                    379: int get_disklabel(struct diskpart *array, char *buff, int start,
                    380:                void *driver_info, int (*bottom_read_fun)(),
                    381:                char *name, int max_part) 
                    382: {
                    383:        struct disklabel *dlp;
                    384:        int mybase = start + (512 * LBLLOC)/SECTOR_SIZE, i;
                    385:        int count;
                    386: 
                    387:         (*bottom_read_fun)(driver_info, mybase, buff); 
                    388:                 
                    389:         dlp = (struct disklabel *)buff;
                    390:         if (dlp->d_magic != DISKMAGIC || dlp->d_magic2 != DISKMAGIC) {
                    391: #if (PARTITION_DEBUG>1)
                    392:                 printf("%s no BSD label found\n",name);
                    393: #endif
                    394:                return(0);  /* no partitions added */
                    395:         }
                    396: #if (PARTITION_DEBUG>1)
                    397:         printf(" BSD LABEL\n");
                    398: #endif 0
                    399:        /* note: BSD disklabel offsets are from start of DRIVE -- uuggh */
                    400: 
                    401:        count=min(8,max_part);  /* always 8 in a disklabel */
                    402: #if (PARTITION_DEBUG)   
                    403:        if (count<8) printf("More partitions than space!\n");
                    404: #endif
                    405:         /* COPY into the array */
                    406:        for (i=0;i<count;i++)
                    407:                fill_array(&array[i], /* mybase + */ 
                    408:                        dlp->d_partitions[i].p_offset,
                    409:                        dlp->d_partitions[i].p_size,
                    410:                        NULL, 0, DISKPART_NONE, dlp->d_partitions[i].p_fstype);
                    411: 
                    412:                /* note: p_fstype is not the same set as the DOS types */
                    413:                         
                    414:        return(count);  /* 'always' 8 partitions in disklabel -- if space */
                    415: 
                    416: /* UNREACHED CODE FOLLOWS: (alternative method in scsi) */
                    417: #if 0
                    418:         (*bottom_read_fun)(driver_info, (start)+LABELSECTOR, buff);
                    419: 
                    420:                 register int    j;
                    421:                 boolean_t       found;
                    422: 
                    423:                 for (j = LABELOFFSET, found = FALSE;
                    424:                      j < (SECTOR_SIZE-sizeof(struct disklabel));
                    425:                      j += sizeof(int)) {
                    426:                         search =  (struct disklabel *)&buff[j];
                    427:                         if (search->d_magic  == DISKMAGIC &&
                    428:                             search->d_magic2 == DISKMAGIC) {
                    429:                                 found = TRUE;
                    430:                                 break;
                    431:                         }
                    432:                 }
                    433:                 if (found) {
                    434: #if (PARTITION_DEBUG>1)
                    435:                         printf("Label found in LABELSECTOR\n");
                    436: #endif
                    437:                 } else {
                    438:                         search = 0;
                    439:                }
                    440: 
                    441:           
                    442: #endif 0
                    443: 
                    444: }
                    445: 
                    446: 
                    447: /* NOT TESTED! */
                    448: /* VTOC in sector 29 */
                    449: int get_vtoc(struct diskpart *array, char *buff, int start,
                    450:                void *driver_info, int (*bottom_read_fun)(),
                    451:                char *name, int max_part) 
                    452: {
                    453:        struct evtoc *evp;
                    454:        int n,i;
                    455:        struct disklabel lpl;
                    456:        struct disklabel *lp = &lpl;
                    457: 
                    458: #if (PARTITION_DEBUG)
                    459:         printf("Read VTOC.\n");
                    460: #endif
                    461:         (*bottom_read_fun)(driver_info, start +PDLOCATION, buff);
                    462:         evp = (struct evtoc *)buff;
                    463:         if (evp->sanity != VTOC_SANE) {
                    464: #if (PARTITION_DEBUG) 
                    465:                 printf("%s evtoc corrupt or not found\n", name);
                    466: #endif
                    467:                return(0);
                    468:         }
                    469:        n = min(evp->nparts,max_part); /* no longer DISKLABEL limitations... */
                    470: #if 0
                    471:         n = (evp->nparts > MAXPARTITIONS) ? MAXPARTITIONS : evp->nparts;
                    472: #endif 0
                    473:    
                    474:         for (i = 0; i < n; i++)
                    475:                fill_array(&array[i], /* mybase + */ 
                    476:                        evp->part[i].p_start,
                    477:                        evp->part[i].p_size,
                    478:                        NULL, 0, DISKPART_NONE, FS_BSDFFS);
                    479: 
                    480:        return(n);  /* (evp->nparts) */
                    481: }
                    482: 
                    483: 
                    484: /* NOT TESTED! */
                    485: int get_omron(struct diskpart *array, char *buff, int start,
                    486:                void *driver_info, int (*bottom_read_fun)(),
                    487:                char *name, int max_part) 
                    488: {
                    489: 
                    490:         struct disklabel        *label;
                    491: 
                    492:         /* here look for an Omron label */
                    493:         register omron_label_t  *part;
                    494:         int                             i;
                    495: 
                    496: #if (PARTITION_DEBUG) 
                    497:         printf("Looking for Omron label...\n");
                    498: #endif
                    499: 
                    500:         (*bottom_read_fun)(driver_info, start+
                    501:                OMRON_LABEL_BYTE_OFFSET/SECTOR_SIZE, buff);
                    502: 
                    503:         part = (omron_label_t*)&buff[OMRON_LABEL_BYTE_OFFSET%SECTOR_SIZE];
                    504:         if (part->magic == OMRON_LABEL_MAGIC) {
                    505: #if (PARTITION_DEBUG) 
                    506:                 printf("{Using OMRON label}");
                    507: #endif
                    508:                 for (i = 0; i < 8; i++) {
                    509:                         label->d_partitions[i].p_size = part->partitions[i].n_sectors;
                    510:                         label->d_partitions[i].p_offset = part->partitions[i].offset;
                    511:                 }
                    512:                 bcopy(part->packname, label->d_packname, 16);
                    513:                 label->d_ncylinders = part->ncyl;
                    514:                 label->d_acylinders = part->acyl;
                    515:                 label->d_ntracks = part->nhead;
                    516:                 label->d_nsectors = part->nsect;
                    517:                 /* Many disks have this wrong, therefore.. */
                    518: #if 0
                    519:                 label->d_secperunit = part->maxblk;
                    520: #else
                    521:                 label->d_secperunit = label->d_ncylinders * label->d_ntracks *
                    522:                                         label->d_nsectors;
                    523: #endif 0
                    524:    
                    525:                 return(8); 
                    526:         }
                    527: #if (PARTITION_DEBUG) 
                    528:         printf("No Omron label found.\n");
                    529: #endif
                    530:        return(0);
                    531: }
                    532: 
                    533: 
                    534: /* NOT TESTED! */
                    535: int get_dec(struct diskpart *array, char *buff, int start,
                    536:                void *driver_info, int (*bottom_read_fun)(),
                    537:                char *name, int max_part) 
                    538: {
                    539:         struct disklabel        *label;
                    540: 
                    541:         /* here look for a DEC label */
                    542:         register dec_label_t    *part;
                    543:         int                             i;
                    544:   
                    545: #if (PARTITION_DEBUG) 
                    546:         printf("Checking for dec_label...\n");
                    547: #endif
                    548: 
                    549:         (*bottom_read_fun)(driver_info, start +
                    550:                        DEC_LABEL_BYTE_OFFSET/SECTOR_SIZE, buff); 
                    551:         
                    552:         if (part->magic == DEC_LABEL_MAGIC) {
                    553: #if (PARTITION_DEBUG) 
                    554:                 printf("{Using DEC label}");
                    555: #endif
                    556:                 for (i = 0; i < 8; i++) {
                    557:                         label->d_partitions[i].p_size = part->partitions[i].n_sectors;
                    558:                         label->d_partitions[i].p_offset = part->partitions[i].offset;
                    559:                 }
                    560:                return(8); 
                    561:         }
                    562: #if (PARTITION_DEBUG) 
                    563:         printf("No dec label found.\n");
                    564: #endif
                    565: 
                    566:         return(0);
                    567: }
                    568: 
                    569: 
                    570: 
                    571: 
                    572: /* array is a pointer to an array of partition_info structures */
                    573: /* array_size is the number of pre-allocated entries there are */
                    574: int get_only_partition(void *driver_info, int (*bottom_read_fun)(),
                    575:                         struct diskpart *array, int array_size,
                    576:                         int disk_size, char *drive_name)
                    577: {
                    578:        char buff[SECTOR_SIZE];
                    579:        int i,n,cnt;
                    580:        int arrsize;
                    581:        struct diskpart *res;
                    582: 
                    583:        /* first fill in the entire disk stuff */
                    584:        /* or should the calling routine do that already? */
                    585: 
                    586:        fill_array(array, 0, disk_size, NULL, 0, -1, -1);
                    587: 
                    588:        /* while the structure does not preclude additional nestings,
                    589:           additional ones make no sense currently, so they are not
                    590:           checked (Mach can't handle them anyway).  It might be nice
                    591:           if for all partitions found, all types of sub-partitions
                    592:           were looked for (unnecessary).  This will be done when this
                    593:            is moved out of ther kernel, and there is some way to name them */
                    594: 
                    595:        arrsize = array_size -1;  /* 1 for whole disk */
                    596: 
                    597:        /* search for dos partition table */
                    598:        /* find all the partitions (including logical) */
                    599:        n=get_dos(&array[1], buff, 0,
                    600:                 driver_info, (bottom_read_fun), drive_name,
                    601:                arrsize);
                    602: 
                    603:        if (n>0) {
                    604:                fill_array(array, 0, disk_size, &array[1], n, 
                    605:                        DISKPART_DOS, 256+DISKPART_DOS);
                    606:                arrsize-=n;
                    607: 
                    608: 
                    609:                /* search each one for a BSD disklabel (iff BSDOS) */
                    610:                /* note: searchine extended and logical partitions */
                    611:                for (i=0;i<n;i++)
                    612:                        if (array[i+1].fsys==BSDOS) {
                    613: #if (PARTITION_DEBUG) 
                    614:                                printf("BSD OS slice: %d\n",i+1);
                    615: #endif
                    616:                                cnt=get_disklabel(&array[n+1], buff, 
                    617:                                        array[i+1].start,
                    618:                                        driver_info, (bottom_read_fun),
                    619:                                        drive_name,arrsize);
                    620: 
                    621:                                if (cnt>0) {
                    622:                                        arrsize-=cnt;
                    623:                                        fill_array(&array[i+1],array[i+1].start,
                    624:                                                array[i+1].size, &array[n+1], 
                    625:                                                cnt, DISKPART_BSD,
                    626:                                                array[i+1].fsys);
                    627:                                }
                    628:                                n+=cnt;
                    629:                        }
                    630: 
                    631:                /* search for VTOC -- in a DOS partition as well */
                    632:                for (i=0;i<n;i++)
                    633:                        if (array[i+1].fsys==UNIXOS) {
                    634: #if (PARTITION_DEBUG) 
                    635:                                printf("UNIXOS (vtoc) partition\n");
                    636: #endif
                    637:                                 cnt=get_vtoc(&array[n+1], buff,   
                    638:                                         array[i+1].start,
                    639:                                         driver_info, (bottom_read_fun),
                    640:                                         drive_name,arrsize);
                    641: 
                    642:                                 if (cnt>0) {
                    643:                                        arrsize-=cnt;
                    644:                                         fill_array(&array[i+1],array[i+1].start,
                    645:                                                 array[i+1].size, &array[n+1],
                    646:                                                 cnt, DISKPART_VTOC,
                    647:                                                array[i+1].fsys);
                    648:                                }
                    649:                                n+=cnt;
                    650:                        }
                    651:        }
                    652: 
                    653:        /* search for only disklabel */
                    654:        if (n==0) {
                    655:                fill_array(array, 0, disk_size, &array[1], n, DISKPART_BSD,
                    656:                        256+DISKPART_BSD);
                    657:                n=get_disklabel(&array[1], buff, 0, driver_info, 
                    658:                        (bottom_read_fun), drive_name,arrsize);
                    659:        }
                    660: 
                    661:        /* search for only VTOC -- NOT TESTED! */
                    662:        if (n==0) {
                    663:                fill_array(array, 0, disk_size, &array[1], n, DISKPART_VTOC,
                    664:                        256+DISKPART_VTOC);
                    665:                n=get_vtoc(&array[1], buff, 0, driver_info, (bottom_read_fun), 
                    666:                        drive_name,arrsize);
                    667:        }
                    668: #if 0
                    669:        /* search for only omron -- NOT TESTED! */
                    670:        if (n==0) {
                    671:                fill_array(array, 0, disk_size, &array[1], n, DISKPART_OMRON,
                    672:                        256+DISKPART_OMRON);
                    673:                n=get_omron(&array[1], buff, 0,driver_info, (bottom_read_fun), 
                    674:                        drive_name,arrsize);
                    675:        }
                    676: 
                    677:        /* search for only dec -- NOT TESTED! */
                    678:        if (n==0) {
                    679:                fill_array(array, 0, disk_size, &array[1], n, DISKPART_DEC,
                    680:                        256+DISKPART_DEC);
                    681:                n=get_dec(&array[1], buff, 0, driver_info, (bottom_read_fun), 
                    682:                        drive_name,arrsize);
                    683:        }
                    684: #endif 0
                    685: 
                    686: #if (PARTITION_DEBUG)  /* print out what we found */
                    687:        print_array(array,0);
                    688: #endif
                    689: 
                    690: }
                    691: 
                    692: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.