summaryrefslogtreecommitdiffstats
path: root/super1.c
diff options
context:
space:
mode:
Diffstat (limited to 'super1.c')
-rw-r--r--super1.c120
1 files changed, 62 insertions, 58 deletions
diff --git a/super1.c b/super1.c
index 9bf5912..887db10 100644
--- a/super1.c
+++ b/super1.c
@@ -142,9 +142,9 @@ static unsigned int calc_sb_1_csum(struct mdp_superblock_1 * sb)
}
#ifndef MDASSEMBLE
-static void examine_super1(struct supertype *st, void *sbv, char *homehost)
+static void examine_super1(struct supertype *st, char *homehost)
{
- struct mdp_superblock_1 *sb = sbv;
+ struct mdp_superblock_1 *sb = st->sb;
time_t atime;
int d;
int faulty;
@@ -341,9 +341,9 @@ static void examine_super1(struct supertype *st, void *sbv, char *homehost)
}
-static void brief_examine_super1(struct supertype *st, void *sbv)
+static void brief_examine_super1(struct supertype *st)
{
- struct mdp_superblock_1 *sb = sbv;
+ struct mdp_superblock_1 *sb = st->sb;
int i;
unsigned long long sb_offset;
char *nm;
@@ -375,9 +375,9 @@ static void brief_examine_super1(struct supertype *st, void *sbv)
printf("\n");
}
-static void detail_super1(struct supertype *st, void *sbv, char *homehost)
+static void detail_super1(struct supertype *st, char *homehost)
{
- struct mdp_superblock_1 *sb = sbv;
+ struct mdp_superblock_1 *sb = st->sb;
int i;
int l = homehost ? strlen(homehost) : 0;
@@ -394,9 +394,9 @@ static void detail_super1(struct supertype *st, void *sbv, char *homehost)
printf("\n Events : %llu\n\n", (unsigned long long)__le64_to_cpu(sb->events));
}
-static void brief_detail_super1(struct supertype *st, void *sbv)
+static void brief_detail_super1(struct supertype *st)
{
- struct mdp_superblock_1 *sb = sbv;
+ struct mdp_superblock_1 *sb = st->sb;
int i;
if (sb->set_name[0])
@@ -408,9 +408,9 @@ static void brief_detail_super1(struct supertype *st, void *sbv)
}
}
-static void export_super1(struct supertype *st, void *sbv)
+static void export_super1(struct supertype *st)
{
- struct mdp_superblock_1 *sb = sbv;
+ struct mdp_superblock_1 *sb = st->sb;
int i;
int len = 32;
@@ -432,9 +432,9 @@ static void export_super1(struct supertype *st, void *sbv)
#endif
-static int match_home1(struct supertype *st, void *sbv, char *homehost)
+static int match_home1(struct supertype *st, char *homehost)
{
- struct mdp_superblock_1 *sb = sbv;
+ struct mdp_superblock_1 *sb = st->sb;
int l = homehost ? strlen(homehost) : 0;
return (l > 0 && l < 32 &&
@@ -442,18 +442,18 @@ static int match_home1(struct supertype *st, void *sbv, char *homehost)
strncmp(sb->set_name, homehost, l) == 0);
}
-static void uuid_from_super1(struct supertype *st, int uuid[4], void * sbv)
+static void uuid_from_super1(struct supertype *st, int uuid[4])
{
- struct mdp_superblock_1 *super = sbv;
+ struct mdp_superblock_1 *super = st->sb;
char *cuuid = (char*)uuid;
int i;
for (i=0; i<16; i++)
cuuid[i] = super->set_uuid[i];
}
-static void getinfo_super1(struct supertype *st, struct mdinfo *info, void *sbv)
+static void getinfo_super1(struct supertype *st, struct mdinfo *info)
{
- struct mdp_superblock_1 *sb = sbv;
+ struct mdp_superblock_1 *sb = st->sb;
int working = 0;
int i;
int role;
@@ -523,7 +523,7 @@ static void getinfo_super1(struct supertype *st, struct mdinfo *info, void *sbv)
}
static int update_super1(struct supertype *st, struct mdinfo *info,
- void *sbv, char *update,
+ char *update,
char *devname, int verbose,
int uuid_set, char *homehost)
{
@@ -531,7 +531,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
* For others, the return value is ignored.
*/
int rv = 0;
- struct mdp_superblock_1 *sb = sbv;
+ struct mdp_superblock_1 *sb = st->sb;
if (strcmp(update, "force-one")==0) {
/* Not enough devices for a working array,
@@ -603,7 +603,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
if (__le32_to_cpu(sb->feature_map)&MD_FEATURE_BITMAP_OFFSET) {
struct bitmap_super_s *bm;
- bm = (struct bitmap_super_s*)(sbv+1024);
+ bm = (struct bitmap_super_s*)(st->sb+1024);
memcpy(bm->uuid, sb->set_uuid, 16);
}
}
@@ -636,7 +636,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
__le64_to_cpu(sb->data_offset)) {
/* set data_size to device size less data_offset */
struct misc_dev_info *misc = (struct misc_dev_info*)
- (sbv + 1024 + sizeof(struct bitmap_super_s));
+ (st->sb + 1024 + sizeof(struct bitmap_super_s));
printf("Size was %llu\n", (unsigned long long)
__le64_to_cpu(sb->data_size));
sb->data_size = __cpu_to_le64(
@@ -651,7 +651,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
return rv;
}
-static int init_super1(struct supertype *st, void **sbp, mdu_array_info_t *info,
+static int init_super1(struct supertype *st, mdu_array_info_t *info,
unsigned long long size, char *name, char *homehost, int *uuid)
{
struct mdp_superblock_1 *sb = malloc(1024 + sizeof(bitmap_super_t) +
@@ -664,7 +664,6 @@ static int init_super1(struct supertype *st, void **sbp, mdu_array_info_t *info,
st->sb = sb;
if (info->major_version == -1) {
/* zeroing superblock */
- *sbp = sb;
return 0;
}
@@ -731,14 +730,13 @@ static int init_super1(struct supertype *st, void **sbp, mdu_array_info_t *info,
memset(sb->dev_roles, 0xff, 1024 - sizeof(struct mdp_superblock_1));
- *sbp = sb;
return 1;
}
/* Add a device to the superblock being created */
-static void add_to_super1(struct supertype *st, void *sbv, mdu_disk_info_t *dk)
+static void add_to_super1(struct supertype *st, mdu_disk_info_t *dk)
{
- struct mdp_superblock_1 *sb = sbv;
+ struct mdp_superblock_1 *sb = st->sb;
__u16 *rp = sb->dev_roles + dk->number;
if ((dk->state & 6) == 6) /* active, sync */
*rp = __cpu_to_le16(dk->raid_disk);
@@ -748,11 +746,11 @@ static void add_to_super1(struct supertype *st, void *sbv, mdu_disk_info_t *dk)
*rp = 0xfffe;
}
-static void locate_bitmap1(struct supertype *st, int fd, void *sbv);
+static void locate_bitmap1(struct supertype *st, int fd);
-static int store_super1(struct supertype *st, int fd, void *sbv)
+static int store_super1(struct supertype *st, int fd)
{
- struct mdp_superblock_1 *sb = sbv;
+ struct mdp_superblock_1 *sb = st->sb;
unsigned long long sb_offset;
int sbsize;
unsigned long long dsize;
@@ -810,7 +808,7 @@ static int store_super1(struct supertype *st, int fd, void *sbv)
struct bitmap_super_s *bm = (struct bitmap_super_s*)
(((char*)sb)+1024);
if (__le32_to_cpu(bm->magic) == BITMAP_MAGIC) {
- locate_bitmap1(st, fd, sbv);
+ locate_bitmap1(st, fd);
if (write(fd, bm, sizeof(*bm)) != sizeof(*bm))
return 5;
}
@@ -819,7 +817,7 @@ static int store_super1(struct supertype *st, int fd, void *sbv)
return 0;
}
-static int load_super1(struct supertype *st, int fd, void **sbp, char *devname);
+static int load_super1(struct supertype *st, int fd, char *devname);
static unsigned long choose_bm_space(unsigned long devsize)
{
@@ -834,11 +832,11 @@ static unsigned long choose_bm_space(unsigned long devsize)
return 4*2;
}
-static int write_init_super1(struct supertype *st, void *sbv,
+static int write_init_super1(struct supertype *st,
mdu_disk_info_t *dinfo, char *devname)
{
- struct mdp_superblock_1 *sb = sbv;
- void *refsbv = NULL;
+ struct mdp_superblock_1 *sb = st->sb;
+ struct supertype refst;
int fd = open(devname, O_RDWR | O_EXCL);
int rfd;
int rv;
@@ -868,8 +866,10 @@ static int write_init_super1(struct supertype *st, void *sbv,
if (rfd >= 0) close(rfd);
sb->events = 0;
- if (load_super1(st, fd, &refsbv, NULL)==0) {
- struct mdp_superblock_1 *refsb = refsbv;
+ refst =*st;
+ refst.sb = NULL;
+ if (load_super1(&refst, fd, NULL)==0) {
+ struct mdp_superblock_1 *refsb = refst.sb;
memcpy(sb->device_uuid, refsb->device_uuid, 16);
if (memcmp(sb->set_uuid, refsb->set_uuid, 16)==0) {
@@ -938,12 +938,12 @@ static int write_init_super1(struct supertype *st, void *sbv,
sb->sb_csum = calc_sb_1_csum(sb);
- rv = store_super1(st, fd, sb);
+ rv = store_super1(st, fd);
if (rv)
fprintf(stderr, Name ": failed to write superblock to %s\n", devname);
if (rv == 0 && (__le32_to_cpu(sb->feature_map) & 1))
- rv = st->ss->write_bitmap(st, fd, sbv);
+ rv = st->ss->write_bitmap(st, fd);
close(fd);
return rv;
}
@@ -986,7 +986,9 @@ static int compare_super1(struct supertype *st, struct supertype *tst)
return 0;
}
-static int load_super1(struct supertype *st, int fd, void **sbp, char *devname)
+static void free_super1(struct supertype *st);
+
+static int load_super1(struct supertype *st, int fd, char *devname)
{
unsigned long long dsize;
unsigned long long sb_offset;
@@ -995,6 +997,7 @@ static int load_super1(struct supertype *st, int fd, void **sbp, char *devname)
struct bitmap_super_s *bsb;
struct misc_dev_info *misc;
+ free_super1(st);
if (st->ss == NULL || st->minor_version == -1) {
int bestvers = -1;
@@ -1002,16 +1005,17 @@ static int load_super1(struct supertype *st, int fd, void **sbp, char *devname)
__u64 bestctime = 0;
/* guess... choose latest ctime */
tst.ss = &super1;
+ tst.sb = NULL;
for (tst.minor_version = 0; tst.minor_version <= 2 ; tst.minor_version++) {
- switch(load_super1(&tst, fd, sbp, devname)) {
- case 0: super = *sbp;
+ switch(load_super1(&tst, fd, devname)) {
+ case 0: super = tst.sb;
if (bestvers == -1 ||
bestctime < __le64_to_cpu(super->ctime)) {
bestvers = tst.minor_version;
bestctime = __le64_to_cpu(super->ctime);
}
free(super);
- *sbp = NULL;
+ tst.sb = NULL;
break;
case 1: return 1; /*bad device */
case 2: break; /* bad, try next */
@@ -1022,7 +1026,7 @@ static int load_super1(struct supertype *st, int fd, void **sbp, char *devname)
tst.minor_version = bestvers;
tst.ss = &super1;
tst.max_devs = 384;
- rv = load_super1(&tst, fd, sbp, devname);
+ rv = load_super1(&tst, fd, devname);
if (rv == 0)
*st = tst;
return rv;
@@ -1108,7 +1112,6 @@ static int load_super1(struct supertype *st, int fd, void **sbp, char *devname)
return 2;
}
st->sb = super;
- *sbp = super;
bsb = (struct bitmap_super_s *)(((char*)super)+1024);
@@ -1122,12 +1125,12 @@ static int load_super1(struct supertype *st, int fd, void **sbp, char *devname)
* valid. If it doesn't clear the bit. An --assemble --force
* should get that written out.
*/
- locate_bitmap1(st, fd, super);
+ locate_bitmap1(st, fd);
if (read(fd, ((char*)super)+1024, sizeof(struct bitmap_super_s))
!= sizeof(struct bitmap_super_s))
goto no_bitmap;
- uuid_from_super1(st, uuid, super);
+ uuid_from_super1(st, uuid);
if (__le32_to_cpu(bsb->magic) != BITMAP_MAGIC ||
memcmp(bsb->uuid, uuid, 16) != 0)
goto no_bitmap;
@@ -1198,7 +1201,7 @@ static __u64 avail_size1(struct supertype *st, __u64 devsize)
}
static int
-add_internal_bitmap1(struct supertype *st, void *sbv,
+add_internal_bitmap1(struct supertype *st,
int *chunkp, int delay, int write_behind,
unsigned long long size,
int may_change, int major)
@@ -1220,7 +1223,7 @@ add_internal_bitmap1(struct supertype *st, void *sbv,
long offset;
int chunk = *chunkp;
int room = 0;
- struct mdp_superblock_1 *sb = sbv;
+ struct mdp_superblock_1 *sb = st->sb;
bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + 1024);
switch(st->minor_version) {
@@ -1305,7 +1308,7 @@ add_internal_bitmap1(struct supertype *st, void *sbv,
memset(bms, 0, sizeof(*bms));
bms->magic = __cpu_to_le32(BITMAP_MAGIC);
bms->version = __cpu_to_le32(major);
- uuid_from_super1(st, (int*)bms->uuid, sb);
+ uuid_from_super1(st, (int*)bms->uuid);
bms->chunksize = __cpu_to_le32(chunk);
bms->daemon_sleep = __cpu_to_le32(delay);
bms->sync_size = __cpu_to_le64(size);
@@ -1316,18 +1319,18 @@ add_internal_bitmap1(struct supertype *st, void *sbv,
}
-static void locate_bitmap1(struct supertype *st, int fd, void *sbv)
+static void locate_bitmap1(struct supertype *st, int fd)
{
unsigned long long offset;
struct mdp_superblock_1 *sb;
int mustfree = 0;
- if (!sbv) {
- if (st->ss->load_super(st, fd, &sbv, NULL))
+ if (!st->sb) {
+ if (st->ss->load_super(st, fd, NULL))
return; /* no error I hope... */
mustfree = 1;
}
- sb = sbv;
+ sb = st->sb;
offset = __le64_to_cpu(sb->super_offset);
offset += (int32_t) __le32_to_cpu(sb->bitmap_offset);
@@ -1336,16 +1339,16 @@ static void locate_bitmap1(struct supertype *st, int fd, void *sbv)
lseek64(fd, offset<<9, 0);
}
-static int write_bitmap1(struct supertype *st, int fd, void *sbv)
+static int write_bitmap1(struct supertype *st, int fd)
{
- struct mdp_superblock_1 *sb = sbv;
+ struct mdp_superblock_1 *sb = st->sb;
bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb)+1024);
int rv = 0;
int towrite, n;
char buf[4096];
- locate_bitmap1(st, fd, sbv);
+ locate_bitmap1(st, fd);
if (write(fd, ((char*)sb)+1024, sizeof(bitmap_super_t)) !=
sizeof(bitmap_super_t))
@@ -1370,10 +1373,11 @@ static int write_bitmap1(struct supertype *st, int fd, void *sbv)
return rv;
}
-static void free_super1(struct supertype *st, void *super)
+static void free_super1(struct supertype *st)
{
- if (super)
- free(super);
+ if (st->sb)
+ free(st->sb);
+ st->sb = NULL;
}
struct superswitch super1 = {