X-Git-Url: http://git.harvie.cz/?a=blobdiff_plain;f=c%2Fmdraid-gen%2Fmdraid.c;h=5f2720ef4d605e3f6372dd718b6e29a17c0b7adb;hb=HEAD;hp=8a600529fcf1d2941b2227689f45ff1c27908b97;hpb=30d358cd5a66ea85b06729df8fa13a068ac21d51;p=mirrors%2FPrograms.git diff --git a/c/mdraid-gen/mdraid.c b/c/mdraid-gen/mdraid.c index 8a60052..5f2720e 100644 --- a/c/mdraid-gen/mdraid.c +++ b/c/mdraid-gen/mdraid.c @@ -9,6 +9,10 @@ mdadm --examine test.img losetup /dev/loop1 test.img mdadm --assemble md /dev/loop1 +Some docs: +https://raid.wiki.kernel.org/index.php/RAID_superblock_formats#Sub-versions_of_the_version-1_superblock +https://docs.huihoo.com/doxygen/linux/kernel/3.7/md__p_8h_source.html + */ //#include @@ -59,7 +63,9 @@ static unsigned int calc_sb_1_csum(struct mdp_superblock_1 * sb) } int main() { - size_t data_size = 10000; //512B sectors + //printf("Superblock\n"); + + size_t data_size = 8192; //512B sectors (should be divisible by 8 sectors to keep 4kB alignment) srand(time(NULL)); //FIXME: Seed UUID properly @@ -68,7 +74,7 @@ int main() { /* constant array information - 128 bytes */ sb.magic = 0xa92b4efc; /* MD_SB_MAGIC: 0xa92b4efc - little endian */ sb.major_version = 1; /* 1 */ - sb.feature_map = 0; /* bit 0 set if 'bitmap_offset' is meaningful */ + sb.feature_map = 0; //MD_FEATURE_BITMAP_OFFSET; /* bit 0 set if 'bitmap_offset' is meaningful */ //FIXME: internal bitmap bit is not seen by mdadm???? sb.pad0 = 0; /* always set to 0 when writing */ //TODO: set these @@ -78,7 +84,7 @@ int main() { sb.level=1; /* -4 (multipath), -1 (linear), 0,1,4,5 */ //sb.layout=2; /* only for raid5 and raid10 currently */ - sb.size=data_size+128; /* used size of component devices, in 512byte sectors */ + sb.size=data_size; /* used size of component devices, in 512byte sectors */ sb.chunksize=0; /* in 512byte sectors - not used in raid 1 */ sb.raid_disks=1; @@ -88,7 +94,7 @@ int main() { */ /* constant this-device information - 64 bytes */ - sb.data_offset=128; /* sector start of data, often 0 */ + sb.data_offset=2048; /* sector start of data, often 0 */ sb.data_size=data_size; /* sectors in this device that can be used for data */ sb.super_offset=8; /* sector start of this superblock */ @@ -99,11 +105,19 @@ int main() { //#define WriteMostly1 1 /* mask for writemostly flag in above */ //#define FailFast1 2 /* Should avoid retries and fixups and just fail */ + /* Bad block log. If there are any bad blocks the feature flag is set. + * If offset and size are non-zero, that space is reserved and available + */ + sb.bblog_shift=9; /* shift from sectors to block size */ //FIXME: not sure with this! + sb.bblog_size=8; /* number of sectors reserved for list */ + sb.bblog_offset=16; /* sector offset from superblock to bblog, + * signed - not unsigned */ + /* array state information - 64 bytes */ sb.utime=0; /* 40 bits second, 24 bits microseconds */ sb.events=0; /* incremented when superblock updated */ sb.resync_offset=0; /* data before this offset (from data_offset) known to be in sync */ - sb.max_dev=1; /* size of devs[] array to consider */ + sb.max_dev=sb.raid_disks; /* size of devs[] array to consider */ //__u8 pad3[64-32]; /* set to 0 when writing */ /* device state information. Indexed by dev_number. @@ -115,12 +129,16 @@ int main() { //__le16 dev_roles[]; /* role in array, or 0xffff for a spare, or 0xfffe for faulty */ + //Calculate checksum sb.sb_csum=calc_sb_1_csum(&sb); - //printf("Superblock\n"); - for(int i=0;i<(8*512);i++) putc(0, stdout); + //Empty space before metadata (sector 0 - 7) + for(int i=0;i<(sb.super_offset*512);i++) putc(0, stdout); + + //Superblock and padding (sector 8 - 2048) fwrite(&sb, sizeof(sb), 1, stdout); - for(int i=0;i<((120*512)-sizeof(sb));i++) putc(0, stdout); + for(int i=0;i<(((sb.data_offset-sb.super_offset)*512)-sizeof(sb));i++) putc(0, stdout); + //Data (N sectors) for(int i=0;i<(data_size*512);i++) putc(0, stdout); }