]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super0.c
Add 'container' level and ->validate_geometry method.
[thirdparty/mdadm.git] / super0.c
index 2476d7715998b524eaf474602b2e9b242be4225b..a1c97f8892fcb4cb9728e0a27395b63e4d69f51c 100644 (file)
--- a/super0.c
+++ b/super0.c
@@ -850,12 +850,14 @@ static struct supertype *match_metadata_desc0(char *arg)
        if (strcmp(arg, "0") == 0 ||
            strcmp(arg, "0.90") == 0 ||
            strcmp(arg, "0.91") == 0 ||
-           strcmp(arg, "default") == 0
+           strcmp(arg, "default") == 0 ||
+           strcmp(arg, "") == 0 /* no metadata */
                )
                return st;
 
        st->minor_version = 9; /* flag for 'byte-swapped' */
-       if (strcmp(arg, "0.swap")==0)
+       if (strcmp(arg, "0.swap")==0 ||
+           strcmp(arg, "0.9") == 0) /* For dup_super support */
                return st;
 
        free(st);
@@ -989,6 +991,43 @@ static void free_super0(struct supertype *st)
        st->sb = NULL;
 }
 
+static int validate_geometry0(struct supertype *st, int level,
+                             int layout, int raiddisks,
+                             int chunk, unsigned long long size,
+                             char *subdev, unsigned long long *freesize)
+{
+       unsigned long long ldsize;
+       int fd;
+
+       if (level == LEVEL_CONTAINER)
+               return 0;
+       if (raiddisks > MD_SB_DISKS)
+               return 0;
+       if (size > (0x7fffffffULL<<10))
+               return 0;
+       if (!subdev)
+               return 1;
+
+       fd = open(subdev, O_RDONLY|O_EXCL, 0);
+       if (fd < 0) {
+               fprintf(stderr, Name ": Cannot open %s: %s\n",
+                       subdev, strerror(errno));
+               return 0;
+       }
+       if (!get_dev_size(fd, subdev, &ldsize)) {
+               close(fd);
+               return 0;
+       }
+       close(fd);
+
+       if (ldsize < MD_RESERVED_SECTORS * 512)
+               return 0;
+       if (size > (0x7fffffffULL<<10))
+               return 0;
+       *freesize = MD_NEW_SIZE_SECTORS(ldsize >> 9);
+       return 1;
+}
+
 struct superswitch super0 = {
 #ifndef MDASSEMBLE
        .examine_super = examine_super0,
@@ -1014,6 +1053,7 @@ struct superswitch super0 = {
        .locate_bitmap = locate_bitmap0,
        .write_bitmap = write_bitmap0,
        .free_super = free_super0,
+       .validate_geometry = validate_geometry0,
        .major = 0,
        .swapuuid = 0,
 };