diff --git a/Create.c b/Create.c index 2e3d723..6349f86 100644 --- a/Create.c +++ b/Create.c @@ -387,14 +387,14 @@ int Create(struct supertype *st, char *mddev, if (strcmp(st->ss->name, "1.x") == 0 && st->minor_version >= 1) /* metadata at front */ - warn |= check_partitions(fd, dname, 0); + warn |= check_partitions(fd, dname, 0, 0); else if (level == 1 || level == LEVEL_CONTAINER || (level == 0 && raiddisks == 1)) /* partitions could be meaningful */ - warn |= check_partitions(fd, dname, freesize*2); + warn |= check_partitions(fd, dname, freesize*2, size*2); else /* partitions cannot be meaningful */ - warn |= check_partitions(fd, dname, 0); + warn |= check_partitions(fd, dname, 0, 0); if (strcmp(st->ss->name, "1.x") == 0 && st->minor_version >= 1 && did_default && diff --git a/mdadm.h b/mdadm.h index fa84ad2..d3ed50a 100644 --- a/mdadm.h +++ b/mdadm.h @@ -1079,7 +1079,9 @@ extern int parse_layout_faulty(char *layout); extern int check_ext2(int fd, char *name); extern int check_reiser(int fd, char *name); extern int check_raid(int fd, char *name); -extern int check_partitions(int fd, char *dname, unsigned long long freesize); +extern int check_partitions(int fd, char *dname, + unsigned long long freesize, + unsigned long long size); extern int get_mdp_major(void); extern int dev_open(char *dev, int flags); diff --git a/util.c b/util.c index c22bb3b..cc6ccb4 100644 --- a/util.c +++ b/util.c @@ -1370,7 +1370,8 @@ static int get_last_partition_end(int fd, unsigned long long *endofpart) return retval; } -int check_partitions(int fd, char *dname, unsigned long long freesize) +int check_partitions(int fd, char *dname, unsigned long long freesize, + unsigned long long size) { /* * Check where the last partition ends @@ -1393,6 +1394,12 @@ int check_partitions(int fd, char *dname, unsigned long long freesize) Name ": metadata will over-write last partition on %s.\n", dname); return 1; + } else if (size && endofpart > size) { + /* partitions will be truncated in new device */ + fprintf(stderr, + Name ": array size is too small to cover all partitions on %s.\n", + dname); + return 1; } } return 0;