1 /*
2 * Copyright (c) 1992 OMRON Corporation.
3 * Copyright (c) 1992, 1993
4 * The Regents of the University of California. All rights reserved.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * OMRON Corporation.
8 *
9 * %sccs.include.redist.c%
10 *
11 * @(#)ufs_disksubr.c 8.1 (Berkeley) 06/10/93
12 */
13
14 /*
15 * ufs_disksubr.c -- disk utility routines
16 * by A.Fujita, FEB-26-1992
17 */
18
19 #include <sys/param.h>
20 #include <sys/disklabel.h>
21 #include <luna68k/dev/scsireg.h>
22
23 extern u_char lbl_buff[];
24
25 /*
26 * Attempt to read a disk label from a device
27 * using the indicated stategy routine.
28 * The label must be partly set up before this:
29 * secpercyl and anything required in the strategy routine
30 * (e.g., sector size) must be filled in before calling us.
31 * Returns null on success and an error string on failure.
32 */
33 char *
readdisklabel(dev,strat,lp)34 readdisklabel(dev, strat, lp)
35 int dev;
36 int (*strat)();
37 register struct disklabel *lp;
38 {
39 register u_char *bp = lbl_buff;
40 struct disklabel *dlp;
41 char *msg = NULL;
42 static struct scsi_fmt_cdb cdb = {
43 6,
44 CMD_READ, 0, 0, 0, 1, 0
45 };
46
47 if (lp->d_secperunit == 0)
48 lp->d_secperunit = 0x1fffffff;
49 lp->d_npartitions = 1;
50 if (lp->d_partitions[0].p_size == 0)
51 lp->d_partitions[0].p_size = 0x1fffffff;
52 lp->d_partitions[0].p_offset = 0;
53
54 if (scsi_immed_command(0, dev, 0, &cdb, bp, DEV_BSIZE) != 0) {
55 msg = "I/O error";
56 } else {
57 for (dlp = (struct disklabel *)bp;
58 dlp <= (struct disklabel *)(bp + DEV_BSIZE - sizeof(*dlp));
59 dlp = (struct disklabel *)((char *)dlp + sizeof(long))) {
60 if (dlp->d_magic != DISKMAGIC || dlp->d_magic2 != DISKMAGIC) {
61 if (msg == NULL)
62 msg = "no disk label";
63 } else if (dlp->d_npartitions > MAXPARTITIONS ||
64 dkcksum(dlp) != 0)
65 msg = "disk label corrupted";
66 else {
67 *lp = *dlp;
68 msg = NULL;
69 break;
70 }
71 }
72 }
73
74 return (msg);
75 }
76