Separate the struct disklabel filling stuff from the rest of Write_FreeBSD().

This commit is contained in:
Poul-Henning Kamp 2002-10-23 19:32:18 +00:00
parent 3c284de5a5
commit 56c0241de6
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=105815

View File

@ -28,8 +28,59 @@ __FBSDID("$FreeBSD$");
#include <paths.h> #include <paths.h>
#include "libdisk.h" #include "libdisk.h"
#define DEF_RPM 3600 /* XXX: A lot of hardcoded 512s probably should be foo->sector_size;
#define DEF_INTERLEAVE 1 I'm not sure which, so I leave it like it worked before. --schweikh */
static void
Fill_Disklabel(struct disklabel *dl, const struct disk *new, const struct disk *old, const struct chunk *c1)
{
struct chunk *c2;
int j;
memset(dl, 0, sizeof *dl);
for(c2 = c1->part; c2; c2 = c2->next) {
if (c2->type == unused) continue;
if (!strcmp(c2->name, "X")) continue;
j = c2->name[strlen(c2->name) - 1] - 'a';
if (j < 0 || j >= MAXPARTITIONS || j == RAW_PART)
continue;
dl->d_partitions[j].p_size = c2->size;
dl->d_partitions[j].p_offset = c2->offset;
dl->d_partitions[j].p_fstype = c2->subtype;
}
dl->d_bbsize = BBSIZE;
/*
* Add in defaults for superblock size, interleave, and rpms
*/
dl->d_sbsize = 0;
strcpy(dl->d_typename, c1->name);
dl->d_secsize = 512;
dl->d_secperunit = new->chunks->size;
dl->d_ncylinders = new->bios_cyl;
dl->d_ntracks = new->bios_hd;
dl->d_nsectors = new->bios_sect;
dl->d_secpercyl = dl->d_ntracks * dl->d_nsectors;
dl->d_npartitions = MAXPARTITIONS;
dl->d_type = new->name[0] == 's' || new->name[0] == 'd' ||
new->name[0] == 'o' ? DTYPE_SCSI : DTYPE_ESDI;
dl->d_partitions[RAW_PART].p_size = c1->size;
dl->d_partitions[RAW_PART].p_offset = c1->offset;
dl->d_rpm = 3600;
dl->d_interleave = 1;
dl->d_magic = DISKMAGIC;
dl->d_magic2 = DISKMAGIC;
dl->d_checksum = dkcksum(dl);
return;
}
/* XXX: A lot of hardcoded 512s probably should be foo->sector_size; /* XXX: A lot of hardcoded 512s probably should be foo->sector_size;
I'm not sure which, so I leave it like it worked before. --schweikh */ I'm not sure which, so I leave it like it worked before. --schweikh */
@ -37,8 +88,7 @@ static int
Write_FreeBSD(int fd, const struct disk *new, const struct disk *old, const struct chunk *c1) Write_FreeBSD(int fd, const struct disk *new, const struct disk *old, const struct chunk *c1)
{ {
struct disklabel *dl; struct disklabel *dl;
struct chunk *c2; int i;
int i,j;
void *p; void *p;
u_char buf[BBSIZE]; u_char buf[BBSIZE];
#ifdef __alpha__ #ifdef __alpha__
@ -62,58 +112,7 @@ Write_FreeBSD(int fd, const struct disk *new, const struct disk *old, const stru
#endif #endif
dl = (struct disklabel *)(buf + 512 * LABELSECTOR + LABELOFFSET); dl = (struct disklabel *)(buf + 512 * LABELSECTOR + LABELOFFSET);
memset(dl, 0, sizeof *dl); Fill_Disklabel(dl, new, old, c1);
for(c2 = c1->part; c2; c2 = c2->next) {
if (c2->type == unused) continue;
if (!strcmp(c2->name, "X")) continue;
#ifdef __alpha__
j = c2->name[strlen(c2->name) - 1] - 'a';
#else
j = c2->name[strlen(new->name) + 2] - 'a';
#endif
if (j < 0 || j >= MAXPARTITIONS || j == RAW_PART) {
#ifdef DEBUG
warn("weird partition letter %c", c2->name[strlen(new->name) + 2]);
#endif
continue;
}
dl->d_partitions[j].p_size = c2->size;
dl->d_partitions[j].p_offset = c2->offset;
dl->d_partitions[j].p_fstype = c2->subtype;
}
dl->d_bbsize = BBSIZE;
/*
* Add in defaults for superblock size, interleave, and rpms
*/
dl->d_sbsize = 0;
dl->d_interleave = DEF_INTERLEAVE;
dl->d_rpm = DEF_RPM;
strcpy(dl->d_typename, c1->name);
dl->d_secsize = 512;
dl->d_secperunit = new->chunks->size;
dl->d_ncylinders = new->bios_cyl;
dl->d_ntracks = new->bios_hd;
dl->d_nsectors = new->bios_sect;
dl->d_secpercyl = dl->d_ntracks * dl->d_nsectors;
dl->d_npartitions = MAXPARTITIONS;
dl->d_type = new->name[0] == 's' || new->name[0] == 'd' ||
new->name[0] == 'o' ? DTYPE_SCSI : DTYPE_ESDI;
dl->d_partitions[RAW_PART].p_size = c1->size;
dl->d_partitions[RAW_PART].p_offset = c1->offset;
#ifdef PC98
dl->d_rpm = 3600;
dl->d_interleave = 1;
#endif
dl->d_magic = DISKMAGIC;
dl->d_magic2 = DISKMAGIC;
dl->d_checksum = dkcksum(dl);
#ifdef __alpha__ #ifdef __alpha__
/* /*