super1: Clean up various style abuses
Code is 80 characters wide, so lets try to respect that. In addition, we should never have one-line 'if () action()' statements. Fixup various whitespace abuse. Signed-off-by: Jes Sorensen <jsorensen@fb.com>
This commit is contained in:
parent
32141c1765
commit
46a533a90c
363
super1.c
363
super1.c
|
@ -227,6 +227,7 @@ static void init_afd(struct align_fd *afd, int fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
static char abuf[4096+4096];
|
static char abuf[4096+4096];
|
||||||
|
|
||||||
static int aread(struct align_fd *afd, void *buf, int len)
|
static int aread(struct align_fd *afd, void *buf, int len)
|
||||||
{
|
{
|
||||||
/* aligned read.
|
/* aligned read.
|
||||||
|
@ -339,7 +340,8 @@ static void examine_super1(struct supertype *st, char *homehost)
|
||||||
strncmp(sb->set_name, homehost, l) == 0)
|
strncmp(sb->set_name, homehost, l) == 0)
|
||||||
printf(" (local to host %s)", homehost);
|
printf(" (local to host %s)", homehost);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
if (bms->nodes > 0 && (__le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET))
|
if (bms->nodes > 0 &&
|
||||||
|
(__le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET))
|
||||||
printf(" Cluster Name : %-64s\n", bms->cluster_name);
|
printf(" Cluster Name : %-64s\n", bms->cluster_name);
|
||||||
atime = __le64_to_cpu(sb->ctime) & 0xFFFFFFFFFFULL;
|
atime = __le64_to_cpu(sb->ctime) & 0xFFFFFFFFFFULL;
|
||||||
printf(" Creation Time : %.24s\n", ctime(&atime));
|
printf(" Creation Time : %.24s\n", ctime(&atime));
|
||||||
|
@ -385,7 +387,8 @@ static void examine_super1(struct supertype *st, char *homehost)
|
||||||
printf(" Super Offset : %llu sectors\n",
|
printf(" Super Offset : %llu sectors\n",
|
||||||
(unsigned long long)__le64_to_cpu(sb->super_offset));
|
(unsigned long long)__le64_to_cpu(sb->super_offset));
|
||||||
if (__le32_to_cpu(sb->feature_map) & MD_FEATURE_RECOVERY_OFFSET)
|
if (__le32_to_cpu(sb->feature_map) & MD_FEATURE_RECOVERY_OFFSET)
|
||||||
printf("Recovery Offset : %llu sectors\n", (unsigned long long)__le64_to_cpu(sb->recovery_offset));
|
printf("Recovery Offset : %llu sectors\n",
|
||||||
|
(unsigned long long)__le64_to_cpu(sb->recovery_offset));
|
||||||
|
|
||||||
st->ss->getinfo_super(st, &info, NULL);
|
st->ss->getinfo_super(st, &info, NULL);
|
||||||
if (info.space_after != 1 &&
|
if (info.space_after != 1 &&
|
||||||
|
@ -393,10 +396,12 @@ static void examine_super1(struct supertype *st, char *homehost)
|
||||||
printf(" Unused Space : before=%llu sectors, after=%llu sectors\n",
|
printf(" Unused Space : before=%llu sectors, after=%llu sectors\n",
|
||||||
info.space_before, info.space_after);
|
info.space_before, info.space_after);
|
||||||
|
|
||||||
printf(" State : %s\n", (__le64_to_cpu(sb->resync_offset)+1)? "active":"clean");
|
printf(" State : %s\n",
|
||||||
|
(__le64_to_cpu(sb->resync_offset)+1)? "active":"clean");
|
||||||
printf(" Device UUID : ");
|
printf(" Device UUID : ");
|
||||||
for (i=0; i<16; i++) {
|
for (i=0; i<16; i++) {
|
||||||
if ((i&3)==0 && i != 0) printf(":");
|
if ((i&3)==0 && i != 0)
|
||||||
|
printf(":");
|
||||||
printf("%02x", sb->device_uuid[i]);
|
printf("%02x", sb->device_uuid[i]);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
@ -410,12 +415,15 @@ static void examine_super1(struct supertype *st, char *homehost)
|
||||||
__le16_to_cpu(sb->ppl.offset));
|
__le16_to_cpu(sb->ppl.offset));
|
||||||
}
|
}
|
||||||
if (sb->feature_map & __cpu_to_le32(MD_FEATURE_RESHAPE_ACTIVE)) {
|
if (sb->feature_map & __cpu_to_le32(MD_FEATURE_RESHAPE_ACTIVE)) {
|
||||||
printf(" Reshape pos'n : %llu%s\n", (unsigned long long)__le64_to_cpu(sb->reshape_position)/2,
|
printf(" Reshape pos'n : %llu%s\n", (unsigned long long)
|
||||||
|
__le64_to_cpu(sb->reshape_position)/2,
|
||||||
human_size(__le64_to_cpu(sb->reshape_position)<<9));
|
human_size(__le64_to_cpu(sb->reshape_position)<<9));
|
||||||
if (__le32_to_cpu(sb->delta_disks)) {
|
if (__le32_to_cpu(sb->delta_disks)) {
|
||||||
printf(" Delta Devices : %d", __le32_to_cpu(sb->delta_disks));
|
printf(" Delta Devices : %d",
|
||||||
|
__le32_to_cpu(sb->delta_disks));
|
||||||
printf(" (%d->%d)\n",
|
printf(" (%d->%d)\n",
|
||||||
__le32_to_cpu(sb->raid_disks)-__le32_to_cpu(sb->delta_disks),
|
__le32_to_cpu(sb->raid_disks) -
|
||||||
|
__le32_to_cpu(sb->delta_disks),
|
||||||
__le32_to_cpu(sb->raid_disks));
|
__le32_to_cpu(sb->raid_disks));
|
||||||
if ((int)__le32_to_cpu(sb->delta_disks) < 0)
|
if ((int)__le32_to_cpu(sb->delta_disks) < 0)
|
||||||
delta_extra = -__le32_to_cpu(sb->delta_disks);
|
delta_extra = -__le32_to_cpu(sb->delta_disks);
|
||||||
|
@ -424,13 +432,16 @@ static void examine_super1(struct supertype *st, char *homehost)
|
||||||
c = map_num(pers, __le32_to_cpu(sb->new_level));
|
c = map_num(pers, __le32_to_cpu(sb->new_level));
|
||||||
printf(" New Level : %s\n", c?c:"-unknown-");
|
printf(" New Level : %s\n", c?c:"-unknown-");
|
||||||
}
|
}
|
||||||
if (__le32_to_cpu(sb->new_layout) != __le32_to_cpu(sb->layout)) {
|
if (__le32_to_cpu(sb->new_layout) !=
|
||||||
|
__le32_to_cpu(sb->layout)) {
|
||||||
if (__le32_to_cpu(sb->level) == 5) {
|
if (__le32_to_cpu(sb->level) == 5) {
|
||||||
c = map_num(r5layout, __le32_to_cpu(sb->new_layout));
|
c = map_num(r5layout,
|
||||||
|
__le32_to_cpu(sb->new_layout));
|
||||||
printf(" New Layout : %s\n", c?c:"-unknown-");
|
printf(" New Layout : %s\n", c?c:"-unknown-");
|
||||||
}
|
}
|
||||||
if (__le32_to_cpu(sb->level) == 6) {
|
if (__le32_to_cpu(sb->level) == 6) {
|
||||||
c = map_num(r6layout, __le32_to_cpu(sb->new_layout));
|
c = map_num(r6layout,
|
||||||
|
__le32_to_cpu(sb->new_layout));
|
||||||
printf(" New Layout : %s\n", c?c:"-unknown-");
|
printf(" New Layout : %s\n", c?c:"-unknown-");
|
||||||
}
|
}
|
||||||
if (__le32_to_cpu(sb->level) == 10) {
|
if (__le32_to_cpu(sb->level) == 10) {
|
||||||
|
@ -439,8 +450,10 @@ static void examine_super1(struct supertype *st, char *homehost)
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (__le32_to_cpu(sb->new_chunk) != __le32_to_cpu(sb->chunksize))
|
if (__le32_to_cpu(sb->new_chunk) !=
|
||||||
printf(" New Chunksize : %dK\n", __le32_to_cpu(sb->new_chunk)/2);
|
__le32_to_cpu(sb->chunksize))
|
||||||
|
printf(" New Chunksize : %dK\n",
|
||||||
|
__le32_to_cpu(sb->new_chunk)/2);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
if (sb->devflags) {
|
if (sb->devflags) {
|
||||||
|
@ -459,18 +472,20 @@ static void examine_super1(struct supertype *st, char *homehost)
|
||||||
printf(" Bad Block Log : %d entries available at offset %ld sectors",
|
printf(" Bad Block Log : %d entries available at offset %ld sectors",
|
||||||
__le16_to_cpu(sb->bblog_size)*512/8,
|
__le16_to_cpu(sb->bblog_size)*512/8,
|
||||||
(long)(int32_t)__le32_to_cpu(sb->bblog_offset));
|
(long)(int32_t)__le32_to_cpu(sb->bblog_offset));
|
||||||
if (sb->feature_map &
|
if (sb->feature_map & __cpu_to_le32(MD_FEATURE_BAD_BLOCKS))
|
||||||
__cpu_to_le32(MD_FEATURE_BAD_BLOCKS))
|
|
||||||
printf(" - bad blocks present.");
|
printf(" - bad blocks present.");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (calc_sb_1_csum(sb) == sb->sb_csum)
|
if (calc_sb_1_csum(sb) == sb->sb_csum)
|
||||||
printf(" Checksum : %x - correct\n", __le32_to_cpu(sb->sb_csum));
|
printf(" Checksum : %x - correct\n",
|
||||||
|
__le32_to_cpu(sb->sb_csum));
|
||||||
else
|
else
|
||||||
printf(" Checksum : %x - expected %x\n", __le32_to_cpu(sb->sb_csum),
|
printf(" Checksum : %x - expected %x\n",
|
||||||
|
__le32_to_cpu(sb->sb_csum),
|
||||||
__le32_to_cpu(calc_sb_1_csum(sb)));
|
__le32_to_cpu(calc_sb_1_csum(sb)));
|
||||||
printf(" Events : %llu\n", (unsigned long long)__le64_to_cpu(sb->events));
|
printf(" Events : %llu\n",
|
||||||
|
(unsigned long long)__le64_to_cpu(sb->events));
|
||||||
printf("\n");
|
printf("\n");
|
||||||
if (__le32_to_cpu(sb->level) == 5) {
|
if (__le32_to_cpu(sb->level) == 5) {
|
||||||
c = map_num(r5layout, __le32_to_cpu(sb->layout));
|
c = map_num(r5layout, __le32_to_cpu(sb->layout));
|
||||||
|
@ -492,26 +507,34 @@ static void examine_super1(struct supertype *st, char *homehost)
|
||||||
case 5:
|
case 5:
|
||||||
case 6:
|
case 6:
|
||||||
case 10:
|
case 10:
|
||||||
printf(" Chunk Size : %dK\n", __le32_to_cpu(sb->chunksize)/2);
|
printf(" Chunk Size : %dK\n",
|
||||||
|
__le32_to_cpu(sb->chunksize)/2);
|
||||||
break;
|
break;
|
||||||
case -1:
|
case -1:
|
||||||
printf(" Rounding : %dK\n", __le32_to_cpu(sb->chunksize)/2);
|
printf(" Rounding : %dK\n",
|
||||||
|
__le32_to_cpu(sb->chunksize)/2);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
break;
|
break;
|
||||||
default: break;
|
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
#if 0
|
#if 0
|
||||||
/* This turns out to just be confusing */
|
/* This turns out to just be confusing */
|
||||||
printf(" Array Slot : %d (", __le32_to_cpu(sb->dev_number));
|
printf(" Array Slot : %d (", __le32_to_cpu(sb->dev_number));
|
||||||
for (i= __le32_to_cpu(sb->max_dev); i> 0 ; i--)
|
for (i = __le32_to_cpu(sb->max_dev); i> 0 ; i--)
|
||||||
if (__le16_to_cpu(sb->dev_roles[i-1]) != MD_DISK_ROLE_SPARE)
|
if (__le16_to_cpu(sb->dev_roles[i-1]) != MD_DISK_ROLE_SPARE)
|
||||||
break;
|
break;
|
||||||
for (d=0; d < i; d++) {
|
for (d = 0; d < i; d++) {
|
||||||
int role = __le16_to_cpu(sb->dev_roles[d]);
|
int role = __le16_to_cpu(sb->dev_roles[d]);
|
||||||
if (d) printf(", ");
|
if (d)
|
||||||
if (role == MD_DISK_ROLE_SPARE) printf("empty");
|
printf(", ");
|
||||||
else if(role == MD_DISK_ROLE_FAULTY) printf("failed");
|
if (role == MD_DISK_ROLE_SPARE)
|
||||||
else printf("%d", role);
|
printf("empty");
|
||||||
|
else
|
||||||
|
if(role == MD_DISK_ROLE_FAULTY)
|
||||||
|
printf("failed");
|
||||||
|
else
|
||||||
|
printf("%d", role);
|
||||||
}
|
}
|
||||||
printf(")\n");
|
printf(")\n");
|
||||||
#endif
|
#endif
|
||||||
|
@ -527,10 +550,10 @@ static void examine_super1(struct supertype *st, char *homehost)
|
||||||
printf("Active device %d\n", role);
|
printf("Active device %d\n", role);
|
||||||
|
|
||||||
printf(" Array State : ");
|
printf(" Array State : ");
|
||||||
for (d=0; d<__le32_to_cpu(sb->raid_disks) + delta_extra; d++) {
|
for (d = 0; d < __le32_to_cpu(sb->raid_disks) + delta_extra; d++) {
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
for (i=0; i< __le32_to_cpu(sb->max_dev); i++) {
|
for (i = 0; i < __le32_to_cpu(sb->max_dev); i++) {
|
||||||
unsigned int role = __le16_to_cpu(sb->dev_roles[i]);
|
unsigned int role = __le16_to_cpu(sb->dev_roles[i]);
|
||||||
if (role == d)
|
if (role == d)
|
||||||
cnt++;
|
cnt++;
|
||||||
|
@ -547,12 +570,13 @@ static void examine_super1(struct supertype *st, char *homehost)
|
||||||
#if 0
|
#if 0
|
||||||
/* This is confusing too */
|
/* This is confusing too */
|
||||||
faulty = 0;
|
faulty = 0;
|
||||||
for (i=0; i< __le32_to_cpu(sb->max_dev); i++) {
|
for (i = 0; i< __le32_to_cpu(sb->max_dev); i++) {
|
||||||
int role = __le16_to_cpu(sb->dev_roles[i]);
|
int role = __le16_to_cpu(sb->dev_roles[i]);
|
||||||
if (role == MD_DISK_ROLE_FAULTY)
|
if (role == MD_DISK_ROLE_FAULTY)
|
||||||
faulty++;
|
faulty++;
|
||||||
}
|
}
|
||||||
if (faulty) printf(" %d failed", faulty);
|
if (faulty)
|
||||||
|
printf(" %d failed", faulty);
|
||||||
#endif
|
#endif
|
||||||
printf(" ('A' == active, '.' == missing, 'R' == replacing)");
|
printf(" ('A' == active, '.' == missing, 'R' == replacing)");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
@ -564,7 +588,7 @@ static void brief_examine_super1(struct supertype *st, int verbose)
|
||||||
int i;
|
int i;
|
||||||
unsigned long long sb_offset;
|
unsigned long long sb_offset;
|
||||||
char *nm;
|
char *nm;
|
||||||
char *c=map_num(pers, __le32_to_cpu(sb->level));
|
char *c = map_num(pers, __le32_to_cpu(sb->level));
|
||||||
|
|
||||||
nm = strchr(sb->set_name, ':');
|
nm = strchr(sb->set_name, ':');
|
||||||
if (nm)
|
if (nm)
|
||||||
|
@ -592,8 +616,9 @@ static void brief_examine_super1(struct supertype *st, int verbose)
|
||||||
if (verbose)
|
if (verbose)
|
||||||
printf("num-devices=%d ", __le32_to_cpu(sb->raid_disks));
|
printf("num-devices=%d ", __le32_to_cpu(sb->raid_disks));
|
||||||
printf("UUID=");
|
printf("UUID=");
|
||||||
for (i=0; i<16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
if ((i&3)==0 && i != 0) printf(":");
|
if ((i&3)==0 && i != 0)
|
||||||
|
printf(":");
|
||||||
printf("%02x", sb->set_uuid[i]);
|
printf("%02x", sb->set_uuid[i]);
|
||||||
}
|
}
|
||||||
if (sb->set_name[0]) {
|
if (sb->set_name[0]) {
|
||||||
|
@ -612,9 +637,8 @@ static void export_examine_super1(struct supertype *st)
|
||||||
|
|
||||||
printf("MD_LEVEL=%s\n", map_num(pers, __le32_to_cpu(sb->level)));
|
printf("MD_LEVEL=%s\n", map_num(pers, __le32_to_cpu(sb->level)));
|
||||||
printf("MD_DEVICES=%d\n", __le32_to_cpu(sb->raid_disks));
|
printf("MD_DEVICES=%d\n", __le32_to_cpu(sb->raid_disks));
|
||||||
for (i=0; i<32; i++)
|
for (i = 0; i < 32; i++)
|
||||||
if (sb->set_name[i] == '\n' ||
|
if (sb->set_name[i] == '\n' || sb->set_name[i] == '\0') {
|
||||||
sb->set_name[i] == '\0') {
|
|
||||||
len = i;
|
len = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -623,10 +647,16 @@ static void export_examine_super1(struct supertype *st)
|
||||||
if (__le32_to_cpu(sb->level) > 0) {
|
if (__le32_to_cpu(sb->level) > 0) {
|
||||||
int ddsks = 0, ddsks_denom = 1;
|
int ddsks = 0, ddsks_denom = 1;
|
||||||
switch(__le32_to_cpu(sb->level)) {
|
switch(__le32_to_cpu(sb->level)) {
|
||||||
case 1: ddsks=1;break;
|
case 1:
|
||||||
|
ddsks = 1;
|
||||||
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
case 5: ddsks = __le32_to_cpu(sb->raid_disks)-1; break;
|
case 5:
|
||||||
case 6: ddsks = __le32_to_cpu(sb->raid_disks)-2; break;
|
ddsks = __le32_to_cpu(sb->raid_disks)-1;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
ddsks = __le32_to_cpu(sb->raid_disks)-2;
|
||||||
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
layout = __le32_to_cpu(sb->layout);
|
layout = __le32_to_cpu(sb->layout);
|
||||||
ddsks = __le32_to_cpu(sb->raid_disks);
|
ddsks = __le32_to_cpu(sb->raid_disks);
|
||||||
|
@ -635,20 +665,23 @@ static void export_examine_super1(struct supertype *st)
|
||||||
if (ddsks) {
|
if (ddsks) {
|
||||||
long long asize = __le64_to_cpu(sb->size);
|
long long asize = __le64_to_cpu(sb->size);
|
||||||
asize = (asize << 9) * ddsks / ddsks_denom;
|
asize = (asize << 9) * ddsks / ddsks_denom;
|
||||||
printf("MD_ARRAY_SIZE=%s\n",human_size_brief(asize,JEDEC));
|
printf("MD_ARRAY_SIZE=%s\n",
|
||||||
|
human_size_brief(asize, JEDEC));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("MD_UUID=");
|
printf("MD_UUID=");
|
||||||
for (i=0; i<16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
if ((i&3)==0 && i != 0) printf(":");
|
if ((i&3) == 0 && i != 0)
|
||||||
|
printf(":");
|
||||||
printf("%02x", sb->set_uuid[i]);
|
printf("%02x", sb->set_uuid[i]);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("MD_UPDATE_TIME=%llu\n",
|
printf("MD_UPDATE_TIME=%llu\n",
|
||||||
__le64_to_cpu(sb->utime) & 0xFFFFFFFFFFULL);
|
__le64_to_cpu(sb->utime) & 0xFFFFFFFFFFULL);
|
||||||
printf("MD_DEV_UUID=");
|
printf("MD_DEV_UUID=");
|
||||||
for (i=0; i<16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
if ((i&3)==0 && i != 0) printf(":");
|
if ((i&3) == 0 && i != 0)
|
||||||
|
printf(":");
|
||||||
printf("%02x", sb->device_uuid[i]);
|
printf("%02x", sb->device_uuid[i]);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
@ -797,15 +830,16 @@ static void detail_super1(struct supertype *st, char *homehost)
|
||||||
int l = homehost ? strlen(homehost) : 0;
|
int l = homehost ? strlen(homehost) : 0;
|
||||||
|
|
||||||
printf(" Name : %.32s", sb->set_name);
|
printf(" Name : %.32s", sb->set_name);
|
||||||
if (l > 0 && l < 32 &&
|
if (l > 0 && l < 32 && sb->set_name[l] == ':' &&
|
||||||
sb->set_name[l] == ':' &&
|
|
||||||
strncmp(sb->set_name, homehost, l) == 0)
|
strncmp(sb->set_name, homehost, l) == 0)
|
||||||
printf(" (local to host %s)", homehost);
|
printf(" (local to host %s)", homehost);
|
||||||
if (bms->nodes > 0 && (__le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET))
|
if (bms->nodes > 0 &&
|
||||||
printf("\n Cluster Name : %-64s", bms->cluster_name);
|
(__le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET))
|
||||||
|
printf("\n Cluster Name : %-64s", bms->cluster_name);
|
||||||
printf("\n UUID : ");
|
printf("\n UUID : ");
|
||||||
for (i=0; i<16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
if ((i&3)==0 && i != 0) printf(":");
|
if ((i&3) == 0 && i != 0)
|
||||||
|
printf(":");
|
||||||
printf("%02x", sb->set_uuid[i]);
|
printf("%02x", sb->set_uuid[i]);
|
||||||
}
|
}
|
||||||
printf("\n Events : %llu\n\n",
|
printf("\n Events : %llu\n\n",
|
||||||
|
@ -822,8 +856,9 @@ static void brief_detail_super1(struct supertype *st)
|
||||||
print_quoted(sb->set_name);
|
print_quoted(sb->set_name);
|
||||||
}
|
}
|
||||||
printf(" UUID=");
|
printf(" UUID=");
|
||||||
for (i=0; i<16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
if ((i&3)==0 && i != 0) printf(":");
|
if ((i & 3) == 0 && i != 0)
|
||||||
|
printf(":");
|
||||||
printf("%02x", sb->set_uuid[i]);
|
printf("%02x", sb->set_uuid[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -834,9 +869,8 @@ static void export_detail_super1(struct supertype *st)
|
||||||
int i;
|
int i;
|
||||||
int len = 32;
|
int len = 32;
|
||||||
|
|
||||||
for (i=0; i<32; i++)
|
for (i = 0; i < 32; i++)
|
||||||
if (sb->set_name[i] == '\n' ||
|
if (sb->set_name[i] == '\n' || sb->set_name[i] == '\0') {
|
||||||
sb->set_name[i] == '\0') {
|
|
||||||
len = i;
|
len = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -852,13 +886,12 @@ static int examine_badblocks_super1(struct supertype *st, int fd, char *devname)
|
||||||
__u64 *bbl, *bbp;
|
__u64 *bbl, *bbp;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!sb->bblog_size || __le16_to_cpu(sb->bblog_size) > 100
|
if (!sb->bblog_size || __le16_to_cpu(sb->bblog_size) > 100 ||
|
||||||
|| !sb->bblog_offset){
|
!sb->bblog_offset){
|
||||||
printf("No bad-blocks list configured on %s\n", devname);
|
printf("No bad-blocks list configured on %s\n", devname);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ((sb->feature_map & __cpu_to_le32(MD_FEATURE_BAD_BLOCKS))
|
if ((sb->feature_map & __cpu_to_le32(MD_FEATURE_BAD_BLOCKS)) == 0) {
|
||||||
== 0) {
|
|
||||||
printf("Bad-blocks list is empty in %s\n", devname);
|
printf("Bad-blocks list is empty in %s\n", devname);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -905,8 +938,7 @@ static int match_home1(struct supertype *st, char *homehost)
|
||||||
struct mdp_superblock_1 *sb = st->sb;
|
struct mdp_superblock_1 *sb = st->sb;
|
||||||
int l = homehost ? strlen(homehost) : 0;
|
int l = homehost ? strlen(homehost) : 0;
|
||||||
|
|
||||||
return (l > 0 && l < 32 &&
|
return (l > 0 && l < 32 && sb->set_name[l] == ':' &&
|
||||||
sb->set_name[l] == ':' &&
|
|
||||||
strncmp(sb->set_name, homehost, l) == 0);
|
strncmp(sb->set_name, homehost, l) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -915,7 +947,7 @@ static void uuid_from_super1(struct supertype *st, int uuid[4])
|
||||||
struct mdp_superblock_1 *super = st->sb;
|
struct mdp_superblock_1 *super = st->sb;
|
||||||
char *cuuid = (char*)uuid;
|
char *cuuid = (char*)uuid;
|
||||||
int i;
|
int i;
|
||||||
for (i=0; i<16; i++)
|
for (i = 0; i < 16; i++)
|
||||||
cuuid[i] = super->set_uuid[i];
|
cuuid[i] = super->set_uuid[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -923,7 +955,8 @@ static void getinfo_super1(struct supertype *st, struct mdinfo *info, char *map)
|
||||||
{
|
{
|
||||||
struct mdp_superblock_1 *sb = st->sb;
|
struct mdp_superblock_1 *sb = st->sb;
|
||||||
struct bitmap_super_s *bsb = (void*)(((char*)sb)+MAX_SB_SIZE);
|
struct bitmap_super_s *bsb = (void*)(((char*)sb)+MAX_SB_SIZE);
|
||||||
struct misc_dev_info *misc = (void*)(((char*)sb)+MAX_SB_SIZE+BM_SUPER_SIZE);
|
struct misc_dev_info *misc =
|
||||||
|
(void*)(((char*)sb)+MAX_SB_SIZE+BM_SUPER_SIZE);
|
||||||
int working = 0;
|
int working = 0;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int role;
|
unsigned int role;
|
||||||
|
@ -943,8 +976,7 @@ static void getinfo_super1(struct supertype *st, struct mdinfo *info, char *map)
|
||||||
info->array.utime = __le64_to_cpu(sb->utime);
|
info->array.utime = __le64_to_cpu(sb->utime);
|
||||||
info->array.chunk_size = __le32_to_cpu(sb->chunksize)*512;
|
info->array.chunk_size = __le32_to_cpu(sb->chunksize)*512;
|
||||||
info->array.state =
|
info->array.state =
|
||||||
(__le64_to_cpu(sb->resync_offset) == MaxSector)
|
(__le64_to_cpu(sb->resync_offset) == MaxSector) ? 1 : 0;
|
||||||
? 1 : 0;
|
|
||||||
if (__le32_to_cpu(bsb->nodes) > 1)
|
if (__le32_to_cpu(bsb->nodes) > 1)
|
||||||
info->array.state |= (1 << MD_SB_CLUSTERED);
|
info->array.state |= (1 << MD_SB_CLUSTERED);
|
||||||
|
|
||||||
|
@ -985,7 +1017,8 @@ static void getinfo_super1(struct supertype *st, struct mdinfo *info, char *map)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (super_offset + info->bitmap_offset + info->ppl_offset < end)
|
if (super_offset + info->bitmap_offset + info->ppl_offset < end)
|
||||||
end = super_offset + info->bitmap_offset + info->ppl_offset;
|
end = super_offset + info->bitmap_offset +
|
||||||
|
info->ppl_offset;
|
||||||
|
|
||||||
if (info->data_offset + data_size < end)
|
if (info->data_offset + data_size < end)
|
||||||
info->space_after = end - data_size - info->data_offset;
|
info->space_after = end - data_size - info->data_offset;
|
||||||
|
@ -1002,8 +1035,9 @@ static void getinfo_super1(struct supertype *st, struct mdinfo *info, char *map)
|
||||||
if (bmend > earliest)
|
if (bmend > earliest)
|
||||||
earliest = bmend;
|
earliest = bmend;
|
||||||
} else if (info->ppl_offset > 0) {
|
} else if (info->ppl_offset > 0) {
|
||||||
unsigned long long pplend = info->ppl_offset +
|
unsigned long long pplend;
|
||||||
info->ppl_size;
|
|
||||||
|
pplend = info->ppl_offset + info->ppl_size;
|
||||||
if (pplend > earliest)
|
if (pplend > earliest)
|
||||||
earliest = pplend;
|
earliest = pplend;
|
||||||
}
|
}
|
||||||
|
@ -1018,7 +1052,8 @@ static void getinfo_super1(struct supertype *st, struct mdinfo *info, char *map)
|
||||||
info->space_before = info->data_offset - earliest;
|
info->space_before = info->data_offset - earliest;
|
||||||
else
|
else
|
||||||
info->space_before = 0;
|
info->space_before = 0;
|
||||||
info->space_after = misc->device_size - data_size - info->data_offset;
|
info->space_after = misc->device_size - data_size -
|
||||||
|
info->data_offset;
|
||||||
}
|
}
|
||||||
if (info->space_before == 0 && info->space_after == 0) {
|
if (info->space_before == 0 && info->space_after == 0) {
|
||||||
/* It will look like we don't support data_offset changes,
|
/* It will look like we don't support data_offset changes,
|
||||||
|
@ -1032,7 +1067,8 @@ static void getinfo_super1(struct supertype *st, struct mdinfo *info, char *map)
|
||||||
info->disk.raid_disk = -1;
|
info->disk.raid_disk = -1;
|
||||||
switch(role) {
|
switch(role) {
|
||||||
case MD_DISK_ROLE_SPARE:
|
case MD_DISK_ROLE_SPARE:
|
||||||
info->disk.state = 0; /* spare: not active, not sync, not faulty */
|
/* spare: not active, not sync, not faulty */
|
||||||
|
info->disk.state = 0;
|
||||||
break;
|
break;
|
||||||
case MD_DISK_ROLE_FAULTY:
|
case MD_DISK_ROLE_FAULTY:
|
||||||
info->disk.state = (1 << MD_DISK_FAULTY); /* faulty */
|
info->disk.state = (1 << MD_DISK_FAULTY); /* faulty */
|
||||||
|
@ -1040,7 +1076,8 @@ static void getinfo_super1(struct supertype *st, struct mdinfo *info, char *map)
|
||||||
case MD_DISK_ROLE_JOURNAL:
|
case MD_DISK_ROLE_JOURNAL:
|
||||||
info->disk.state = (1 << MD_DISK_JOURNAL);
|
info->disk.state = (1 << MD_DISK_JOURNAL);
|
||||||
info->disk.raid_disk = role;
|
info->disk.raid_disk = role;
|
||||||
info->space_after = (misc->device_size - info->data_offset) % 8; /* journal uses all 4kB blocks*/
|
/* journal uses all 4kB blocks*/
|
||||||
|
info->space_after = (misc->device_size - info->data_offset) % 8;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
info->disk.state = 6; /* active and in sync */
|
info->disk.state = 6; /* active and in sync */
|
||||||
|
@ -1129,8 +1166,7 @@ static struct mdinfo *container_content1(struct supertype *st, char *subarray)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int update_super1(struct supertype *st, struct mdinfo *info,
|
static int update_super1(struct supertype *st, struct mdinfo *info,
|
||||||
char *update,
|
char *update, char *devname, int verbose,
|
||||||
char *devname, int verbose,
|
|
||||||
int uuid_set, char *homehost)
|
int uuid_set, char *homehost)
|
||||||
{
|
{
|
||||||
/* NOTE: for 'assemble' and 'force' we need to return non-zero
|
/* NOTE: for 'assemble' and 'force' we need to return non-zero
|
||||||
|
@ -1145,7 +1181,8 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
|
||||||
if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready()) {
|
if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready()) {
|
||||||
rv = cluster_get_dlmlock(&lockid);
|
rv = cluster_get_dlmlock(&lockid);
|
||||||
if (rv) {
|
if (rv) {
|
||||||
pr_err("Cannot get dlmlock in %s return %d\n", __func__, rv);
|
pr_err("Cannot get dlmlock in %s return %d\n",
|
||||||
|
__func__, rv);
|
||||||
cluster_release_dlmlock(lockid);
|
cluster_release_dlmlock(lockid);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -1178,7 +1215,9 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
|
||||||
* maybe need to mark it 'clean'.
|
* maybe need to mark it 'clean'.
|
||||||
*/
|
*/
|
||||||
switch(__le32_to_cpu(sb->level)) {
|
switch(__le32_to_cpu(sb->level)) {
|
||||||
case 5: case 4: case 6:
|
case 4:
|
||||||
|
case 5:
|
||||||
|
case 6:
|
||||||
/* need to force clean */
|
/* need to force clean */
|
||||||
if (sb->resync_offset != MaxSector)
|
if (sb->resync_offset != MaxSector)
|
||||||
rv = 1;
|
rv = 1;
|
||||||
|
@ -1198,17 +1237,23 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
|
||||||
rv = 1;
|
rv = 1;
|
||||||
}
|
}
|
||||||
if (info->reshape_active &&
|
if (info->reshape_active &&
|
||||||
sb->feature_map & __le32_to_cpu(MD_FEATURE_RESHAPE_ACTIVE) &&
|
sb->feature_map &
|
||||||
|
__le32_to_cpu(MD_FEATURE_RESHAPE_ACTIVE) &&
|
||||||
info->delta_disks >= 0 &&
|
info->delta_disks >= 0 &&
|
||||||
info->reshape_progress < __le64_to_cpu(sb->reshape_position)) {
|
info->reshape_progress <
|
||||||
sb->reshape_position = __cpu_to_le64(info->reshape_progress);
|
__le64_to_cpu(sb->reshape_position)) {
|
||||||
|
sb->reshape_position =
|
||||||
|
__cpu_to_le64(info->reshape_progress);
|
||||||
rv = 1;
|
rv = 1;
|
||||||
}
|
}
|
||||||
if (info->reshape_active &&
|
if (info->reshape_active &&
|
||||||
sb->feature_map & __le32_to_cpu(MD_FEATURE_RESHAPE_ACTIVE) &&
|
sb->feature_map &
|
||||||
|
__le32_to_cpu(MD_FEATURE_RESHAPE_ACTIVE) &&
|
||||||
info->delta_disks < 0 &&
|
info->delta_disks < 0 &&
|
||||||
info->reshape_progress > __le64_to_cpu(sb->reshape_position)) {
|
info->reshape_progress >
|
||||||
sb->reshape_position = __cpu_to_le64(info->reshape_progress);
|
__le64_to_cpu(sb->reshape_position)) {
|
||||||
|
sb->reshape_position =
|
||||||
|
__cpu_to_le64(info->reshape_progress);
|
||||||
rv = 1;
|
rv = 1;
|
||||||
}
|
}
|
||||||
} else if (strcmp(update, "linear-grow-new") == 0) {
|
} else if (strcmp(update, "linear-grow-new") == 0) {
|
||||||
|
@ -1216,8 +1261,9 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
|
||||||
int fd;
|
int fd;
|
||||||
unsigned int max = __le32_to_cpu(sb->max_dev);
|
unsigned int max = __le32_to_cpu(sb->max_dev);
|
||||||
|
|
||||||
for (i=0 ; i < max ; i++)
|
for (i = 0; i < max; i++)
|
||||||
if (__le16_to_cpu(sb->dev_roles[i]) >= MD_DISK_ROLE_FAULTY)
|
if (__le16_to_cpu(sb->dev_roles[i]) >=
|
||||||
|
MD_DISK_ROLE_FAULTY)
|
||||||
break;
|
break;
|
||||||
sb->dev_number = __cpu_to_le32(i);
|
sb->dev_number = __cpu_to_le32(i);
|
||||||
info->disk.number = i;
|
info->disk.number = i;
|
||||||
|
@ -1226,8 +1272,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
|
||||||
|
|
||||||
random_uuid(sb->device_uuid);
|
random_uuid(sb->device_uuid);
|
||||||
|
|
||||||
sb->dev_roles[i] =
|
sb->dev_roles[i] = __cpu_to_le16(info->disk.raid_disk);
|
||||||
__cpu_to_le16(info->disk.raid_disk);
|
|
||||||
|
|
||||||
fd = open(devname, O_RDONLY);
|
fd = open(devname, O_RDONLY);
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
|
@ -1280,14 +1325,16 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sb_offset < data_offset) {
|
if (sb_offset < data_offset) {
|
||||||
/* 1.1 or 1.2. Put bbl after bitmap leaving at least 32K
|
/*
|
||||||
|
* 1.1 or 1.2. Put bbl after bitmap leaving
|
||||||
|
* at least 32K
|
||||||
*/
|
*/
|
||||||
long bb_offset;
|
long bb_offset;
|
||||||
bb_offset = sb_offset + 8;
|
bb_offset = sb_offset + 8;
|
||||||
if (bm_sectors && bitmap_offset > 0)
|
if (bm_sectors && bitmap_offset > 0)
|
||||||
bb_offset = bitmap_offset + bm_sectors;
|
bb_offset = bitmap_offset + bm_sectors;
|
||||||
while (bb_offset < (long)sb_offset + 8 + 32*2
|
while (bb_offset < (long)sb_offset + 8 + 32*2 &&
|
||||||
&& bb_offset + 8+8 <= (long)data_offset)
|
bb_offset + 8+8 <= (long)data_offset)
|
||||||
/* too close to bitmap, and room to grow */
|
/* too close to bitmap, and room to grow */
|
||||||
bb_offset += 8;
|
bb_offset += 8;
|
||||||
if (bb_offset + 8 <= (long)data_offset) {
|
if (bb_offset + 8 <= (long)data_offset) {
|
||||||
|
@ -1381,8 +1428,8 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
|
||||||
} else
|
} else
|
||||||
strncpy(sb->set_name, info->name, sizeof(sb->set_name));
|
strncpy(sb->set_name, info->name, sizeof(sb->set_name));
|
||||||
} else if (strcmp(update, "devicesize") == 0 &&
|
} else if (strcmp(update, "devicesize") == 0 &&
|
||||||
__le64_to_cpu(sb->super_offset) <
|
__le64_to_cpu(sb->super_offset) <
|
||||||
__le64_to_cpu(sb->data_offset)) {
|
__le64_to_cpu(sb->data_offset)) {
|
||||||
/* set data_size to device size less data_offset */
|
/* set data_size to device size less data_offset */
|
||||||
struct misc_dev_info *misc = (struct misc_dev_info*)
|
struct misc_dev_info *misc = (struct misc_dev_info*)
|
||||||
(st->sb + MAX_SB_SIZE + BM_SUPER_SIZE);
|
(st->sb + MAX_SB_SIZE + BM_SUPER_SIZE);
|
||||||
|
@ -1390,7 +1437,8 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
|
||||||
misc->device_size - __le64_to_cpu(sb->data_offset));
|
misc->device_size - __le64_to_cpu(sb->data_offset));
|
||||||
} else if (strncmp(update, "revert-reshape", 14) == 0) {
|
} else if (strncmp(update, "revert-reshape", 14) == 0) {
|
||||||
rv = -2;
|
rv = -2;
|
||||||
if (!(sb->feature_map & __cpu_to_le32(MD_FEATURE_RESHAPE_ACTIVE)))
|
if (!(sb->feature_map &
|
||||||
|
__cpu_to_le32(MD_FEATURE_RESHAPE_ACTIVE)))
|
||||||
pr_err("No active reshape to revert on %s\n",
|
pr_err("No active reshape to revert on %s\n",
|
||||||
devname);
|
devname);
|
||||||
else {
|
else {
|
||||||
|
@ -1431,9 +1479,11 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
|
||||||
*/
|
*/
|
||||||
if (__le32_to_cpu(sb->level) >= 4 &&
|
if (__le32_to_cpu(sb->level) >= 4 &&
|
||||||
__le32_to_cpu(sb->level) <= 6) {
|
__le32_to_cpu(sb->level) <= 6) {
|
||||||
reshape_sectors = __le64_to_cpu(sb->reshape_position);
|
reshape_sectors =
|
||||||
|
__le64_to_cpu(sb->reshape_position);
|
||||||
reshape_chunk = __le32_to_cpu(sb->new_chunk);
|
reshape_chunk = __le32_to_cpu(sb->new_chunk);
|
||||||
reshape_chunk *= __le32_to_cpu(sb->raid_disks) - __le32_to_cpu(sb->delta_disks) -
|
reshape_chunk *= __le32_to_cpu(sb->raid_disks) -
|
||||||
|
__le32_to_cpu(sb->delta_disks) -
|
||||||
(__le32_to_cpu(sb->level)==6 ? 2 : 1);
|
(__le32_to_cpu(sb->level)==6 ? 2 : 1);
|
||||||
if (reshape_sectors % reshape_chunk) {
|
if (reshape_sectors % reshape_chunk) {
|
||||||
pr_err("Reshape position is not suitably aligned.\n");
|
pr_err("Reshape position is not suitably aligned.\n");
|
||||||
|
@ -1441,8 +1491,9 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sb->raid_disks = __cpu_to_le32(__le32_to_cpu(sb->raid_disks) -
|
sb->raid_disks =
|
||||||
__le32_to_cpu(sb->delta_disks));
|
__cpu_to_le32(__le32_to_cpu(sb->raid_disks) -
|
||||||
|
__le32_to_cpu(sb->delta_disks));
|
||||||
if (sb->delta_disks == 0)
|
if (sb->delta_disks == 0)
|
||||||
sb->feature_map ^= __cpu_to_le32(MD_FEATURE_RESHAPE_BACKWARDS);
|
sb->feature_map ^= __cpu_to_le32(MD_FEATURE_RESHAPE_BACKWARDS);
|
||||||
else
|
else
|
||||||
|
@ -1456,19 +1507,21 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
|
||||||
sb->new_chunk = sb->chunksize;
|
sb->new_chunk = sb->chunksize;
|
||||||
sb->chunksize = temp;
|
sb->chunksize = temp;
|
||||||
|
|
||||||
if (sb->feature_map & __cpu_to_le32(MD_FEATURE_NEW_OFFSET)) {
|
if (sb->feature_map &
|
||||||
long offset_delta = (int32_t)__le32_to_cpu(sb->new_offset);
|
__cpu_to_le32(MD_FEATURE_NEW_OFFSET)) {
|
||||||
|
long offset_delta =
|
||||||
|
(int32_t)__le32_to_cpu(sb->new_offset);
|
||||||
sb->data_offset = __cpu_to_le64(__le64_to_cpu(sb->data_offset) + offset_delta);
|
sb->data_offset = __cpu_to_le64(__le64_to_cpu(sb->data_offset) + offset_delta);
|
||||||
sb->new_offset = __cpu_to_le32(-offset_delta);
|
sb->new_offset = __cpu_to_le32(-offset_delta);
|
||||||
sb->data_size = __cpu_to_le64(__le64_to_cpu(sb->data_size) - offset_delta);
|
sb->data_size = __cpu_to_le64(__le64_to_cpu(sb->data_size) - offset_delta);
|
||||||
}
|
}
|
||||||
done:;
|
done:;
|
||||||
}
|
}
|
||||||
} else if (strcmp(update, "_reshape_progress")==0)
|
} else if (strcmp(update, "_reshape_progress") == 0)
|
||||||
sb->reshape_position = __cpu_to_le64(info->reshape_progress);
|
sb->reshape_position = __cpu_to_le64(info->reshape_progress);
|
||||||
else if (strcmp(update, "writemostly")==0)
|
else if (strcmp(update, "writemostly") == 0)
|
||||||
sb->devflags |= WriteMostly1;
|
sb->devflags |= WriteMostly1;
|
||||||
else if (strcmp(update, "readwrite")==0)
|
else if (strcmp(update, "readwrite") == 0)
|
||||||
sb->devflags &= ~WriteMostly1;
|
sb->devflags &= ~WriteMostly1;
|
||||||
else if (strcmp(update, "failfast") == 0)
|
else if (strcmp(update, "failfast") == 0)
|
||||||
sb->devflags |= FailFast1;
|
sb->devflags |= FailFast1;
|
||||||
|
@ -1553,11 +1606,14 @@ static int init_super1(struct supertype *st, mdu_array_info_t *info,
|
||||||
sb->resync_offset = MaxSector;
|
sb->resync_offset = MaxSector;
|
||||||
else
|
else
|
||||||
sb->resync_offset = 0;
|
sb->resync_offset = 0;
|
||||||
sbsize = sizeof(struct mdp_superblock_1) + 2 * (info->raid_disks + spares);
|
sbsize = sizeof(struct mdp_superblock_1) +
|
||||||
|
2 * (info->raid_disks + spares);
|
||||||
sbsize = ROUND_UP(sbsize, 512);
|
sbsize = ROUND_UP(sbsize, 512);
|
||||||
sb->max_dev = __cpu_to_le32((sbsize - sizeof(struct mdp_superblock_1)) / 2);
|
sb->max_dev =
|
||||||
|
__cpu_to_le32((sbsize - sizeof(struct mdp_superblock_1)) / 2);
|
||||||
|
|
||||||
memset(sb->dev_roles, 0xff, MAX_SB_SIZE - sizeof(struct mdp_superblock_1));
|
memset(sb->dev_roles, 0xff,
|
||||||
|
MAX_SB_SIZE - sizeof(struct mdp_superblock_1));
|
||||||
|
|
||||||
if (s->consistency_policy == CONSISTENCY_POLICY_PPL)
|
if (s->consistency_policy == CONSISTENCY_POLICY_PPL)
|
||||||
sb->feature_map |= __cpu_to_le32(MD_FEATURE_PPL);
|
sb->feature_map |= __cpu_to_le32(MD_FEATURE_PPL);
|
||||||
|
@ -1587,7 +1643,8 @@ static int add_to_super1(struct supertype *st, mdu_disk_info_t *dk,
|
||||||
if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready()) {
|
if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready()) {
|
||||||
rv = cluster_get_dlmlock(&lockid);
|
rv = cluster_get_dlmlock(&lockid);
|
||||||
if (rv) {
|
if (rv) {
|
||||||
pr_err("Cannot get dlmlock in %s return %d\n", __func__, rv);
|
pr_err("Cannot get dlmlock in %s return %d\n",
|
||||||
|
__func__, rv);
|
||||||
cluster_release_dlmlock(lockid);
|
cluster_release_dlmlock(lockid);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -1599,7 +1656,8 @@ static int add_to_super1(struct supertype *st, mdu_disk_info_t *dk,
|
||||||
*rp = __cpu_to_le16(dk->raid_disk);
|
*rp = __cpu_to_le16(dk->raid_disk);
|
||||||
else if (dk_state & (1<<MD_DISK_JOURNAL))
|
else if (dk_state & (1<<MD_DISK_JOURNAL))
|
||||||
*rp = MD_DISK_ROLE_JOURNAL;
|
*rp = MD_DISK_ROLE_JOURNAL;
|
||||||
else if ((dk_state & ~(1<<MD_DISK_ACTIVE)) == 0) /* active or idle -> spare */
|
else if ((dk_state & ~(1<<MD_DISK_ACTIVE)) == 0)
|
||||||
|
/* active or idle -> spare */
|
||||||
*rp = MD_DISK_ROLE_SPARE;
|
*rp = MD_DISK_ROLE_SPARE;
|
||||||
else
|
else
|
||||||
*rp = MD_DISK_ROLE_FAULTY;
|
*rp = MD_DISK_ROLE_FAULTY;
|
||||||
|
@ -1644,7 +1702,8 @@ static int store_super1(struct supertype *st, int fd)
|
||||||
if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready()) {
|
if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready()) {
|
||||||
rv = cluster_get_dlmlock(&lockid);
|
rv = cluster_get_dlmlock(&lockid);
|
||||||
if (rv) {
|
if (rv) {
|
||||||
pr_err("Cannot get dlmlock in %s return %d\n", __func__, rv);
|
pr_err("Cannot get dlmlock in %s return %d\n",
|
||||||
|
__func__, rv);
|
||||||
cluster_release_dlmlock(lockid);
|
cluster_release_dlmlock(lockid);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -1911,7 +1970,8 @@ static int write_init_super1(struct supertype *st)
|
||||||
bm_space = calc_bitmap_size(bms, 4096) >> 9;
|
bm_space = calc_bitmap_size(bms, 4096) >> 9;
|
||||||
bm_offset = (long)__le32_to_cpu(sb->bitmap_offset);
|
bm_offset = (long)__le32_to_cpu(sb->bitmap_offset);
|
||||||
} else if (sb->feature_map & __cpu_to_le32(MD_FEATURE_PPL)) {
|
} else if (sb->feature_map & __cpu_to_le32(MD_FEATURE_PPL)) {
|
||||||
bm_space = choose_ppl_space(__le32_to_cpu(sb->chunksize));
|
bm_space =
|
||||||
|
choose_ppl_space(__le32_to_cpu(sb->chunksize));
|
||||||
if (bm_space > UINT16_MAX)
|
if (bm_space > UINT16_MAX)
|
||||||
bm_space = UINT16_MAX;
|
bm_space = UINT16_MAX;
|
||||||
if (st->minor_version == 0) {
|
if (st->minor_version == 0) {
|
||||||
|
@ -1981,7 +2041,10 @@ static int write_init_super1(struct supertype *st)
|
||||||
rv = -EINVAL;
|
rv = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
/* Disable badblock log on clusters, or when explicitly requested */
|
/*
|
||||||
|
* Disable badblock log on clusters, or when
|
||||||
|
* explicitly requested
|
||||||
|
*/
|
||||||
if (st->nodes > 0 || conf_get_create_info()->bblist == 0) {
|
if (st->nodes > 0 || conf_get_create_info()->bblist == 0) {
|
||||||
sb->bblog_size = 0;
|
sb->bblog_size = 0;
|
||||||
sb->bblog_offset = 0;
|
sb->bblog_offset = 0;
|
||||||
|
@ -1997,7 +2060,8 @@ static int write_init_super1(struct supertype *st)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rv == 0 &&
|
if (rv == 0 &&
|
||||||
(__le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET)) {
|
(__le32_to_cpu(sb->feature_map) &
|
||||||
|
MD_FEATURE_BITMAP_OFFSET)) {
|
||||||
rv = st->ss->write_bitmap(st, di->fd, NodeNumUpdate);
|
rv = st->ss->write_bitmap(st, di->fd, NodeNumUpdate);
|
||||||
} else if (rv == 0 &&
|
} else if (rv == 0 &&
|
||||||
(__le32_to_cpu(sb->feature_map) & MD_FEATURE_PPL)) {
|
(__le32_to_cpu(sb->feature_map) & MD_FEATURE_PPL)) {
|
||||||
|
@ -2014,8 +2078,7 @@ static int write_init_super1(struct supertype *st)
|
||||||
}
|
}
|
||||||
error_out:
|
error_out:
|
||||||
if (rv)
|
if (rv)
|
||||||
pr_err("Failed to write metadata to %s\n",
|
pr_err("Failed to write metadata to %s\n", di->devname);
|
||||||
di->devname);
|
|
||||||
out:
|
out:
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -2080,7 +2143,8 @@ static int load_super1(struct supertype *st, int fd, char *devname)
|
||||||
/* guess... choose latest ctime */
|
/* guess... choose latest ctime */
|
||||||
memset(&tst, 0, sizeof(tst));
|
memset(&tst, 0, sizeof(tst));
|
||||||
tst.ss = &super1;
|
tst.ss = &super1;
|
||||||
for (tst.minor_version = 0; tst.minor_version <= 2 ; tst.minor_version++) {
|
for (tst.minor_version = 0; tst.minor_version <= 2;
|
||||||
|
tst.minor_version++) {
|
||||||
switch(load_super1(&tst, fd, devname)) {
|
switch(load_super1(&tst, fd, devname)) {
|
||||||
case 0: super = tst.sb;
|
case 0: super = tst.sb;
|
||||||
if (bestvers == -1 ||
|
if (bestvers == -1 ||
|
||||||
|
@ -2167,7 +2231,8 @@ static int load_super1(struct supertype *st, int fd, char *devname)
|
||||||
if (__le32_to_cpu(super->magic) != MD_SB_MAGIC) {
|
if (__le32_to_cpu(super->magic) != MD_SB_MAGIC) {
|
||||||
if (devname)
|
if (devname)
|
||||||
pr_err("No super block found on %s (Expected magic %08x, got %08x)\n",
|
pr_err("No super block found on %s (Expected magic %08x, got %08x)\n",
|
||||||
devname, MD_SB_MAGIC, __le32_to_cpu(super->magic));
|
devname, MD_SB_MAGIC,
|
||||||
|
__le32_to_cpu(super->magic));
|
||||||
free(super);
|
free(super);
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
@ -2190,7 +2255,8 @@ static int load_super1(struct supertype *st, int fd, char *devname)
|
||||||
|
|
||||||
bsb = (struct bitmap_super_s *)(((char*)super)+MAX_SB_SIZE);
|
bsb = (struct bitmap_super_s *)(((char*)super)+MAX_SB_SIZE);
|
||||||
|
|
||||||
misc = (struct misc_dev_info*) (((char*)super)+MAX_SB_SIZE+BM_SUPER_SIZE);
|
misc = (struct misc_dev_info*)
|
||||||
|
(((char*)super)+MAX_SB_SIZE+BM_SUPER_SIZE);
|
||||||
misc->device_size = dsize;
|
misc->device_size = dsize;
|
||||||
if (st->data_offset == INVALID_SECTORS)
|
if (st->data_offset == INVALID_SECTORS)
|
||||||
st->data_offset = __le64_to_cpu(super->data_offset);
|
st->data_offset = __le64_to_cpu(super->data_offset);
|
||||||
|
@ -2230,13 +2296,11 @@ static struct supertype *match_metadata_desc1(char *arg)
|
||||||
/* leading zeros can be safely ignored. --detail generates them. */
|
/* leading zeros can be safely ignored. --detail generates them. */
|
||||||
while (*arg == '0')
|
while (*arg == '0')
|
||||||
arg++;
|
arg++;
|
||||||
if (strcmp(arg, "1.0") == 0 ||
|
if (strcmp(arg, "1.0") == 0 || strcmp(arg, "1.00") == 0) {
|
||||||
strcmp(arg, "1.00") == 0) {
|
|
||||||
st->minor_version = 0;
|
st->minor_version = 0;
|
||||||
return st;
|
return st;
|
||||||
}
|
}
|
||||||
if (strcmp(arg, "1.1") == 0 ||
|
if (strcmp(arg, "1.1") == 0 || strcmp(arg, "1.01") == 0
|
||||||
strcmp(arg, "1.01") == 0
|
|
||||||
) {
|
) {
|
||||||
st->minor_version = 1;
|
st->minor_version = 1;
|
||||||
return st;
|
return st;
|
||||||
|
@ -2249,8 +2313,7 @@ static struct supertype *match_metadata_desc1(char *arg)
|
||||||
st->minor_version = 2;
|
st->minor_version = 2;
|
||||||
return st;
|
return st;
|
||||||
}
|
}
|
||||||
if (strcmp(arg, "1") == 0 ||
|
if (strcmp(arg, "1") == 0 || strcmp(arg, "default") == 0) {
|
||||||
strcmp(arg, "default") == 0) {
|
|
||||||
st->minor_version = -1;
|
st->minor_version = -1;
|
||||||
return st;
|
return st;
|
||||||
}
|
}
|
||||||
|
@ -2348,20 +2411,26 @@ add_internal_bitmap1(struct supertype *st,
|
||||||
int uuid[4];
|
int uuid[4];
|
||||||
|
|
||||||
if (__le64_to_cpu(sb->data_size) == 0)
|
if (__le64_to_cpu(sb->data_size) == 0)
|
||||||
/* Must be creating the array, else data_size would be non-zero */
|
/*
|
||||||
|
* Must be creating the array, else data_size
|
||||||
|
* would be non-zero
|
||||||
|
*/
|
||||||
creating = 1;
|
creating = 1;
|
||||||
switch(st->minor_version) {
|
switch(st->minor_version) {
|
||||||
case 0:
|
case 0:
|
||||||
/* either 3K after the superblock (when hot-add),
|
/*
|
||||||
|
* either 3K after the superblock (when hot-add),
|
||||||
* or some amount of space before.
|
* or some amount of space before.
|
||||||
*/
|
*/
|
||||||
if (creating) {
|
if (creating) {
|
||||||
/* We are creating array, so we *know* how much room has
|
/*
|
||||||
|
* We are creating array, so we *know* how much room has
|
||||||
* been left.
|
* been left.
|
||||||
*/
|
*/
|
||||||
offset = 0;
|
offset = 0;
|
||||||
bbl_size = 8;
|
bbl_size = 8;
|
||||||
room = choose_bm_space(__le64_to_cpu(sb->size)) + bbl_size;
|
room =
|
||||||
|
choose_bm_space(__le64_to_cpu(sb->size)) + bbl_size;
|
||||||
} else {
|
} else {
|
||||||
room = __le64_to_cpu(sb->super_offset)
|
room = __le64_to_cpu(sb->super_offset)
|
||||||
- __le64_to_cpu(sb->data_offset)
|
- __le64_to_cpu(sb->data_offset)
|
||||||
|
@ -2373,8 +2442,8 @@ add_internal_bitmap1(struct supertype *st,
|
||||||
if (bbl_size < -bbl_offset)
|
if (bbl_size < -bbl_offset)
|
||||||
bbl_size = -bbl_offset;
|
bbl_size = -bbl_offset;
|
||||||
|
|
||||||
if (!may_change || (room < 3*2 &&
|
if (!may_change ||
|
||||||
__le32_to_cpu(sb->max_dev) <= 384)) {
|
(room < 3*2 && __le32_to_cpu(sb->max_dev) <= 384)) {
|
||||||
room = 3*2;
|
room = 3*2;
|
||||||
offset = 1*2;
|
offset = 1*2;
|
||||||
bbl_size = 0;
|
bbl_size = 0;
|
||||||
|
@ -2388,13 +2457,15 @@ add_internal_bitmap1(struct supertype *st,
|
||||||
if (creating) {
|
if (creating) {
|
||||||
offset = 4*2;
|
offset = 4*2;
|
||||||
bbl_size = 8;
|
bbl_size = 8;
|
||||||
room = choose_bm_space(__le64_to_cpu(sb->size)) + bbl_size;
|
room =
|
||||||
|
choose_bm_space(__le64_to_cpu(sb->size)) + bbl_size;
|
||||||
} else {
|
} else {
|
||||||
room = __le64_to_cpu(sb->data_offset)
|
room = __le64_to_cpu(sb->data_offset)
|
||||||
- __le64_to_cpu(sb->super_offset);
|
- __le64_to_cpu(sb->super_offset);
|
||||||
bbl_size = __le16_to_cpu(sb->bblog_size);
|
bbl_size = __le16_to_cpu(sb->bblog_size);
|
||||||
if (bbl_size)
|
if (bbl_size)
|
||||||
room = __le32_to_cpu(sb->bblog_offset) + bbl_size;
|
room =
|
||||||
|
__le32_to_cpu(sb->bblog_offset) + bbl_size;
|
||||||
else
|
else
|
||||||
bbl_size = 8;
|
bbl_size = 8;
|
||||||
|
|
||||||
|
@ -2453,8 +2524,8 @@ add_internal_bitmap1(struct supertype *st,
|
||||||
|
|
||||||
sb->bitmap_offset = (int32_t)__cpu_to_le32(offset);
|
sb->bitmap_offset = (int32_t)__cpu_to_le32(offset);
|
||||||
|
|
||||||
sb->feature_map = __cpu_to_le32(__le32_to_cpu(sb->feature_map)
|
sb->feature_map = __cpu_to_le32(__le32_to_cpu(sb->feature_map) |
|
||||||
| MD_FEATURE_BITMAP_OFFSET);
|
MD_FEATURE_BITMAP_OFFSET);
|
||||||
memset(bms, 0, sizeof(*bms));
|
memset(bms, 0, sizeof(*bms));
|
||||||
bms->magic = __cpu_to_le32(BITMAP_MAGIC);
|
bms->magic = __cpu_to_le32(BITMAP_MAGIC);
|
||||||
bms->version = __cpu_to_le32(major);
|
bms->version = __cpu_to_le32(major);
|
||||||
|
@ -2466,8 +2537,8 @@ add_internal_bitmap1(struct supertype *st,
|
||||||
bms->write_behind = __cpu_to_le32(write_behind);
|
bms->write_behind = __cpu_to_le32(write_behind);
|
||||||
bms->nodes = __cpu_to_le32(st->nodes);
|
bms->nodes = __cpu_to_le32(st->nodes);
|
||||||
if (st->nodes)
|
if (st->nodes)
|
||||||
sb->feature_map = __cpu_to_le32(__le32_to_cpu(sb->feature_map)
|
sb->feature_map = __cpu_to_le32(__le32_to_cpu(sb->feature_map) |
|
||||||
| MD_FEATURE_BITMAP_VERSIONED);
|
MD_FEATURE_BITMAP_VERSIONED);
|
||||||
if (st->cluster_name) {
|
if (st->cluster_name) {
|
||||||
len = sizeof(bms->cluster_name);
|
len = sizeof(bms->cluster_name);
|
||||||
strncpy((char *)bms->cluster_name, st->cluster_name, len);
|
strncpy((char *)bms->cluster_name, st->cluster_name, len);
|
||||||
|
@ -2528,31 +2599,43 @@ static int write_bitmap1(struct supertype *st, int fd, enum bitmap_update update
|
||||||
break;
|
break;
|
||||||
case NodeNumUpdate:
|
case NodeNumUpdate:
|
||||||
/* cluster md only supports superblock 1.2 now */
|
/* cluster md only supports superblock 1.2 now */
|
||||||
if (st->minor_version != 2 && bms->version == BITMAP_MAJOR_CLUSTERED) {
|
if (st->minor_version != 2 &&
|
||||||
|
bms->version == BITMAP_MAJOR_CLUSTERED) {
|
||||||
pr_err("Warning: cluster md only works with superblock 1.2\n");
|
pr_err("Warning: cluster md only works with superblock 1.2\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bms->version == BITMAP_MAJOR_CLUSTERED) {
|
if (bms->version == BITMAP_MAJOR_CLUSTERED) {
|
||||||
if (__cpu_to_le32(st->nodes) < bms->nodes) {
|
if (__cpu_to_le32(st->nodes) < bms->nodes) {
|
||||||
/* Since the nodes num is not increased, no need to check the space
|
/*
|
||||||
* is enough or not, just update bms->nodes */
|
* Since the nodes num is not increased, no
|
||||||
|
* need to check the space enough or not,
|
||||||
|
* just update bms->nodes
|
||||||
|
*/
|
||||||
bms->nodes = __cpu_to_le32(st->nodes);
|
bms->nodes = __cpu_to_le32(st->nodes);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* no need to change bms->nodes for other bitmap types */
|
/*
|
||||||
|
* no need to change bms->nodes for other
|
||||||
|
* bitmap types
|
||||||
|
*/
|
||||||
if (st->nodes)
|
if (st->nodes)
|
||||||
pr_err("Warning: --nodes option is only suitable for clustered bitmap\n");
|
pr_err("Warning: --nodes option is only suitable for clustered bitmap\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Each node has an independent bitmap, it is necessary to calculate the
|
/*
|
||||||
* space is enough or not, first get how many bytes for the total bitmap */
|
* Each node has an independent bitmap, it is necessary to
|
||||||
|
* calculate the space is enough or not, first get how many
|
||||||
|
* bytes for the total bitmap
|
||||||
|
*/
|
||||||
bm_space_per_node = calc_bitmap_size(bms, 4096);
|
bm_space_per_node = calc_bitmap_size(bms, 4096);
|
||||||
|
|
||||||
total_bm_space = 512 * (__le64_to_cpu(sb->data_offset) - __le64_to_cpu(sb->super_offset));
|
total_bm_space = 512 * (__le64_to_cpu(sb->data_offset) -
|
||||||
total_bm_space = total_bm_space - 4096; /* leave another 4k for superblock */
|
__le64_to_cpu(sb->super_offset));
|
||||||
|
/* leave another 4k for superblock */
|
||||||
|
total_bm_space = total_bm_space - 4096;
|
||||||
|
|
||||||
if (bm_space_per_node * st->nodes > total_bm_space) {
|
if (bm_space_per_node * st->nodes > total_bm_space) {
|
||||||
pr_err("Warning: The max num of nodes can't exceed %llu\n",
|
pr_err("Warning: The max num of nodes can't exceed %llu\n",
|
||||||
|
|
Loading…
Reference in New Issue