]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - bitmap.c
Stuff like..
[thirdparty/mdadm.git] / bitmap.c
index 0a2ed5d6bd804f8bcd28e614864205b4039c76e2..afa10cf00d21cc67b48debf2be35174a69424f05 100644 (file)
--- a/bitmap.c
+++ b/bitmap.c
@@ -126,8 +126,13 @@ bitmap_info_t *bitmap_fd_read(int fd, int brief)
 
        info = malloc(sizeof(*info));
        if (info == NULL) {
+#if __GNUC__ < 3
                fprintf(stderr, Name ": failed to allocate %d bytes\n",
+                               (int)sizeof(*info));
+#else
+               fprintf(stderr, Name ": failed to allocate %zd bytes\n",
                                sizeof(*info));
+#endif
                return NULL;
        }
 
@@ -152,11 +157,11 @@ bitmap_info_t *bitmap_fd_read(int fd, int brief)
         */
        total_bits = bitmap_bits(info->sb.sync_size, info->sb.chunksize);
 
-       while ((n = read(fd, buf, sizeof(*buf))) > 0) {
+       while ((n = read(fd, buf, sizeof(buf))) > 0) {
                unsigned long long remaining = total_bits - read_bits;
 
-               if (remaining > sizeof(*buf) * 8) /* we want the full buffer */
-                       remaining = sizeof(*buf) * 8;
+               if (remaining > sizeof(buf) * 8) /* we want the full buffer */
+                       remaining = sizeof(buf) * 8;
                if (remaining > n * 8) /* the file is truncated */
                        remaining = n * 8;
                dirty_bits += count_dirty_bits(buf, remaining);
@@ -168,7 +173,8 @@ bitmap_info_t *bitmap_fd_read(int fd, int brief)
 
        if (read_bits < total_bits) { /* file truncated... */
                fprintf(stderr, Name ": WARNING: bitmap file is not large "
-                       "enough for array size %llu!\n\n", info->sb.sync_size);
+                       "enough for array size %llu!\n\n",
+                       (unsigned long long)info->sb.sync_size);
                total_bits = read_bits;
        }
 out:
@@ -177,11 +183,12 @@ out:
        return info;
 }
 
-bitmap_info_t *bitmap_file_read(char *filename, int brief, struct supertype *st)
+bitmap_info_t *bitmap_file_read(char *filename, int brief, struct supertype **stp)
 {
        int fd;
        bitmap_info_t *info;
        struct stat stb;
+       struct supertype *st = *stp;
 
        fd = open(filename, O_RDONLY);
        if (fd < 0) {
@@ -197,8 +204,10 @@ bitmap_info_t *bitmap_file_read(char *filename, int brief, struct supertype *st)
                        /* just look at device... */
                        lseek(fd, 0, 0);
                } else {        
-                       st->ss->locate_bitmap(st, fd);
+                       st->ss->locate_bitmap(st, fd, NULL);
                }
+               ioctl(fd, BLKFLSBUF, 0); /* make sure we read current data */
+               *stp = st;
        }
 
        info = bitmap_fd_read(fd, brief);
@@ -206,6 +215,18 @@ bitmap_info_t *bitmap_file_read(char *filename, int brief, struct supertype *st)
        return info;
 }
 
+__u32 swapl(__u32 l)
+{
+       char *c = (char*)&l;
+       char t= c[0];
+       c[0] = c[3];
+       c[3] = t;
+
+       t = c[1];
+       c[1] = c[2];
+       c[2] = t;
+       return l;
+}
 int ExamineBitmap(char *filename, int brief, struct supertype *st)
 {
        /*
@@ -217,7 +238,7 @@ int ExamineBitmap(char *filename, int brief, struct supertype *st)
        int rv = 1;
        char buf[64];
 
-       info = bitmap_file_read(filename, brief, st);
+       info = bitmap_file_read(filename, brief, &st);
        if (!info)
                return rv;
 
@@ -228,19 +249,28 @@ int ExamineBitmap(char *filename, int brief, struct supertype *st)
                fprintf(stderr, Name ": invalid bitmap magic 0x%x, the bitmap file appears to be corrupted\n", sb->magic);
        }
        printf("         Version : %d\n", sb->version);
-       if (sb->version != BITMAP_MAJOR) {
+       if (sb->version < BITMAP_MAJOR_LO ||
+           sb->version > BITMAP_MAJOR_HI) {
                fprintf(stderr, Name ": unknown bitmap version %d, either the bitmap file is corrupted or you need to upgrade your tools\n", sb->version);
                goto free_info;
        }
 
        rv = 0;
+       if (st && st->ss->swapuuid) {
+       printf("            UUID : %08x.%08x.%08x.%08x\n",
+                                       swapl(*(__u32 *)(sb->uuid+0)),
+                                       swapl(*(__u32 *)(sb->uuid+4)),
+                                       swapl(*(__u32 *)(sb->uuid+8)),
+                                       swapl(*(__u32 *)(sb->uuid+12)));
+       } else {
        printf("            UUID : %08x.%08x.%08x.%08x\n",
                                        *(__u32 *)(sb->uuid+0),
                                        *(__u32 *)(sb->uuid+4),
                                        *(__u32 *)(sb->uuid+8),
                                        *(__u32 *)(sb->uuid+12));
-       printf("          Events : %llu\n", sb->events);
-       printf("  Events Cleared : %llu\n", sb->events_cleared);
+       }
+       printf("          Events : %llu\n", (unsigned long long)sb->events);
+       printf("  Events Cleared : %llu\n", (unsigned long long)sb->events_cleared);
        printf("           State : %s\n", bitmap_state(sb->state));
        printf("       Chunksize : %s\n", human_chunksize(sb->chunksize));
        printf("          Daemon : %ds flush period\n", sb->daemon_sleep);
@@ -249,7 +279,7 @@ int ExamineBitmap(char *filename, int brief, struct supertype *st)
        else
                sprintf(buf, "Normal");
        printf("      Write Mode : %s\n", buf);
-       printf("       Sync Size : %llu%s\n", sb->sync_size/2,
+       printf("       Sync Size : %llu%s\n", (unsigned long long)sb->sync_size/2,
                                        human_size(sb->sync_size * 512));
        if (brief)
                goto free_info;
@@ -262,9 +292,10 @@ free_info:
 }
 
 int CreateBitmap(char *filename, int force, char uuid[16],
-               unsigned long chunksize, unsigned long daemon_sleep,
-               unsigned long write_behind,
-               unsigned long long array_size)
+                unsigned long chunksize, unsigned long daemon_sleep,
+                unsigned long write_behind,
+                unsigned long long array_size /* sectors */,
+                int major)
 {
        /*
         * Create a bitmap file with a superblock and (optionally) a full bitmap
@@ -290,7 +321,7 @@ int CreateBitmap(char *filename, int force, char uuid[16],
 
        memset(&sb, 0, sizeof(sb));
        sb.magic = BITMAP_MAGIC;
-       sb.version = BITMAP_MAJOR;
+       sb.version = major;
        if (uuid != NULL)
                memcpy(sb.uuid, uuid, 16);
        sb.chunksize = chunksize;