Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/luna68k/luna68k Allow to mount disk with UniOS (== ...



details:   https://anonhg.NetBSD.org/src/rev/a854c7a025f2
branches:  trunk
changeset: 480399:a854c7a025f2
user:      nisimura <nisimura%NetBSD.org@localhost>
date:      Tue Jan 11 08:22:38 2000 +0000

description:
Allow to mount disk with UniOS (== ISI) disklabel as well as SunOS
label.  Klude to access weird rootfs on 'c' via 'b'.  ISI disklabel
can not be altered.  Use SunOS label.

diffstat:

 sys/arch/luna68k/luna68k/disksubr.c |  55 +++++++++++++++++++++++++-----------
 1 files changed, 38 insertions(+), 17 deletions(-)

diffs (136 lines):

diff -r 5e442c0df940 -r a854c7a025f2 sys/arch/luna68k/luna68k/disksubr.c
--- a/sys/arch/luna68k/luna68k/disksubr.c       Tue Jan 11 06:57:49 2000 +0000
+++ b/sys/arch/luna68k/luna68k/disksubr.c       Tue Jan 11 08:22:38 2000 +0000
@@ -1,5 +1,4 @@
-/* $NetBSD: disksubr.c,v 1.1 2000/01/05 08:49:03 nisimura Exp $ */
-/*     $NetBSD: disksubr.c,v 1.1 2000/01/05 08:49:03 nisimura Exp $    */
+/* $NetBSD: disksubr.c,v 1.2 2000/01/11 08:22:38 nisimura Exp $ */
 
 /*
  * Copyright (c) 1994, 1995 Gordon W. Ross
@@ -63,9 +62,8 @@
 #error "Default value of LABELSECTOR no longer zero?"
 #endif
 
-static char * disklabel_om_to_bsd(char *, struct disklabel *);
-static int disklabel_bsd_to_om(struct disklabel *, char *);
-#define        OM_DKMAGIC 0xdabe
+static char *disklabel_om_to_bsd __P((char *, struct disklabel *));
+static int disklabel_bsd_to_om __P((struct disklabel *, char *));
 
 /*
  * Attempt to read a disk label from a device
@@ -123,7 +121,7 @@
 
        /* Check for a UniOS-B disk label (for PROM compatibility). */
        slp = (struct sun_disklabel *)clp->cd_block;
-       if (slp->sl_magic == OM_DKMAGIC) {
+       if (slp->sl_magic == SUN_DKMAGIC) {
                return (disklabel_om_to_bsd(clp->cd_block, lp));
        }
 
@@ -343,10 +341,17 @@
        while (sp1 < sp2)
                cksum ^= *sp1++;
        if (cksum != 0)
-               return ("UNIOS-B disk label, bad checksum");
+               return ("UniOS-B disk label, bad checksum");
 
        memset((caddr_t)lp, 0, sizeof(struct disklabel));
 
+#if 1
+       if (sl->sl_rpm == 0) {
+               /* it's a UniOS disk */
+               strcpy(lp->d_typename, "UniOS label !!!");
+       }
+#endif
+
        /* Format conversion. */
        lp->d_magic = DISKMAGIC;
        lp->d_magic2 = DISKMAGIC;
@@ -362,14 +367,21 @@
        lp->d_secpercyl  = secpercyl;
        lp->d_secperunit = secpercyl * sl->sl_ncylinders;
 
-       lp->d_rpm          = 3600;                      /* XXX */
-       lp->d_interleave   = 1;                         /* XXX */
+       lp->d_sparespercyl = 0;                         /* XXX */
+       lp->d_acylinders   = sl->sl_acylinders;
+       lp->d_rpm = (sl->sl_rpm == 0) ? 3600 : sl->sl_rpm;/* XXX */
+       lp->d_interleave   = sl->sl_interleave;         /* XXX */
 
+#if 1
+       if (sl->sl_rpm == 0) {
+               /* UniOS label has blkoffset, not cyloffset */
+               secpercyl = 1;
+       }
+#endif
        lp->d_npartitions = 8;
        /* These are as defined in <ufs/ffs/fs.h> */
        lp->d_bbsize = 8192;                            /* XXX */
        lp->d_sbsize = 8192;                            /* XXX */
-
        for (i = 0; i < 8; i++) {
                spp = &sl->sl_part[i];
                npp = &lp->d_partitions[i];
@@ -380,6 +392,7 @@
                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.
@@ -394,6 +407,13 @@
                        }
                }
        }
+#if 1
+       if (sl->sl_rpm == 0) {
+               /* Make UniOS rootfs usable as part b */
+               lp->d_partitions[1] = lp->d_partitions[2];
+               lp->d_partitions[1].p_fstype = FS_BSDFFS;
+       }
+#endif
 
        lp->d_checksum = 0;
        lp->d_checksum = dkcksum(lp);
@@ -419,22 +439,23 @@
        u_short cksum, *sp1, *sp2;
 
        if (lp->d_secsize != 512)
-           return (EINVAL);
+               return (EINVAL);
 
        sl = (struct sun_disklabel *)cp;
-
+#if 1
+       if (sl->sl_rpm == 0) {
+               /* Never change UniOS label */
+               return (EPERM);
+       }
+#endif
        /* Format conversion. */
        memcpy(sl->sl_text, lp->d_packname, sizeof(lp->d_packname));
-#if 0
        sl->sl_rpm = lp->d_rpm;
        sl->sl_pcyl = lp->d_ncylinders + lp->d_acylinders;      /* XXX */
        sl->sl_sparespercyl = lp->d_sparespercyl;
        sl->sl_interleave   = lp->d_interleave;
-#endif
        sl->sl_ncylinders   = lp->d_ncylinders;
-#if 0
        sl->sl_acylinders   = lp->d_acylinders;
-#endif
        sl->sl_ntracks      = lp->d_ntracks;
        sl->sl_nsectors     = lp->d_nsectors;
 
@@ -448,7 +469,7 @@
                spp->sdkp_cyloffset = npp->p_offset / secpercyl;
                spp->sdkp_nsectors = npp->p_size;
        }
-       sl->sl_magic = OM_DKMAGIC;
+       sl->sl_magic = SUN_DKMAGIC;
 
        /* Correct the XOR check. */
        sp1 = (u_short *)sl;



Home | Main Index | Thread Index | Old Index