]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - mdadm.h
main: factor out code to parse layout for raid10 and faulty.
[thirdparty/mdadm.git] / mdadm.h
diff --git a/mdadm.h b/mdadm.h
index 5be3affe073a9c2e425c1116543bd6c86d9d12fa..b0a840beac45764c07b164e972ebff847a54c759 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -146,6 +146,9 @@ struct mdinfo {
        unsigned long long      component_size; /* same as array.size, except in
                                                 * sectors and up to 64bits.
                                                 */
+       unsigned long long      custom_array_size; /* size for non-default sized
+                                                   * arrays (in sectors)
+                                                   */
        int                     reshape_active;
        unsigned long long      reshape_progress;
        unsigned long long      resync_start;
@@ -334,22 +337,24 @@ extern int map_lock(struct map_ent **melp);
 extern void map_unlock(struct map_ent **melp);
 
 /* various details can be requested */
-#define        GET_LEVEL       1
-#define        GET_LAYOUT      2
-#define        GET_COMPONENT   4
-#define        GET_CHUNK       8
-#define GET_CACHE      16
-#define        GET_MISMATCH    32
-#define        GET_VERSION     64
-#define        GET_DISKS       128
-#define        GET_DEGRADED    256
-#define        GET_SAFEMODE    512
-
-#define        GET_DEVS        1024 /* gets role, major, minor */
-#define        GET_OFFSET      2048
-#define        GET_SIZE        4096
-#define        GET_STATE       8192
-#define        GET_ERROR       16384
+enum sysfs_read_flags {
+       GET_LEVEL       = (1 << 0),
+       GET_LAYOUT      = (1 << 1),
+       GET_COMPONENT   = (1 << 2),
+       GET_CHUNK       = (1 << 3),
+       GET_CACHE       = (1 << 4),
+       GET_MISMATCH    = (1 << 5),
+       GET_VERSION     = (1 << 6),
+       GET_DISKS       = (1 << 7),
+       GET_DEGRADED    = (1 << 8),
+       GET_SAFEMODE    = (1 << 9),
+       GET_DEVS        = (1 << 10), /* gets role, major, minor */
+       GET_OFFSET      = (1 << 11),
+       GET_SIZE        = (1 << 12),
+       GET_STATE       = (1 << 13),
+       GET_ERROR       = (1 << 14),
+       SKIP_GONE_DEVS  = (1 << 15),
+};
 
 /* If fd >= 0, get the array it is open on,
  * else use devnum. >=0 -> major9. <0.....
@@ -367,9 +372,12 @@ extern int sysfs_set_num(struct mdinfo *sra, struct mdinfo *dev,
 extern int sysfs_uevent(struct mdinfo *sra, char *event);
 extern int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev,
                        char *name, unsigned long long *val);
+extern int sysfs_get_str(struct mdinfo *sra, struct mdinfo *dev,
+                        char *name, char *val, int size);
 extern int sysfs_set_safemode(struct mdinfo *sra, unsigned long ms);
 extern int sysfs_set_array(struct mdinfo *info, int vers);
-extern int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd);
+extern int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd,
+                         int in_sync);
 extern int sysfs_disk_to_scsi_id(int fd, __u32 *id);
 extern int sysfs_unique_holder(int devnum, long rdev);
 extern int load_sys(char *path, char *buf);
@@ -392,7 +400,7 @@ extern int restore_stripes(int *dest, unsigned long long *offsets,
 
 extern char *map_num(mapping_t *map, int num);
 extern int map_name(mapping_t *map, char *name);
-extern mapping_t r5layout[], pers[], modes[], faultylayout[];
+extern mapping_t r5layout[], r6layout[], pers[], modes[], faultylayout[];
 
 extern char *map_dev(int major, int minor, int create);
 
@@ -432,7 +440,7 @@ extern struct superswitch {
         * device. ->load_super has been called.
         */
        void (*examine_super)(struct supertype *st, char *homehost);
-       void (*brief_examine_super)(struct supertype *st);
+       void (*brief_examine_super)(struct supertype *st, int verbose);
        void (*export_examine_super)(struct supertype *st);
 
        /* Used to report details of an active array.
@@ -653,7 +661,7 @@ extern struct supertype *dup_super(struct supertype *st);
 extern int get_dev_size(int fd, char *dname, unsigned long long *sizep);
 extern void get_one_disk(int mdfd, mdu_array_info_t *ainf,
                         mdu_disk_info_t *disk);
-void wait_for(char *dev);
+void wait_for(char *dev, int fd);
 
 #if __GNUC__ < 3
 struct stat64;
@@ -716,13 +724,13 @@ extern int Assemble(struct supertype *st, char *mddev,
                    mddev_ident_t ident,
                    mddev_dev_t devlist, char *backup_file,
                    int readonly, int runstop,
-                   char *update, char *homehost,
+                   char *update, char *homehost, int require_homehost,
                    int verbose, int force);
 
 extern int Build(char *mddev, int chunk, int level, int layout,
                 int raiddisks, mddev_dev_t devlist, int assume_clean,
                 char *bitmap_file, int bitmap_chunk, int write_behind,
-                int delay, int verbose, int autof);
+                int delay, int verbose, int autof, unsigned long long size);
 
 
 extern int Create(struct supertype *st, char *mddev,
@@ -747,7 +755,8 @@ extern int Wait(char *dev);
 extern int WaitClean(char *dev, int verbose);
 
 extern int Incremental(char *devname, int verbose, int runstop,
-                      struct supertype *st, char *homehost, int autof);
+                      struct supertype *st, char *homehost, int require_homehost,
+                      int autof);
 extern int Incremental_container(struct supertype *st, char *devname,
                                 int verbose, int runstop, int autof,
                                 int trustworthy);
@@ -765,7 +774,10 @@ extern unsigned long bitmap_sectors(struct bitmap_super_s *bsb);
 
 extern int md_get_version(int fd);
 extern int get_linux_version(void);
+extern long long parse_size(char *size);
 extern int parse_uuid(char *str, int uuid[4]);
+extern int parse_layout_10(char *layout);
+extern int parse_layout_faulty(char *layout);
 extern int check_ext2(int fd, char *name);
 extern int check_reiser(int fd, char *name);
 extern int check_raid(int fd, char *name);
@@ -781,14 +793,19 @@ extern int parse_auto(char *str, char *msg, int config);
 extern mddev_ident_t conf_get_ident(char *dev);
 extern mddev_dev_t conf_get_devs(void);
 extern int conf_test_dev(char *devname);
+extern int conf_test_metadata(const char *version);
 extern struct createinfo *conf_get_create_info(void);
 extern void set_conffile(char *file);
 extern char *conf_get_mailaddr(void);
 extern char *conf_get_mailfrom(void);
 extern char *conf_get_program(void);
-extern char *conf_get_homehost(void);
+extern char *conf_get_homehost(int *require_homehostp);
 extern char *conf_line(FILE *file);
 extern char *conf_word(FILE *file, int allow_key);
+extern int conf_name_is_free(char *name);
+extern int devname_matches(char *name, char *match);
+extern struct mddev_ident_s *conf_match(struct mdinfo *info, struct supertype *st);
+
 extern void free_line(char *line);
 extern int match_oneof(char *devices, char *devname);
 extern void uuid_from_super(int uuid[4], mdp_super_t *super);
@@ -935,8 +952,44 @@ static inline int xasprintf(char **strp, const char *fmt, ...) {
 #define makedev(M,m) (((M)<<8) | (m))
 #endif
 
-/* for raid5 */
+/* for raid4/5/6 */
 #define ALGORITHM_LEFT_ASYMMETRIC      0
 #define ALGORITHM_RIGHT_ASYMMETRIC     1
 #define ALGORITHM_LEFT_SYMMETRIC       2
 #define ALGORITHM_RIGHT_SYMMETRIC      3
+
+/* Define non-rotating (raid4) algorithms.  These allow
+ * conversion of raid4 to raid5.
+ */
+#define ALGORITHM_PARITY_0             4 /* P or P,Q are initial devices */
+#define ALGORITHM_PARITY_N             5 /* P or P,Q are final devices. */
+
+/* DDF RAID6 layouts differ from md/raid6 layouts in two ways.
+ * Firstly, the exact positioning of the parity block is slightly
+ * different between the 'LEFT_*' modes of md and the "_N_*" modes
+ * of DDF.
+ * Secondly, or order of datablocks over which the Q syndrome is computed
+ * is different.
+ * Consequently we have different layouts for DDF/raid6 than md/raid6.
+ * These layouts are from the DDFv1.2 spec.
+ * Interestingly DDFv1.2-Errata-A does not specify N_CONTINUE but
+ * leaves RLQ=3 as 'Vendor Specific'
+ */
+
+#define ALGORITHM_ROTATING_ZERO_RESTART        8 /* DDF PRL=6 RLQ=1 */
+#define ALGORITHM_ROTATING_N_RESTART   9 /* DDF PRL=6 RLQ=2 */
+#define ALGORITHM_ROTATING_N_CONTINUE  10 /*DDF PRL=6 RLQ=3 */
+
+
+/* For every RAID5 algorithm we define a RAID6 algorithm
+ * with exactly the same layout for data and parity, and
+ * with the Q block always on the last device (N-1).
+ * This allows trivial conversion from RAID5 to RAID6
+ */
+#define ALGORITHM_LEFT_ASYMMETRIC_6    16
+#define ALGORITHM_RIGHT_ASYMMETRIC_6   17
+#define ALGORITHM_LEFT_SYMMETRIC_6     18
+#define ALGORITHM_RIGHT_SYMMETRIC_6    19
+#define ALGORITHM_PARITY_0_6           20
+#define ALGORITHM_PARITY_N_6           ALGORITHM_PARITY_N
+