X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=bitmap.c;h=fdf8884ddfe3d31524d6e583594adfa278425c82;hp=8210278f356910fda95c9ac741475d8afcd80c17;hb=3da92f272d017b1817b13f37f41c1ed4d6117291;hpb=8131b493df02ad22c8600f4c99d97003a807e5a7 diff --git a/bitmap.c b/bitmap.c index 8210278f..fdf8884d 100644 --- a/bitmap.c +++ b/bitmap.c @@ -33,6 +33,7 @@ inline void sb_le_to_cpu(bitmap_super_t *sb) sb->chunksize = __le32_to_cpu(sb->chunksize); sb->daemon_sleep = __le32_to_cpu(sb->daemon_sleep); sb->sync_size = __le64_to_cpu(sb->sync_size); + sb->write_behind = __le32_to_cpu(sb->write_behind); } inline void sb_cpu_to_le(bitmap_super_t *sb) @@ -151,7 +152,7 @@ bitmap_info_t *bitmap_fd_read(int fd, int brief) skip = sizeof(info->sb); sb_le_to_cpu(&info->sb); /* convert superblock to CPU byte ordering */ - + if (brief || info->sb.sync_size == 0) goto out; @@ -218,8 +219,8 @@ bitmap_info_t *bitmap_file_read(char *filename, int brief, struct supertype **st if (!st) { /* just look at device... */ lseek(fd, 0, 0); - } else { - st->ss->locate_bitmap(st, fd, NULL); + } else { + st->ss->locate_bitmap(st, fd); } ioctl(fd, BLKFLSBUF, 0); /* make sure we read current data */ *stp = st; @@ -259,6 +260,7 @@ int ExamineBitmap(char *filename, int brief, struct supertype *st) bitmap_info_t *info; int rv = 1; char buf[64]; + int swap; info = bitmap_file_read(filename, brief, &st); if (!info) @@ -278,14 +280,22 @@ int ExamineBitmap(char *filename, int brief, struct supertype *st) } rv = 0; - if (st && st->ss->swapuuid) { - printf(" UUID : %08x.%08x.%08x.%08x\n", + if (st) + swap = st->ss->swapuuid; + else +#if __BYTE_ORDER == BIG_ENDIAN + swap = 0; +#else + swap = 1; +#endif + if (swap) { + 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", + printf(" UUID : %08x:%08x:%08x:%08x\n", *(__u32 *)(sb->uuid+0), *(__u32 *)(sb->uuid+4), *(__u32 *)(sb->uuid+8), @@ -344,11 +354,12 @@ int CreateBitmap(char *filename, int force, char uuid[16], if (chunksize == UnSet) { /* We don't want more than 2^21 chunks, as 2^11 fill up one * 4K page (2 bytes per chunk), and 2^10 address of those - * fill up a 4K indexing page. 2^20 might be safer... + * fill up a 4K indexing page. 2^20 might be safer, especially + * on 64bit hosts, so use that. */ chunksize = DEFAULT_BITMAP_CHUNK; - /* <<21 for 2^21 chunks, >>9 to convert bytes to sectors */ - while (array_size > (chunksize << (21-9))) + /* <<20 for 2^20 chunks, >>9 to convert bytes to sectors */ + while (array_size > (chunksize << (20-9))) chunksize <<= 1; } @@ -387,8 +398,9 @@ int CreateBitmap(char *filename, int force, char uuid[16], } bytes -= sizeof(block); } - + rv = 0; + fflush(fp); /* make the file be the right size (well, to the nearest byte) */ if (ftruncate(fileno(fp), filesize)) perror("ftrunace"); @@ -399,16 +411,22 @@ out: return rv; } -void bitmap_update_uuid(int fd, int *uuid) +int bitmap_update_uuid(int fd, int *uuid, int swap) { struct bitmap_super_s bm; - lseek(fd, 0, 0); + if (lseek(fd, 0, 0) != 0) + return 1; if (read(fd, &bm, sizeof(bm)) != sizeof(bm)) - return; + return 1; if (bm.magic != __cpu_to_le32(BITMAP_MAGIC)) - return; - memcpy(bm.uuid, uuid, 16); - lseek(fd, 0, 0); - write(fd, &bm, sizeof(bm)); + return 1; + copy_uuid(bm.uuid, uuid, swap); + if (lseek(fd, 0, 0) != 0) + return 2; + if (write(fd, &bm, sizeof(bm)) != sizeof(bm)) { + lseek(fd, 0, 0); + return 2; + } lseek(fd, 0, 0); + return 0; }