]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super1.c
Centralise code for copying uuid
[thirdparty/mdadm.git] / super1.c
index 140f637197d65f4b8ab9ccefe836561c63c28ef2..a480f21cf3386fbdfdd059238b37804f64147b70 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -174,7 +174,9 @@ static void examine_super1(void *sbv, char *homehost)
        printf("     Raid Level : %s\n", c?c:"-unknown-");
        printf("   Raid Devices : %d\n", __le32_to_cpu(sb->raid_disks));
        printf("\n");
-       printf("    Device Size : %llu%s\n", (unsigned long long)sb->data_size, human_size(sb->data_size<<9));
+       printf("  Used Dev Size : %llu%s\n",
+              (unsigned long long)sb->data_size,
+              human_size(sb->data_size<<9));
        if (__le32_to_cpu(sb->level) >= 0) {
                int ddsks=0;
                switch(__le32_to_cpu(sb->level)) {
@@ -429,6 +431,9 @@ static void getinfo_super1(struct mdinfo *info, void *sbv)
        info->array.ctime = __le64_to_cpu(sb->ctime);
        info->array.utime = __le64_to_cpu(sb->utime);
        info->array.chunk_size = __le32_to_cpu(sb->chunksize)*512;
+       info->array.state =
+               (__le64_to_cpu(sb->resync_offset) >= __le64_to_cpu(sb->size))
+               ? 1 : 0;
 
        info->data_offset = __le64_to_cpu(sb->data_offset);
        info->component_size = __le64_to_cpu(sb->size);
@@ -533,11 +538,12 @@ static int update_super1(struct mdinfo *info, void *sbv, char *update,
                sb->resync_offset = 0ULL;
        }
        if (strcmp(update, "uuid") == 0) {
-               memcpy(sb->set_uuid, info->uuid, 16);
+               copy_uuid(sb->set_uuid, info->uuid, super1.swapuuid);
+
                if (__le32_to_cpu(sb->feature_map)&MD_FEATURE_BITMAP_OFFSET) {
                        struct bitmap_super_s *bm;
                        bm = (struct bitmap_super_s*)(sbv+1024);
-                       memcpy(bm->uuid, info->uuid, 16);
+                       memcpy(bm->uuid, sb->set_uuid, 16);
                }
        }
        if (strcmp(update, "homehost") == 0 &&
@@ -583,7 +589,7 @@ static int update_super1(struct mdinfo *info, void *sbv, char *update,
 }
 
 static int init_super1(struct supertype *st, void **sbp, mdu_array_info_t *info,
-                      unsigned long long size, char *name, char *homehost)
+                      unsigned long long size, char *name, char *homehost, int *uuid)
 {
        struct mdp_superblock_1 *sb = malloc(1024 + sizeof(bitmap_super_t) +
                                             sizeof(struct misc_dev_info));
@@ -610,14 +616,18 @@ static int init_super1(struct supertype *st, void **sbp, mdu_array_info_t *info,
        sb->feature_map = 0;
        sb->pad0 = 0;
 
-       if ((rfd = open("/dev/urandom", O_RDONLY)) < 0 ||
-           read(rfd, sb->set_uuid, 16) != 16) {
-               *(__u32*)(sb->set_uuid) = random();
-               *(__u32*)(sb->set_uuid+4) = random();
-               *(__u32*)(sb->set_uuid+8) = random();
-               *(__u32*)(sb->set_uuid+12) = random();
+       if (uuid)
+               copy_uuid(sb->set_uuid, uuid, super1.swapuuid);
+       else {
+               if ((rfd = open("/dev/urandom", O_RDONLY)) < 0 ||
+                   read(rfd, sb->set_uuid, 16) != 16) {
+                       *(__u32*)(sb->set_uuid) = random();
+                       *(__u32*)(sb->set_uuid+4) = random();
+                       *(__u32*)(sb->set_uuid+8) = random();
+                       *(__u32*)(sb->set_uuid+12) = random();
+               }
+               if (rfd >= 0) close(rfd);
        }
-       if (rfd >= 0) close(rfd);
 
        if (name == NULL || *name == 0) {
                sprintf(defname, "%d", info->md_minor);
@@ -681,19 +691,12 @@ static int store_super1(struct supertype *st, int fd, void *sbv)
        struct mdp_superblock_1 *sb = sbv;
        unsigned long long sb_offset;
        int sbsize;
-       unsigned long size;
        unsigned long long dsize;
 
-#ifdef BLKGETSIZE64
-       if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
-#endif
-       {
-               if (ioctl(fd, BLKGETSIZE, &size))
-                       return 1;
-               else
-                       dsize = (unsigned long long)size;
-       } else
-               dsize >>= 9;
+       if (!get_dev_size(fd, NULL, &dsize))
+               return 1;
+
+       dsize >>= 9;
 
        if (dsize < 24)
                return 2;
@@ -805,17 +808,9 @@ static int write_init_super1(struct supertype *st, void *sbv,
                free(refsb);
        }
 
-#ifdef BLKGETSIZE64
-       if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
-#endif
-       {
-               unsigned long size;
-               if (ioctl(fd, BLKGETSIZE, &size))
-                       return 1;
-               else
-                       dsize = size;
-       } else
-               dsize >>= 9;
+       if (!get_dev_size(fd, NULL, &dsize))
+               return 1;
+       dsize >>= 9;
 
        if (dsize < 24) {
                close(fd);
@@ -922,7 +917,6 @@ static int compare_super1(void **firstp, void *secondv)
 
 static int load_super1(struct supertype *st, int fd, void **sbp, char *devname)
 {
-       unsigned long size;
        unsigned long long dsize;
        unsigned long long sb_offset;
        struct mdp_superblock_1 *super;
@@ -963,19 +957,9 @@ static int load_super1(struct supertype *st, int fd, void **sbp, char *devname)
                st->ss = NULL;
                return 2;
        }
-#ifdef BLKGETSIZE64
-       if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
-#endif
-       {
-               if (ioctl(fd, BLKGETSIZE, &size)) {
-                       if (devname)
-                               fprintf(stderr, Name ": cannot find device size for %s: %s\n",
-                                       devname, strerror(errno));
-                       return 1;
-               }
-               dsize = size;
-       } else
-               dsize >>= 9;
+       if (!get_dev_size(fd, devname, &dsize))
+               return 1;
+       dsize >>= 9;
 
        if (dsize < 24) {
                if (devname)
@@ -1161,7 +1145,7 @@ add_internal_bitmap1(struct supertype *st, void *sbv,
        unsigned long long min_chunk;
        long offset;
        int chunk = *chunkp;
-       int room;
+       int room = 0;
        struct mdp_superblock_1 *sb = sbv;
        bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + 1024);