diff options
author | Dimitri John Ledkov <xnox@ubuntu.com> | 2017-05-12 12:32:07 +0100 |
---|---|---|
committer | Dimitri John Ledkov <xnox@ubuntu.com> | 2017-05-12 12:32:07 +0100 |
commit | 77b19ed5f259bc62680acf2b1a3454baa2472bc5 (patch) | |
tree | 7441d8d057c09e54c8ea23c984f2ccdf22c98649 /bitmap.c | |
parent | ca114f3c76374493f0fd64f8ea0a9b96ae9b1dc5 (diff) |
New upstream release.
Diffstat (limited to 'bitmap.c')
-rw-r--r-- | bitmap.c | 87 |
1 files changed, 41 insertions, 46 deletions
@@ -47,13 +47,13 @@ mapping_t bitmap_states[] = { { NULL, -1 } }; -const char *bitmap_state(int state_num) +static const char *bitmap_state(int state_num) { char *state = map_num(bitmap_states, state_num); return state ? state : "Unknown"; } -const char *human_chunksize(unsigned long bytes) +static const char *human_chunksize(unsigned long bytes) { static char buf[16]; char *suffixes[] = { "B", "KB", "MB", "GB", "TB", NULL }; @@ -95,7 +95,7 @@ static inline int count_dirty_bits_byte(char byte, int num_bits) return num; } -int count_dirty_bits(char *buf, int num_bits) +static int count_dirty_bits(char *buf, int num_bits) { int i, num = 0; @@ -108,22 +108,7 @@ int count_dirty_bits(char *buf, int num_bits) return num; } -/* calculate the size of the bitmap given the array size and bitmap chunksize */ -unsigned long long bitmap_bits(unsigned long long array_size, - unsigned long chunksize) -{ - 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) +static bitmap_info_t *bitmap_fd_read(int fd, int brief) { /* Note: fd might be open O_DIRECT, so we must be * careful to align reads properly @@ -194,54 +179,54 @@ out: return info; } -int bitmap_file_open(char *filename, struct supertype **stp) +static int +bitmap_file_open(char *filename, struct supertype **stp, int node_num) { int fd; struct stat stb; struct supertype *st = *stp; - if (stat(filename, &stb) < 0) { - pr_err("failed to find file %s: %s\n", - filename, strerror(errno)); + fd = open(filename, O_RDONLY|O_DIRECT); + if (fd < 0) { + pr_err("failed to open bitmap file %s: %s\n", + filename, strerror(errno)); return -1; } - if ((S_IFMT & stb.st_mode) == S_IFBLK) { - fd = open(filename, O_RDONLY|O_DIRECT); - if (fd < 0) { - pr_err("failed to open bitmap file %s: %s\n", - filename, strerror(errno)); - return -1; - } + + if (fstat(fd, &stb) < 0) { + pr_err("failed to determine bitmap file/device type: %s\n", + strerror(errno)); + close(fd); + return -1; + } + + if ((stb.st_mode & S_IFMT) == S_IFBLK) { /* block device, so we are probably after an internal bitmap */ - if (!st) st = guess_super(fd); + if (!st) + st = guess_super(fd); if (!st) { /* just look at device... */ lseek(fd, 0, 0); } else if (!st->ss->locate_bitmap) { pr_err("No bitmap possible with %s metadata\n", st->ss->name); + close(fd); return -1; } else { - if (st->ss->locate_bitmap(st, fd)) { + if (st->ss->locate_bitmap(st, fd, node_num)) { pr_err("%s doesn't have bitmap\n", filename); + close(fd); fd = -1; } } *stp = st; - } else { - fd = open(filename, O_RDONLY|O_DIRECT); - if (fd < 0) { - pr_err("failed to open bitmap file %s: %s\n", - filename, strerror(errno)); - return -1; - } } return fd; } -__u32 swapl(__u32 l) +static __u32 swapl(__u32 l) { char *c = (char*)&l; char t= c[0]; @@ -267,7 +252,7 @@ int ExamineBitmap(char *filename, int brief, struct supertype *st) int fd, i; __u32 uuid32[4]; - fd = bitmap_file_open(filename, &st); + fd = bitmap_file_open(filename, &st, 0); if (fd < 0) return rv; @@ -348,11 +333,21 @@ int ExamineBitmap(char *filename, int brief, struct supertype *st) printf(" Cluster nodes : %d\n", sb->nodes); printf(" Cluster name : %-64s\n", sb->cluster_name); for (i = 0; i < (int)sb->nodes; i++) { - if (i) { - free(info); - info = bitmap_fd_read(fd, brief); - sb = &info->sb; + st = NULL; + free(info); + fd = bitmap_file_open(filename, &st, i); + if (fd < 0) { + printf(" Unable to open bitmap file on node: %i\n", i); + + continue; } + info = bitmap_fd_read(fd, brief); + if (!info) { + close(fd); + printf(" Unable to read bitmap on node: %i\n", i); + continue; + } + sb = &info->sb; if (sb->magic != BITMAP_MAGIC) pr_err("invalid bitmap magic 0x%x, the bitmap file appears to be corrupted\n", sb->magic); @@ -367,7 +362,7 @@ int ExamineBitmap(char *filename, int brief, struct supertype *st) 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)); - + close(fd); } } |