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;
}
*/
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);
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:
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) {
/* 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);
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)
{
/*
int rv = 1;
char buf[64];
- info = bitmap_file_read(filename, brief, st);
+ info = bitmap_file_read(filename, brief, &st);
if (!info)
return rv;
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);
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;
}
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
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;