[dm-devel] [PATCH] Add PS3 HDD partition table support

Christophe Varoqui christophe.varoqui at gmail.com
Wed Feb 20 06:28:19 UTC 2013


On sam., 2013-02-16 at 13:52 +0100, Phileas Fogg wrote:
> Hi,
> 
> i would like to submit a patch which adds the PS3 HDD partition table support to 
> kpartx.
> 
Hi,

Would you be so kind as to rebase this patch for inclusion ?

As I have no way to test it, so if someone can sign it off, all the
better.

Best regards,
Christophe Varoqui
www.opensvc.com

> --- a/kpartx/Makefile    2012-09-07 00:15:06.163999993 -0800
> +++ b/kpartx/Makefile    2012-09-07 00:15:25.935999993 -0800
> @@ -14,7 +14,7 @@
> 
>   LDFLAGS = -ldevmapper
>   OBJS = bsd.o dos.o kpartx.o solaris.o unixware.o dasd.o sun.o \
> -       gpt.o mac.o crc32.o lopart.o xstrncpy.o devmapper.o
> +       gpt.o mac.o ps3.o crc32.o lopart.o xstrncpy.o devmapper.o
>   EXEC = kpartx
> 
>   all: $(EXEC)
> --- a/kpartx/byteorder.h    2012-09-07 00:30:30.679999971 -0800
> +++ b/kpartx/byteorder.h    2012-09-07 00:31:08.075999971 -0800
> @@ -12,12 +12,16 @@
>   #  define le16_to_cpu(x) (x)
>   #  define be16_to_cpu(x) bswap_16(x)
>   #  define le32_to_cpu(x) (x)
> +#  define le64_to_cpu(x) (x)
>   #  define be32_to_cpu(x) bswap_32(x)
> +#  define be64_to_cpu(x) bswap_64(x)
>   #elif BYTE_ORDER == BIG_ENDIAN
>   #  define le16_to_cpu(x) bswap_16(x)
>   #  define be16_to_cpu(x) (x)
>   #  define le32_to_cpu(x) bswap_32(x)
> +#  define le64_to_cpu(x) bswap_64(x)
>   #  define be32_to_cpu(x) (x)
> +#  define be64_to_cpu(x) (x)
>   #else
>   #  error unsupported
>   #endif
> --- a/kpartx/kpartx.h    2012-09-07 00:17:56.503999989 -0800
> +++ b/kpartx/kpartx.h    2012-09-07 00:18:08.495999989 -0800
> @@ -39,6 +39,7 @@
>   extern ptreader read_dasd_pt;
>   extern ptreader read_mac_pt;
>   extern ptreader read_sun_pt;
> +extern ptreader read_ps3_pt;
> 
>   char *getblock(int fd, unsigned int secnr);
> 
> --- a/kpartx/kpartx.c    2012-09-07 00:15:37.567999993 -0800
> +++ b/kpartx/kpartx.c    2012-09-07 00:16:05.635999993 -0800
> @@ -80,6 +80,7 @@
>       addpts("dasd", read_dasd_pt);
>       addpts("mac", read_mac_pt);
>       addpts("sun", read_sun_pt);
> +    addpts("ps3", read_ps3_pt);
>   }
> 
>   static char short_opts[] = "rladfgvp:t:su";
> --- /dev/null    2012-09-07 00:07:55.900000003 -0800
> +++ b/kpartx/ps3.c    2012-09-07 00:29:52.987999973 -0800
> @@ -0,0 +1,72 @@
> +#include "kpartx.h"
> +#include "byteorder.h"
> +#include <sys/types.h>
> +#include <string.h>
> +
> +#define SECTOR_SIZE        512
> +#define MAX_ACL_ENTRIES        8
> +#define MAX_PARTITIONS        8
> +
> +#define MAGIC1            0x0FACE0FFULL
> +#define MAGIC2            0xDEADFACEULL
> +
> +struct p_acl_entry {
> +    u_int64_t laid;
> +    u_int64_t rights;
> +};
> +
> +struct d_partition {
> +    u_int64_t p_start;
> +    u_int64_t p_size;
> +    struct p_acl_entry p_acl[MAX_ACL_ENTRIES];
> +};
> +
> +struct disklabel {
> +    u_int8_t d_res1[16];
> +    u_int64_t d_magic1;
> +    u_int64_t d_magic2;
> +    u_int64_t d_res2;
> +    u_int64_t d_res3;
> +    struct d_partition d_partitions[MAX_PARTITIONS];
> +    u_int8_t d_pad[0x600 - MAX_PARTITIONS * sizeof(struct d_partition)- 0x30];
> +};
> +
> +static int
> +read_disklabel(int fd, struct disklabel *label) {
> +    unsigned char *data;
> +    int i;
> +
> +    for (i = 0; i < sizeof(struct disklabel) / SECTOR_SIZE; i++) {
> +        data = (unsigned char *) getblock(fd, i);
> +        if (!data)
> +            return 0;
> +
> +        memcpy((unsigned char *) label + i * SECTOR_SIZE, data, SECTOR_SIZE);
> +    }
> +
> +    return 1;
> +}
> +
> +int
> +read_ps3_pt(int fd, struct slice all, struct slice *sp, int ns) {
> +    struct disklabel label;
> +        int n = 0;
> +    int i;
> +
> +    if (!read_disklabel(fd, &label))
> +        return -1;
> +
> +    if ((be64_to_cpu(label.d_magic1) != MAGIC1) ||
> +        (be64_to_cpu(label.d_magic2) != MAGIC2))
> +        return -1;
> +
> +    for (i = 0; i < MAX_PARTITIONS; i++) {
> +        if (label.d_partitions[i].p_start && label.d_partitions[i].p_size) {
> +            sp[n].start = be64_to_cpu(label.d_partitions[i].p_start);
> +            sp[n].size = be64_to_cpu(label.d_partitions[i].p_size);
> +            n++;
> +        }
> +    }
> +
> +    return n;
> +}
> 
> --
> dm-devel mailing list
> dm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/dm-devel






More information about the dm-devel mailing list