unsigned long long total_bits = 0, read_bits = 0, dirty_bits = 0;
bitmap_info_t *info;
void *buf;
- int n, skip;
+ unsigned int n, skip;
- if (posix_memalign(&buf, 512, 8192) != 0) {
+ if (posix_memalign(&buf, 4096, 8192) != 0) {
fprintf(stderr, Name ": failed to allocate 8192 bytes\n");
return NULL;
}
fprintf(stderr, Name ": failed to allocate %zd bytes\n",
sizeof(*info));
#endif
+ free(buf);
return NULL;
}
fprintf(stderr, Name ": failed to read superblock of bitmap "
"file: %s\n", strerror(errno));
free(info);
+ free(buf);
return NULL;
}
memcpy(&info->sb, buf, sizeof(info->sb));
total_bits = read_bits;
}
out:
+ free(buf);
info->total_bits = total_bits;
info->dirty_bits = dirty_bits;
return info;
if (!st) {
/* just look at device... */
lseek(fd, 0, 0);
- } else {
+ } else if (!st->ss->locate_bitmap) {
+ fprintf(stderr, Name ": No bitmap possible with %s metadata\n",
+ st->ss->name);
+ return NULL;
+ } else
st->ss->locate_bitmap(st, fd);
- }
+
ioctl(fd, BLKFLSBUF, 0); /* make sure we read current data */
*stp = st;
} else {
goto free_info;
printf(" Bitmap : %llu bits (chunks), %llu dirty (%2.1f%%)\n",
info->total_bits, info->dirty_bits,
- 100.0 * info->dirty_bits / (info->total_bits + 1));
+ 100.0 * info->dirty_bits / (info->total_bits?:1));
free_info:
free(info);
return rv;
*/
chunksize = DEFAULT_BITMAP_CHUNK;
/* <<20 for 2^20 chunks, >>9 to convert bytes to sectors */
- while (array_size > (chunksize << (20-9)))
+ while (array_size > ((unsigned long long)chunksize << (20-9)))
chunksize <<= 1;
}