#include <sys/types.h>
#include <sys/stat.h>
#include "mdadm.h"
-#include <asm/byteorder.h>
#define min(a,b) (((a) < (b)) ? (a) : (b))
i++;
}
- sprintf(buf, "%lu %s", bytes, suffixes[i]);
+ snprintf(buf, sizeof(buf), "%lu %s", bytes, suffixes[i]);
return buf;
}
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)
+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) {
filename, strerror(errno));
return NULL;
}
+ fstat(fd, &stb);
+ if ((S_IFMT & stb.st_mode) == S_IFBLK) {
+ /* block device, so we are probably after an internal bitmap */
+ if (!st) st = guess_super(fd);
+ if (!st) {
+ /* just look at device... */
+ lseek(fd, 0, 0);
+ } else {
+ 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);
close(fd);
return info;
}
-int ExamineBitmap(char *filename, int brief)
+__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)
{
/*
* Read the bitmap file and display its contents
bitmap_super_t *sb;
bitmap_info_t *info;
int rv = 1;
+ char buf[64];
- info = bitmap_file_read(filename, brief);
+ 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);
- printf(" Sync Size : %llu%s\n", sb->sync_size,
- human_size(sb->sync_size * 1024));
+ if (sb->write_behind)
+ sprintf(buf, "Allow write behind, max %d", sb->write_behind);
+ else
+ sprintf(buf, "Normal");
+ printf(" Write Mode : %s\n", buf);
+ printf(" Sync Size : %llu%s\n", (unsigned long long)sb->sync_size/2,
+ human_size(sb->sync_size * 512));
if (brief)
goto free_info;
printf(" Bitmap : %llu bits (chunks), %llu dirty (%2.1f%%)\n",
}
int CreateBitmap(char *filename, int force, char uuid[16],
- unsigned long chunksize, unsigned long daemon_sleep,
- 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;
sb.daemon_sleep = daemon_sleep;
+ sb.write_behind = write_behind;
sb.sync_size = array_size;
sb_cpu_to_le(&sb); /* convert to on-disk byte ordering */
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)