-/* $NetBSD: disksubr.c,v 1.9.2.1 1995/10/30 23:36:34 gwr Exp $ */
+/* $NetBSD: disksubr.c,v 1.9.2.2 1995/11/18 06:58:03 gwr Exp $ */
/*
* Copyright (c) 1994, 1995 Gordon W. Ross
int i;
/* sanity clause */
- if (nlp->d_secpercyl == 0 || nlp->d_secsize == 0
- || (nlp->d_secsize % DEV_BSIZE) != 0)
- return(EINVAL);
+ if ((nlp->d_secpercyl == 0) || (nlp->d_secsize == 0) ||
+ (nlp->d_secsize % DEV_BSIZE) != 0)
+ return(EINVAL);
/* special case to allow disklabel to be invalidated */
if (nlp->d_magic == 0xffffffff) {
return (0);
}
- if (nlp->d_magic != DISKMAGIC || nlp->d_magic2 != DISKMAGIC ||
+ if (nlp->d_magic != DISKMAGIC ||
+ nlp->d_magic2 != DISKMAGIC ||
dkcksum(nlp) != 0)
return (EINVAL);
return (EBUSY);
opp = &olp->d_partitions[i];
npp = &nlp->d_partitions[i];
- if (npp->p_offset != opp->p_offset || npp->p_size < opp->p_size)
+ if (npp->p_offset != opp->p_offset ||
+ npp->p_size < opp->p_size)
return (EBUSY);
- /*
- * Copy internally-set partition information
- * if new label doesn't include it. XXX
- */
- if (npp->p_fstype == FS_UNUSED && opp->p_fstype != FS_UNUSED) {
- npp->p_fstype = opp->p_fstype;
- npp->p_fsize = opp->p_fsize;
- npp->p_frag = opp->p_frag;
- npp->p_cpg = opp->p_cpg;
- }
}
- nlp->d_checksum = 0;
- nlp->d_checksum = dkcksum(nlp);
+
+ /* We did not modify the new label, so the checksum is OK. */
*olp = *nlp;
return (0);
}
return("SunOS disk label, bad checksum");
/* Format conversion. */
- lp->d_magic = 0; /* denote as pseudo */
+ lp->d_magic = DISKMAGIC;
+ lp->d_magic2 = DISKMAGIC;
memcpy(lp->d_packname, sl->sl_text, sizeof(lp->d_packname));
lp->d_secsize = 512;
npp = &lp->d_partitions[i];
npp->p_offset = spp->sdkp_cyloffset * secpercyl;
npp->p_size = spp->sdkp_nsectors;
- if (npp->p_size)
+ if (npp->p_size == 0)
+ npp->p_fstype = FS_UNUSED;
+ else {
+ /* Partition has non-zero size. Set type, etc. */
npp->p_fstype = sun_fstypes[i];
+ /*
+ * The sun label does not store the FFS fields,
+ * so just set them with default values here.
+ * XXX: This keeps newfs from trying to rewrite
+ * XXX: the disk label in the most common case.
+ * XXX: (Should remove that code from newfs...)
+ */
+ if (npp->p_fstype == FS_BSDFFS) {
+ npp->p_fsize = 1024;
+ npp->p_frag = 8;
+ npp->p_cpg = 16;
+ }
+ }
}
+ lp->d_checksum = 0;
+ lp->d_checksum = dkcksum(lp);
+
return(NULL);
}
int i, secpercyl;
u_short cksum, *sp1, *sp2;
+ if (lp->d_secsize != 512)
+ return (EINVAL);
+
sl = (struct sun_disklabel *)cp;
/* Format conversion. */