X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=super-gpt.c;h=a1e9aa9dc79a00bb01a5e28e9d779bf4fad3ab83;hb=6636788aaf4ec0cacaefb6e77592e4a68e70a957;hp=6f852aa128ecd4df4a2cd3978adb0647cfac2502;hpb=c21e737ba12903ecf3a4f42a119807d328f3f8c9;p=thirdparty%2Fmdadm.git diff --git a/super-gpt.c b/super-gpt.c index 6f852aa1..a1e9aa9d 100644 --- a/super-gpt.c +++ b/super-gpt.c @@ -47,7 +47,6 @@ static void free_gpt(struct supertype *st) st->sb = NULL; } -#ifndef MDASSEMBLE static void examine_gpt(struct supertype *st, char *homehost) { struct GPT *gpt = st->sb + 512; @@ -66,43 +65,47 @@ static void examine_gpt(struct supertype *st, char *homehost) ); } } -#endif /* MDASSEMBLE */ static int load_gpt(struct supertype *st, int fd, char *devname) { struct MBR *super; struct GPT *gpt_head; int to_read; + unsigned int sector_size; free_gpt(st); - if (posix_memalign((void**)&super, 512, 32*512) != 0) { - fprintf(stderr, Name ": %s could not allocate superblock\n", - __func__); + if (posix_memalign((void**)&super, 4096, 32*512) != 0) { + pr_err("could not allocate superblock\n"); return 1; } - ioctl(fd, BLKFLSBUF, 0); /* make sure we read current data */ + if (!get_dev_sector_size(fd, devname, §or_size)) { + free(super); + return 1; + } lseek(fd, 0, 0); if (read(fd, super, sizeof(*super)) != sizeof(*super)) { no_read: if (devname) - fprintf(stderr, Name ": Cannot read partition table on %s\n", + pr_err("Cannot read partition table on %s\n", devname); free(super); return 1; } - + if (super->magic != MBR_SIGNATURE_MAGIC || super->parts[0].part_type != MBR_GPT_PARTITION_TYPE) { not_found: if (devname) - fprintf(stderr, Name ": No partition table found on %s\n", + pr_err("No partition table found on %s\n", devname); free(super); return 1; } + /* Set offset to second block (GPT header) */ + lseek(fd, sector_size, SEEK_SET); /* Seem to have GPT, load the header */ gpt_head = (struct GPT*)(super+1); if (read(fd, gpt_head, sizeof(*gpt_head)) != sizeof(*gpt_head)) @@ -114,6 +117,8 @@ static int load_gpt(struct supertype *st, int fd, char *devname) to_read = __le32_to_cpu(gpt_head->part_cnt) * sizeof(struct GPT_part_entry); to_read = ((to_read+511)/512) * 512; + /* Set offset to third block (GPT entries) */ + lseek(fd, sector_size*2, SEEK_SET); if (read(fd, gpt_head+1, to_read) != to_read) goto no_read; @@ -175,12 +180,14 @@ static void getinfo_gpt(struct supertype *st, struct mdinfo *info, char *map) static struct supertype *match_metadata_desc(char *arg) { - struct supertype *st = malloc(sizeof(*st)); + struct supertype *st = xmalloc(sizeof(*st)); if (!st) return st; - if (strcmp(arg, "gpt") != 0) + if (strcmp(arg, "gpt") != 0) { + free(st); return NULL; + } st->ss = &gpt; st->info = NULL; @@ -190,23 +197,20 @@ static struct supertype *match_metadata_desc(char *arg) return st; } -#ifndef MDASSEMBLE static int validate_geometry(struct supertype *st, int level, int layout, int raiddisks, int *chunk, unsigned long long size, + unsigned long long data_offset, char *subdev, unsigned long long *freesize, - int verbose) + int consistency_policy, int verbose) { - fprintf(stderr, Name ": gpt metadata cannot be used this way\n"); + pr_err("gpt metadata cannot be used this way\n"); return 0; } -#endif struct superswitch gpt = { -#ifndef MDASSEMBLE .examine_super = examine_gpt, .validate_geometry = validate_geometry, -#endif .match_metadata_desc = match_metadata_desc, .load_super = load_gpt, .store_super = store_gpt,