]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - md_p.h
Fix RAID metadata check
[thirdparty/mdadm.git] / md_p.h
diff --git a/md_p.h b/md_p.h
index 0a0b38156fd38d3e5a6dc706fd7c8e9b0d9b8e42..0d691fbc987dc3bd9a0845a8c63d7af40cd925c7 100644 (file)
--- a/md_p.h
+++ b/md_p.h
@@ -1,15 +1,15 @@
 /*
    md_p.h : physical layout of Linux RAID devices
           Copyright (C) 1996-98 Ingo Molnar, Gadi Oxman
-         
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2, or (at your option)
    any later version.
-   
+
    You should have received a copy of the GNU General Public License
    (for example /usr/src/linux/COPYING); if not, write to the Free
-   Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  
+   Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
 #ifndef _MD_P_H
  * Device "operational" state bits
  */
 #define MD_DISK_FAULTY         0 /* disk is faulty / operational */
-#define MD_DISK_ACTIVE         1 /* disk is running or spare disk */
+#define MD_DISK_ACTIVE         1 /* disk is running but may not be in sync */
 #define MD_DISK_SYNC           2 /* disk is in sync with the raid set */
 #define MD_DISK_REMOVED                3 /* disk is in sync with the raid set */
+#define MD_DISK_CLUSTER_ADD    4 /* Initiate a disk add across the cluster
+                                  * For clustered enviroments only.
+                                  */
+#define MD_DISK_CANDIDATE      5 /* disk is added as spare (local) until confirmed
+                                  * For clustered enviroments only.
+                                  */
 
 #define        MD_DISK_WRITEMOSTLY     9 /* disk is "write-mostly" is RAID1 config.
-                                  * read requests will only be sent here in 
+                                  * read requests will only be sent here in
                                   * dire need
                                   */
 
+#define MD_DISK_REPLACEMENT    17
+#define MD_DISK_JOURNAL                18 /* disk is used as the write journal in RAID-5/6 */
+
+#define MD_DISK_ROLE_SPARE     0xffff
+#define MD_DISK_ROLE_FAULTY    0xfffe
+#define MD_DISK_ROLE_JOURNAL   0xfffd
+#define MD_DISK_ROLE_MAX       0xff00 /* max value of regular disk role */
+
 typedef struct mdp_device_descriptor_s {
        __u32 number;           /* 0 Device number in the entire set          */
        __u32 major;            /* 1 Device major number                      */
@@ -100,14 +114,18 @@ typedef struct mdp_device_descriptor_s {
  */
 #define MD_SB_CLEAN            0
 #define MD_SB_ERRORS           1
-
+#define MD_SB_BBM_ERRORS       2
+#define MD_SB_BLOCK_CONTAINER_RESHAPE 3 /* block container wide reshapes */
+#define MD_SB_BLOCK_VOLUME     4 /* block activation of array, other arrays
+                                  * in container can be activated */
+#define MD_SB_CLUSTERED                5 /* MD is clustered  */
 #define        MD_SB_BITMAP_PRESENT    8 /* bitmap may be present nearby */
 
 typedef struct mdp_superblock_s {
        /*
         * Constant generic information
         */
-       __u32 md_magic;         /*  0 MD identifier                           */
+       __u32 md_magic;         /*  0 MD identifier                           */
        __u32 major_version;    /*  1 major version to which the set conforms */
        __u32 minor_version;    /*  2 minor version ...                       */
        __u32 patch_version;    /*  3 patchlevel version ...                  */
@@ -147,7 +165,13 @@ typedef struct mdp_superblock_s {
        __u32 cp_events_hi;     /* 10 high-order of checkpoint update count   */
 #endif
        __u32 recovery_cp;      /* 11 recovery checkpoint sector count        */
-       __u32 gstate_sreserved[MD_SB_GENERIC_STATE_WORDS - 12];
+       /* There are only valid for minor_version > 90 */
+       __u64 reshape_position; /* 12,13 next address in array-space for reshape */
+       __u32 new_level;        /* 14 new level we are reshaping to           */
+       __u32 delta_disks;      /* 15 change in number of raid_disks          */
+       __u32 new_layout;       /* 16 new layout                              */
+       __u32 new_chunk;        /* 17 new chunk size (bytes)                  */
+       __u32 gstate_sreserved[MD_SB_GENERIC_STATE_WORDS - 18];
 
        /*
         * Personality information
@@ -184,5 +208,62 @@ static inline __u64 md_event(mdp_super_t *sb) {
        return (ev<<32)| sb->events_lo;
 }
 
-#endif 
+struct r5l_payload_header {
+       __u16 type;
+       __u16 flags;
+} __attribute__ ((__packed__));
+
+enum r5l_payload_type {
+       R5LOG_PAYLOAD_DATA = 0,
+       R5LOG_PAYLOAD_PARITY = 1,
+       R5LOG_PAYLOAD_FLUSH = 2,
+};
+
+struct r5l_payload_data_parity {
+       struct r5l_payload_header header;
+       __u32 size; /* sector. data/parity size. each 4k has a checksum */
+       __u64 location; /* sector. For data, it's raid sector. For
+                               parity, it's stripe sector */
+       __u32 checksum[];
+} __attribute__ ((__packed__));
 
+enum r5l_payload_data_parity_flag {
+       R5LOG_PAYLOAD_FLAG_DISCARD = 1, /* payload is discard */
+       /*
+        * RESHAPED/RESHAPING is only set when there is reshape activity. Note,
+        * both data/parity of a stripe should have the same flag set
+        *
+        * RESHAPED: reshape is running, and this stripe finished reshape
+        * RESHAPING: reshape is running, and this stripe isn't reshaped
+        * */
+       R5LOG_PAYLOAD_FLAG_RESHAPED = 2,
+       R5LOG_PAYLOAD_FLAG_RESHAPING = 3,
+};
+
+struct r5l_payload_flush {
+       struct r5l_payload_header header;
+       __u32 size; /* flush_stripes size, bytes */
+       __u64 flush_stripes[];
+} __attribute__ ((__packed__));
+
+enum r5l_payload_flush_flag {
+       R5LOG_PAYLOAD_FLAG_FLUSH_STRIPE = 1, /* data represents whole stripe */
+};
+
+struct r5l_meta_block {
+       __u32 magic;
+       __u32 checksum;
+       __u8 version;
+       __u8 __zero_pading_1;
+       __u16 __zero_pading_2;
+       __u32 meta_size; /* whole size of the block */
+
+       __u64 seq;
+       __u64 position; /* sector, start from rdev->data_offset, current position */
+       struct r5l_payload_header payloads[];
+} __attribute__ ((__packed__));
+
+#define R5LOG_VERSION 0x1
+#define R5LOG_MAGIC 0x6433c509
+
+#endif