[PATCH] partitions: Read Rio Karma partition table
authorBob Copeland <me@bobcopeland.com>
Tue, 17 Jan 2006 06:14:20 +0000 (22:14 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Tue, 17 Jan 2006 07:15:29 +0000 (23:15 -0800)
The Rio Karma portable MP3 player has its own proprietary partition table.

The partition layout is similar to a DOS boot sector but it begins at a
different offset and uses a different magic number (0xAB56 instead of
0xAA55).  Add support for it to enable mounting the device.

Signed-off-by: Bob Copeland <me@bobcopeland.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
fs/partitions/Kconfig
fs/partitions/Makefile
fs/partitions/check.c
fs/partitions/karma.c [new file with mode: 0644]
fs/partitions/karma.h [new file with mode: 0644]

index 7490cc9208b35d743337a51019f32e0b914ae0db..c9a478099281711e134b5df8be37b9f1ac0ef5f0 100644 (file)
@@ -222,6 +222,13 @@ config SUN_PARTITION
          given by the tar program ("man tar" or preferably "info tar"). If
          you don't know what all this is about, say N.
 
          given by the tar program ("man tar" or preferably "info tar"). If
          you don't know what all this is about, say N.
 
+config KARMA_PARTITION
+       bool "Karma Partition support"
+       depends on PARTITION_ADVANCED
+       help
+         Say Y here if you would like to mount the Rio Karma MP3 player, as it
+         uses a proprietary partition table.
+
 config EFI_PARTITION
        bool "EFI GUID Partition support"
        depends on PARTITION_ADVANCED
 config EFI_PARTITION
        bool "EFI GUID Partition support"
        depends on PARTITION_ADVANCED
index 66d5cc26fafbf65bfcdf4b18a0ee49c5e48ebbc7..42c7d3878ed08272f5d2341fe93d2182c2257665 100644 (file)
@@ -17,3 +17,4 @@ obj-$(CONFIG_SUN_PARTITION) += sun.o
 obj-$(CONFIG_ULTRIX_PARTITION) += ultrix.o
 obj-$(CONFIG_IBM_PARTITION) += ibm.o
 obj-$(CONFIG_EFI_PARTITION) += efi.o
 obj-$(CONFIG_ULTRIX_PARTITION) += ultrix.o
 obj-$(CONFIG_IBM_PARTITION) += ibm.o
 obj-$(CONFIG_EFI_PARTITION) += efi.o
+obj-$(CONFIG_KARMA_PARTITION) += karma.o
index 7881ce05daef359ef012a139c2046e712969d38a..f924f459bdb8063cebbbeba8111797b6b1214b44 100644 (file)
@@ -35,6 +35,7 @@
 #include "ibm.h"
 #include "ultrix.h"
 #include "efi.h"
 #include "ibm.h"
 #include "ultrix.h"
 #include "efi.h"
+#include "karma.h"
 
 #ifdef CONFIG_BLK_DEV_MD
 extern void md_autodetect_dev(dev_t dev);
 
 #ifdef CONFIG_BLK_DEV_MD
 extern void md_autodetect_dev(dev_t dev);
@@ -102,6 +103,9 @@ static int (*check_part[])(struct parsed_partitions *, struct block_device *) =
 #endif
 #ifdef CONFIG_IBM_PARTITION
        ibm_partition,
 #endif
 #ifdef CONFIG_IBM_PARTITION
        ibm_partition,
+#endif
+#ifdef CONFIG_KARMA_PARTITION
+       karma_partition,
 #endif
        NULL
 };
 #endif
        NULL
 };
diff --git a/fs/partitions/karma.c b/fs/partitions/karma.c
new file mode 100644 (file)
index 0000000..176d89b
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ *  fs/partitions/karma.c
+ *  Rio Karma partition info.
+ *
+ *  Copyright (C) 2006 Bob Copeland (me@bobcopeland.com)
+ *  based on osf.c
+ */
+
+#include "check.h"
+#include "karma.h"
+
+int karma_partition(struct parsed_partitions *state, struct block_device *bdev)
+{
+       int i;
+       int slot = 1;
+       Sector sect;
+       unsigned char *data;
+       struct disklabel {
+               u8 d_reserved[270];
+               struct d_partition {
+                       __le32 p_res;
+                       u8 p_fstype;
+                       u8 p_res2[3];
+                       __le32 p_offset;
+                       __le32 p_size;
+               } d_partitions[2];
+               u8 d_blank[208];
+               __le16 d_magic;
+       } __attribute__((packed)) *label;
+       struct d_partition *p;
+
+       data = read_dev_sector(bdev, 0, &sect);
+       if (!data)
+               return -1;
+
+       label = (struct disklabel *)data;
+       if (le16_to_cpu(label->d_magic) != KARMA_LABEL_MAGIC) {
+               put_dev_sector(sect);
+               return 0;
+       }
+
+       p = label->d_partitions;
+       for (i = 0 ; i < 2; i++, p++) {
+               if (slot == state->limit)
+                       break;
+
+               if (p->p_fstype == 0x4d && le32_to_cpu(p->p_size)) {
+                       put_partition(state, slot, le32_to_cpu(p->p_offset),
+                               le32_to_cpu(p->p_size));
+               }
+               slot++;
+       }
+       printk("\n");
+       put_dev_sector(sect);
+       return 1;
+}
+
diff --git a/fs/partitions/karma.h b/fs/partitions/karma.h
new file mode 100644 (file)
index 0000000..ecf7d3f
--- /dev/null
@@ -0,0 +1,8 @@
+/*
+ *  fs/partitions/karma.h
+ */
+
+#define KARMA_LABEL_MAGIC              0xAB56
+
+int karma_partition(struct parsed_partitions *state, struct block_device *bdev);
+
This page took 0.031317 seconds and 5 git commands to generate.