]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - bitmap.c
Kill old superblocks on create.
[thirdparty/mdadm.git] / bitmap.c
index 36ecd958595c1a924f6851b9feb38836366f7eee..b044cd822d57aaedfd4fc79930ea6da1943a585b 100644 (file)
--- a/bitmap.c
+++ b/bitmap.c
@@ -21,7 +21,6 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include "mdadm.h"
-#include <asm/byteorder.h>
 
 #define min(a,b) (((a) < (b)) ? (a) : (b))
 
@@ -126,8 +125,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 +156,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 +172,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:
@@ -198,7 +203,7 @@ 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;
@@ -243,7 +248,8 @@ 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;
        }
@@ -262,8 +268,8 @@ int ExamineBitmap(char *filename, int brief, struct supertype *st)
                                        *(__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);
@@ -272,7 +278,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;
@@ -285,9 +291,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
@@ -313,7 +320,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;
@@ -349,7 +356,8 @@ int CreateBitmap(char *filename, int force, char uuid[16],
        
        rv = 0;
        /* make the file be the right size (well, to the nearest byte) */
-       ftruncate(fileno(fp), filesize);
+       if (ftruncate(fileno(fp), filesize))
+               perror("ftrunace");
 out:
        fclose(fp);
        if (rv)