2
2
* mdadm - manage Linux "md" devices aka RAID arrays.
4
* Copyright (C) 2001-2006 Neil Brown <neilb@suse.de>
4
* Copyright (C) 2001-2009 Neil Brown <neilb@suse.de>
7
7
* This program is free software; you can redistribute it and/or modify
19
19
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
21
* Author: Neil Brown
22
* Email: <neilb@cse.unsw.edu.au>
24
* School of Computer Science and Engineering
25
* The University of New South Wales
22
* Email: <neilb@suse.de>
30
25
#define HAVE_STDINT_H 1
56
void super0_swap_endian(struct mdp_superblock_s *sb)
51
static void super0_swap_endian(struct mdp_superblock_s *sb)
58
53
/* as super0 superblocks are host-endian, it is sometimes
59
54
* useful to be able to swap the endianness
90
85
mdp_super_t *sb = st->sb;
95
91
printf(" Magic : %08x\n", sb->md_magic);
96
printf(" Version : %02d.%02d.%02d\n", sb->major_version, sb->minor_version,
92
printf(" Version : %d.%02d.%02d\n", sb->major_version, sb->minor_version,
97
93
sb->patch_version);
98
94
if (sb->minor_version >= 90) {
99
95
printf(" UUID : %08x:%08x:%08x:%08x", sb->set_uuid0, sb->set_uuid1,
117
113
printf(" Creation Time : %.24s\n", ctime(&atime));
118
114
c=map_num(pers, sb->level);
119
115
printf(" Raid Level : %s\n", c?c:"-unknown-");
120
if ((int)sb->level >= 0) {
116
if ((int)sb->level > 0) {
122
118
printf(" Used Dev Size : %d%s\n", sb->size,
123
119
human_size((long long)sb->size<<10));
140
136
printf(" Reshape pos'n : %llu%s\n", (unsigned long long)sb->reshape_position/2, human_size((long long)sb->reshape_position<<9));
141
137
if (sb->delta_disks) {
142
138
printf(" Delta Devices : %d", sb->delta_disks);
144
printf(" (%d->%d)\n", sb->raid_disks-sb->delta_disks, sb->raid_disks);
146
printf(" (%d->%d)\n", sb->raid_disks, sb->raid_disks+sb->delta_disks);
139
printf(" (%d->%d)\n", sb->raid_disks-sb->delta_disks, sb->raid_disks);
140
if (((int)sb->delta_disks) < 0)
141
delta_extra = - sb->delta_disks;
148
143
if (sb->new_level != sb->level) {
149
144
c = map_num(pers, sb->new_level);
154
149
c = map_num(r5layout, sb->new_layout);
155
150
printf(" New Layout : %s\n", c?c:"-unknown-");
152
if (sb->level == 6) {
153
c = map_num(r6layout, sb->new_layout);
154
printf(" New Layout : %s\n", c?c:"-unknown-");
157
156
if (sb->level == 10) {
158
157
printf(" New Layout : near=%d, %s=%d\n",
159
158
sb->new_layout&255,
187
186
c = map_num(r5layout, sb->layout);
188
187
printf(" Layout : %s\n", c?c:"-unknown-");
189
if (sb->level == 6) {
190
c = map_num(r6layout, sb->layout);
191
printf(" Layout : %s\n", c?c:"-unknown-");
190
193
if (sb->level == 10) {
191
printf(" Layout : near=%d, %s=%d\n",
193
(sb->layout&0x10000)?"offset":"far",
194
(sb->layout>>8)&255);
195
print_r10_layout(sb->layout);
196
198
switch(sb->level) {
236
static void brief_examine_super0(struct supertype *st)
238
static void brief_examine_super0(struct supertype *st, int verbose)
238
240
mdp_super_t *sb = st->sb;
239
241
char *c=map_num(pers, sb->level);
242
244
sprintf(devname, "/dev/md%d", sb->md_minor);
244
printf("ARRAY %s level=%s num-devices=%d UUID=",
246
c?c:"-unknown-", sb->raid_disks);
247
printf("ARRAY %s level=%s num-devices=%d",
249
c?c:"-unknown-", sb->raid_disks);
251
printf("ARRAY %s", devname);
247
253
if (sb->minor_version >= 90)
248
printf("%08x:%08x:%08x:%08x", sb->set_uuid0, sb->set_uuid1,
254
printf(" UUID=%08x:%08x:%08x:%08x", sb->set_uuid0, sb->set_uuid1,
249
255
sb->set_uuid2, sb->set_uuid3);
251
printf("%08x", sb->set_uuid0);
257
printf(" UUID=%08x", sb->set_uuid0);
302
308
printf("%08x", sb->set_uuid0);
305
static void export_detail_super0(struct supertype *st)
307
mdp_super_t *sb = st->sb;
309
if (sb->minor_version >= 90)
310
printf("%08x:%08x:%08x:%08x", sb->set_uuid0, sb->set_uuid1,
311
sb->set_uuid2, sb->set_uuid3);
313
printf("%08x", sb->set_uuid0);
318
312
static int match_home0(struct supertype *st, char *homehost)
320
314
mdp_super_t *sb = st->sb;
322
char *hash = sha1_buffer(homehost,
320
hash = sha1_buffer(homehost,
326
324
return (memcmp(&sb->set_uuid2, hash, 8)==0);
369
367
info->events = md_event(sb);
370
368
info->data_offset = 0;
370
sprintf(info->text_version, "0.%d", sb->minor_version);
371
info->safe_mode_delay = 200;
372
373
uuid_from_super0(st, info->uuid);
375
info->recovery_start = MaxSector;
374
376
if (sb->minor_version > 90 && (sb->reshape_position+1) != 0) {
375
377
info->reshape_active = 1;
376
378
info->reshape_progress = sb->reshape_position;
378
380
info->delta_disks = sb->delta_disks;
379
381
info->new_layout = sb->new_layout;
380
382
info->new_chunk = sb->new_chunk;
383
if (info->delta_disks < 0)
384
info->array.raid_disks -= info->delta_disks;
382
386
info->reshape_active = 0;
385
389
/* work_disks is calculated rather than read directly */
386
390
for (i=0; i < MD_SB_DISKS; i++)
387
391
if ((sb->disks[i].state & (1<<MD_DISK_SYNC)) &&
388
(sb->disks[i].raid_disk < info->array.raid_disks) &&
392
(sb->disks[i].raid_disk < (unsigned)info->array.raid_disks) &&
389
393
(sb->disks[i].state & (1<<MD_DISK_ACTIVE)) &&
390
394
!(sb->disks[i].state & (1<<MD_DISK_FAULTY)))
423
427
devname, info->array.md_minor);
425
429
if (strcmp(update, "summaries") == 0) {
427
431
/* set nr_disks, active_disks, working_disks,
428
432
* failed_disks, spare_disks based on disks[]
429
433
* array in superblock.
475
479
if (strcmp(update, "assemble")==0) {
476
480
int d = info->disk.number;
477
481
int wonly = sb->disks[d].state & (1<<MD_DISK_WRITEMOSTLY);
478
if ((sb->disks[d].state & ~(1<<MD_DISK_WRITEMOSTLY))
479
!= info->disk.state) {
482
int mask = (1<<MD_DISK_WRITEMOSTLY);
484
if (sb->minor_version >= 91)
485
/* During reshape we don't insist on everything
486
* being marked 'sync'
488
add = (1<<MD_DISK_SYNC);
489
if (((sb->disks[d].state & ~mask) | add)
490
!= (unsigned)info->disk.state) {
480
491
sb->disks[d].state = info->disk.state | wonly;
552
563
unsigned long long size, char *ignored_name, char *homehost,
555
mdp_super_t *sb = malloc(MD_SB_BYTES + sizeof(bitmap_super_t));
569
if (posix_memalign((void**)&sb, 4096,
570
MD_SB_BYTES + ROUND_UP(sizeof(bitmap_super_t), 4096)) != 0) {
571
fprintf(stderr, Name ": %s could not allocate superblock\n", __func__);
557
574
memset(sb, 0, MD_SB_BYTES + sizeof(bitmap_super_t));
560
if (info->major_version == -1) {
561
578
/* zeroing the superblock */
646
mdu_disk_info_t disk;
647
struct devinfo *next;
626
651
/* Add a device to the superblock being created */
627
static void add_to_super0(struct supertype *st, mdu_disk_info_t *dinfo)
652
static int add_to_super0(struct supertype *st, mdu_disk_info_t *dinfo,
653
int fd, char *devname)
629
655
mdp_super_t *sb = st->sb;
630
656
mdp_disk_t *dk = &sb->disks[dinfo->number];
657
struct devinfo *di, **dip;
632
659
dk->number = dinfo->number;
633
660
dk->major = dinfo->major;
634
661
dk->minor = dinfo->minor;
635
662
dk->raid_disk = dinfo->raid_disk;
636
663
dk->state = dinfo->state;
665
sb->this_disk = sb->disks[dinfo->number];
666
sb->sb_csum = calc_sb0_csum(sb);
668
dip = (struct devinfo **)&st->info;
671
di = malloc(sizeof(struct devinfo));
673
di->devname = devname;
639
682
static int store_super0(struct supertype *st, int fd)
661
704
if (super->state & (1<<MD_SB_BITMAP_PRESENT)) {
662
705
struct bitmap_super_s * bm = (struct bitmap_super_s*)(super+1);
663
706
if (__le32_to_cpu(bm->magic) == BITMAP_MAGIC)
664
if (write(fd, bm, sizeof(*bm)) != sizeof(*bm))
707
if (write(fd, bm, ROUND_UP(sizeof(*bm),4096)) !=
708
ROUND_UP(sizeof(*bm),4096))
672
static int write_init_super0(struct supertype *st,
673
mdu_disk_info_t *dinfo, char *devname)
717
static int write_init_super0(struct supertype *st)
675
719
mdp_super_t *sb = st->sb;
676
int fd = open(devname, O_RDWR|O_EXCL);
680
fprintf(stderr, Name ": Failed to open %s to write superblock\n", devname);
723
for (di = st->info ; di && ! rv ; di = di->next) {
725
if (di->disk.state == 1)
729
while (Kill(di->devname, NULL, 0, 1, 1) == 0)
732
sb->disks[di->disk.number].state &= ~(1<<MD_DISK_FAULTY);
734
sb->this_disk = sb->disks[di->disk.number];
735
sb->sb_csum = calc_sb0_csum(sb);
736
rv = store_super0(st, di->fd);
738
if (rv == 0 && (sb->state & (1<<MD_SB_BITMAP_PRESENT)))
739
rv = st->ss->write_bitmap(st, di->fd);
743
Name ": failed to write superblock to %s\n",
684
sb->disks[dinfo->number].state &= ~(1<<MD_DISK_FAULTY);
686
sb->this_disk = sb->disks[dinfo->number];
687
sb->sb_csum = calc_sb0_csum(sb);
688
rv = store_super0(st, fd);
690
if (rv == 0 && (sb->state & (1<<MD_SB_BITMAP_PRESENT)))
691
rv = st->ss->write_bitmap(st, fd);
695
fprintf(stderr, Name ": failed to write superblock to %s\n", devname);
699
752
static int compare_super0(struct supertype *st, struct supertype *tst)
712
765
if (second->md_magic != MD_SB_MAGIC)
715
first = malloc(MD_SB_BYTES + sizeof(struct bitmap_super_s));
768
if (posix_memalign((void**)&first, 4096,
770
ROUND_UP(sizeof(struct bitmap_super_s), 4096)) != 0) {
772
": %s could not allocate superblock\n", __func__);
716
775
memcpy(first, second, MD_SB_BYTES + sizeof(struct bitmap_super_s));
781
super = malloc(MD_SB_BYTES + sizeof(bitmap_super_t));
843
if (posix_memalign((void**)&super, 4096,
845
ROUND_UP(sizeof(bitmap_super_t), 4096)) != 0) {
847
": %s could not allocate superblock\n", __func__);
783
851
if (read(fd, super, sizeof(*super)) != MD_SB_BYTES) {
821
890
* valid. If it doesn't clear the bit. An --assemble --force
822
891
* should get that written out.
824
if (read(fd, super+1, sizeof(struct bitmap_super_s))
825
!= sizeof(struct bitmap_super_s))
893
if (read(fd, super+1, ROUND_UP(sizeof(struct bitmap_super_s),4096))
894
!= ROUND_UP(sizeof(struct bitmap_super_s),4096))
828
897
uuid_from_super0(st, uuid);
843
912
struct supertype *st = malloc(sizeof(*st));
844
913
if (!st) return st;
915
memset(st, 0, sizeof(*st));
846
916
st->ss = &super0;
847
918
st->minor_version = 90;
848
919
st->max_devs = MD_SB_DISKS;
921
/* we sometimes get 00.90 */
922
while (arg[0] == '0' && arg[1] == '0')
850
924
if (strcmp(arg, "0") == 0 ||
925
#ifdef DEFAULT_OLD_METADATA /* ifndef in super1.c */
926
strcmp(arg, "default") == 0 ||
927
#endif /* DEFAULT_OLD_METADATA */
851
928
strcmp(arg, "0.90") == 0 ||
852
strcmp(arg, "0.91") == 0 ||
853
strcmp(arg, "default") == 0 ||
854
strcmp(arg, "") == 0 /* no metadata */
929
strcmp(arg, "") == 0 /* no metadata - i.e. non_persistent */
933
st->minor_version = 91; /* reshape in progress */
934
if (strcmp(arg, "0.91") == 0) /* For dup_super support */
858
937
st->minor_version = 9; /* flag for 'byte-swapped' */
859
938
if (strcmp(arg, "0.swap")==0 ||
860
939
strcmp(arg, "0.9") == 0) /* For dup_super support */
883
962
* size is in sectors, chunk is in bytes !!!
885
964
unsigned long long bits;
886
unsigned long long max_bits = 60*1024*8;
965
unsigned long long max_bits = (60*1024 - sizeof(bitmap_super_t))*8;
887
966
unsigned long long min_chunk;
888
967
int chunk = *chunkp;
889
968
mdp_super_t *sb = st->sb;
897
976
bits = (bits+1)/2;
978
if (chunk == UnSet) {
979
/* A chunk size less than a few Megabytes gives poor
980
* performance without increasing resync noticeably
900
982
chunk = min_chunk;
901
else if (chunk < min_chunk)
983
if (chunk < 64*1024*1024)
984
chunk = 64*1024*1024;
985
} else if ((unsigned long long)chunk < min_chunk)
902
986
return 0; /* chunk size too small */
904
988
sb->state |= (1<<MD_SB_BITMAP_PRESENT);
919
void locate_bitmap0(struct supertype *st, int fd)
1003
static void locate_bitmap0(struct supertype *st, int fd)
921
1005
unsigned long long dsize;
922
1006
unsigned long long offset;
936
1020
lseek64(fd, offset, 0);
939
int write_bitmap0(struct supertype *st, int fd)
1023
static int write_bitmap0(struct supertype *st, int fd)
941
1025
unsigned long long dsize;
942
1026
unsigned long long offset;
961
1046
if (lseek64(fd, offset + 4096, 0)< 0LL)
965
if (write(fd, ((char*)sb)+MD_SB_BYTES, sizeof(bitmap_super_t)) !=
966
sizeof(bitmap_super_t))
968
towrite = 64*1024 - MD_SB_BYTES - sizeof(bitmap_super_t);
969
memset(buf, 0xff, sizeof(buf));
1049
memset(buf, 0xff, 4096);
1050
memcpy(buf, ((char*)sb)+MD_SB_BYTES, sizeof(bitmap_super_t));
970
1052
while (towrite > 0) {
974
1056
n = write(fd, buf, n);
1061
memset(buf, 0xff, 4096);
1078
static int validate_geometry0(struct supertype *st, int level,
1079
int layout, int raiddisks,
1080
int chunk, unsigned long long size,
1081
char *subdev, unsigned long long *freesize,
1084
unsigned long long ldsize;
1087
if (level == LEVEL_CONTAINER) {
1089
fprintf(stderr, Name ": 0.90 metadata does not support containers\n");
1092
if (raiddisks > MD_SB_DISKS) {
1094
fprintf(stderr, Name ": 0.90 metadata supports at most %d devices per array\n",
1098
if (size > (0x7fffffffULL<<9)) {
1100
fprintf(stderr, Name ": 0.90 metadata supports at most 2 terrabytes per device\n");
1106
fd = open(subdev, O_RDONLY|O_EXCL, 0);
1109
fprintf(stderr, Name ": super0.90 cannot open %s: %s\n",
1110
subdev, strerror(errno));
1114
if (!get_dev_size(fd, subdev, &ldsize)) {
1120
if (ldsize < MD_RESERVED_SECTORS * 512)
1122
if (size > (0x7fffffffULL<<9))
1124
*freesize = MD_NEW_SIZE_SECTORS(ldsize >> 9);
1127
#endif /* MDASSEMBLE */
994
1129
struct superswitch super0 = {
995
1130
#ifndef MDASSEMBLE
996
1131
.examine_super = examine_super0,
998
1133
.export_examine_super = export_examine_super0,
999
1134
.detail_super = detail_super0,
1000
1135
.brief_detail_super = brief_detail_super0,
1001
.export_detail_super = export_detail_super0,
1136
.write_init_super = write_init_super0,
1137
.validate_geometry = validate_geometry0,
1138
.add_to_super = add_to_super0,
1003
1140
.match_home = match_home0,
1004
1141
.uuid_from_super = uuid_from_super0,
1005
1142
.getinfo_super = getinfo_super0,
1006
1143
.update_super = update_super0,
1007
1144
.init_super = init_super0,
1008
.add_to_super = add_to_super0,
1009
1145
.store_super = store_super0,
1010
.write_init_super = write_init_super0,
1011
1146
.compare_super = compare_super0,
1012
1147
.load_super = load_super0,
1013
1148
.match_metadata_desc = match_metadata_desc0,