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@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/dm-devel -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel