Skip to content

Commit

Permalink
[PATCH] partitions: Read Rio Karma partition table
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Bob Copeland authored and Linus Torvalds committed Jan 17, 2006
1 parent cad8244 commit 0e6e1db
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 0 deletions.
7 changes: 7 additions & 0 deletions fs/partitions/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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.

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
Expand Down
1 change: 1 addition & 0 deletions fs/partitions/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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_KARMA_PARTITION) += karma.o
4 changes: 4 additions & 0 deletions fs/partitions/check.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#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);
Expand Down Expand Up @@ -102,6 +103,9 @@ static int (*check_part[])(struct parsed_partitions *, struct block_device *) =
#endif
#ifdef CONFIG_IBM_PARTITION
ibm_partition,
#endif
#ifdef CONFIG_KARMA_PARTITION
karma_partition,
#endif
NULL
};
Expand Down
57 changes: 57 additions & 0 deletions fs/partitions/karma.c
Original file line number Diff line number Diff line change
@@ -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;
}

8 changes: 8 additions & 0 deletions fs/partitions/karma.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* fs/partitions/karma.h
*/

#define KARMA_LABEL_MAGIC 0xAB56

int karma_partition(struct parsed_partitions *state, struct block_device *bdev);

0 comments on commit 0e6e1db

Please sign in to comment.