Fixed alignment issues
[mirrors/Programs.git] / c / mdraid-gen / mdraid.c
index 7c946ca8b48de87b10a721b5c30bc6d9b9b17ea5..862237b25516207e57361eefe61a0d330998e4f5 100644 (file)
@@ -6,6 +6,9 @@ make mdraid
 ./mdraid > test.img
 mdadm --examine test.img
 
+losetup /dev/loop1 test.img
+mdadm --assemble md /dev/loop1
+
 */
 
 //#include <cstddef>
@@ -56,6 +59,8 @@ static unsigned int calc_sb_1_csum(struct mdp_superblock_1 * sb)
 }
 
 int main() {
+       size_t data_size = 8192; //512B sectors (should be divisible by 8 sectors to keep 4kB alignment)
+
        srand(time(NULL)); //FIXME: Seed UUID properly
 
        struct mdp_superblock_1 sb = {0};
@@ -68,23 +73,23 @@ int main() {
 
        //TODO: set these
        random_uuid(sb.set_uuid);       /* user-space generated. U8[16]*/
-       memcpy(sb.set_name, "localhost:777", 6);        /* set and interpreted by user-space. CHAR[32] */
+       memcpy(sb.set_name, "localhost:7", 12); /* set and interpreted by user-space. CHAR[32] */
        sb.ctime=0;             /* lo 40 bits are seconds, top 24 are microseconds or 0*/
 
        sb.level=1;             /* -4 (multipath), -1 (linear), 0,1,4,5 */
-       sb.layout=2;            /* only for raid5 and raid10 currently */
-       sb.size;                /* used size of component devices, in 512byte sectors */
+       //sb.layout=2;          /* only for raid5 and raid10 currently */
+       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;
-       sb.bitmap_offset=0;     /* sectors after start of superblock that bitmap starts
+       sb.bitmap_offset=8;     /* sectors after start of superblock that bitmap starts
                                         * NOTE: signed, so bitmap can be before superblock
                                         * only meaningful of feature_map[0] is set.
                                         */
 
        /* constant this-device information - 64 bytes */
-       sb.data_offset=4096+sizeof(sb); /* sector start of data, often 0 */
-       sb.data_size;   /* sectors in this device that can be used for data */
+       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 */
 
        sb.dev_number=0;        /* permanent identifier of this  device - not role in raid */
@@ -98,7 +103,7 @@ int main() {
        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.
@@ -113,7 +118,14 @@ int main() {
        sb.sb_csum=calc_sb_1_csum(&sb);
 
        //printf("Superblock\n");
-       for(int i=0;i<4096;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<40960;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.156455 seconds and 4 git commands to generate.