patch-1.3.94 linux/arch/m68k/amiga/amipart.c
Next file: linux/arch/m68k/amiga/amisound.c
Previous file: linux/arch/m68k/amiga/amikeyb.c
Back to the patch index
Back to the overall index
- Lines: 120
- Date:
Wed Mar 20 20:03:41 1996
- Orig file:
v1.3.93/linux/arch/m68k/amiga/amipart.c
- Orig date:
Thu Jan 1 02:00:00 1970
diff -u --recursive --new-file v1.3.93/linux/arch/m68k/amiga/amipart.c linux/arch/m68k/amiga/amipart.c
@@ -0,0 +1,119 @@
+/*
+ * linux/amiga/amipart.c
+ *
+ * Amiga partition checking driver for 680x0 Linux
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file README.legal in the main directory of this archive
+ * for more details.
+ */
+
+#include <linux/fs.h>
+#include <linux/genhd.h>
+#include <linux/kernel.h>
+
+#include <asm/amigardb.h>
+#include <asm/machdep.h>
+
+extern int current_minor;
+
+static ulong checksum (ulong *ptr, int len)
+{
+ ulong sum;
+ int cnt;
+
+ for (sum = 0, cnt = 0; cnt < len; cnt++)
+ sum += ptr[cnt];
+
+ return sum;
+}
+
+/* XXX */
+/* int current_minor = 0; */
+
+void amiga_check_partition(struct gendisk *hd, kdev_t dev)
+{
+ int i, minor = current_minor, m_lim = current_minor + hd->max_p;
+ struct buffer_head *bh;
+ struct RigidDiskBlock *rdb;
+ struct PartitionBlock *pb;
+ ulong bnum, partsect;
+
+ for (bnum = 0; bnum < RDB_LOCATION_LIMIT/2; bnum++) {
+ if (!(bh = bread(dev,bnum,1024))) {
+ printk (" unable to read block %ld\n", bnum);
+ return;
+ }
+#ifdef DEBUG
+ printk ("block read, press mousebutton to continue\n");
+ waitbut();
+#endif
+ rdb = (struct RigidDiskBlock *)bh->b_data;
+ if (rdb->rdb_ID == IDNAME_RIGIDDISK)
+ break;
+ rdb = (struct RigidDiskBlock *)&bh->b_data[512];
+ if (rdb->rdb_ID == IDNAME_RIGIDDISK)
+ break;
+ brelse (bh);
+ }
+ if (bnum == RDB_LOCATION_LIMIT/2) {
+ /* no RDB on the disk! */
+ printk (" unable to find RigidDiskBlock\n");
+ return;
+ }
+
+ /* checksum the RigidDiskBlock */
+ if (checksum ((ulong *)rdb, rdb->rdb_SummedLongs) != 0) {
+ printk (" RDB checksum bad\n");
+ return;
+ }
+
+ printk(" %s%c:", hd->major_name, 'a'+(minor >> hd->minor_shift));
+
+ partsect = rdb->rdb_PartitionList;
+ brelse (bh);
+
+ for (i = 1; minor < m_lim && partsect != 0xffffffff; minor++, i++)
+ {
+ ulong *env;
+
+ if (!(bh = bread(dev,partsect/2,1024))) {
+ printk (" block %ld read failed\n", partsect);
+ return;
+ }
+#ifdef DEBUG
+ printk ("block read, press mousebutton to continue\n");
+ waitbut();
+#endif
+ pb = (struct PartitionBlock *)bh->b_data;
+ if (partsect & 1)
+ pb = (struct PartitionBlock *)&bh->b_data[512];
+ if (pb->pb_ID != IDNAME_PARTITION) {
+ printk (" block %ld Not a partition block (%#lx)\n",
+ partsect, pb->pb_ID);
+ brelse (bh);
+ return;
+ }
+ if (checksum ((ulong *)pb, pb->pb_SummedLongs) != 0) {
+ printk (" block %ld checksum bad\n", partsect);
+ brelse (bh);
+ return;
+ }
+
+ env = pb->pb_Environment;
+
+ hd->part[minor].start_sect = env[DE_LOWCYL]
+ * env[DE_NUMHEADS] * env[DE_BLKSPERTRACK];
+ hd->part[minor].nr_sects = (env[DE_UPPERCYL]
+ - env[DE_LOWCYL] + 1)
+ * env[DE_NUMHEADS] * env[DE_BLKSPERTRACK];
+
+ printk(" %s%c%d", hd->major_name,
+ 'a'+(minor >> hd->minor_shift), i);
+
+ partsect = pb->pb_Next;
+ brelse (bh);
+ }
+
+ printk ("\n");
+}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov
with Sam's (original) version of this