X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=bitmap.c;h=18101664fa1728e997bdb27826141d5a1f40cca7;hb=f8f84cd5b94eb6a1ea6c54ef8b1c322ef105f564;hp=c905b4d3f548bd9fc72b4d8c84f8d8beb6711563;hpb=bf4fb153a4431ad3f91c3e72eebbd661b0455ed7;p=thirdparty%2Fmdadm.git diff --git a/bitmap.c b/bitmap.c index c905b4d3..18101664 100644 --- a/bitmap.c +++ b/bitmap.c @@ -115,6 +115,15 @@ unsigned long long bitmap_bits(unsigned long long array_size, return (array_size * 512 + chunksize - 1) / chunksize; } +unsigned long bitmap_sectors(struct bitmap_super_s *bsb) +{ + unsigned long long bits = bitmap_bits(__le64_to_cpu(bsb->sync_size), + __le32_to_cpu(bsb->chunksize)); + int bits_per_sector = 8*512; + return (bits + bits_per_sector - 1) / bits_per_sector; +} + + bitmap_info_t *bitmap_fd_read(int fd, int brief) { /* Note: fd might be open O_DIRECT, so we must be @@ -122,11 +131,13 @@ bitmap_info_t *bitmap_fd_read(int fd, int brief) */ unsigned long long total_bits = 0, read_bits = 0, dirty_bits = 0; bitmap_info_t *info; - char *buf, *unaligned; + void *buf; int n, skip; - unaligned = malloc(8192*2); - buf = (char*) ((unsigned long)unaligned | 8191)+1; + if (posix_memalign(&buf, 512, 8192) != 0) { + fprintf(stderr, Name ": failed to allocate 8192 bytes\n"); + return NULL; + } n = read(fd, buf, 8192); info = malloc(sizeof(*info)); @@ -145,14 +156,13 @@ bitmap_info_t *bitmap_fd_read(int fd, int brief) fprintf(stderr, Name ": failed to read superblock of bitmap " "file: %s\n", strerror(errno)); free(info); - free(unaligned); return NULL; } memcpy(&info->sb, buf, sizeof(info->sb)); 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; @@ -219,8 +229,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; @@ -398,7 +408,7 @@ 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) */ @@ -420,18 +430,7 @@ int bitmap_update_uuid(int fd, int *uuid, int swap) return 1; if (bm.magic != __cpu_to_le32(BITMAP_MAGIC)) return 1; - if (swap) { - unsigned char *ac = (unsigned char *)bm.uuid; - unsigned char *bc = (unsigned char *)uuid; - int i; - for (i=0; i<16; i+= 4) { - ac[i+0] = bc[i+3]; - ac[i+1] = bc[i+2]; - ac[i+2] = bc[i+1]; - ac[i+3] = bc[i+0]; - } - } else - memcpy(bm.uuid, uuid, 16); + copy_uuid(bm.uuid, uuid, swap); if (lseek(fd, 0, 0) != 0) return 2; if (write(fd, &bm, sizeof(bm)) != sizeof(bm)) {