docs
[mirrors/Programs.git] / c / mdraid-gen / mdraid.c
index 8a600529fcf1d2941b2227689f45ff1c27908b97..5f2720ef4d605e3f6372dd718b6e29a17c0b7adb 100644 (file)
@@ -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 <cstddef>
@@ -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);
 }
This page took 0.144339 seconds and 4 git commands to generate.