]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - mdadm.h
tests: add test that DDF marks missing devices as failed on assembly.
[thirdparty/mdadm.git] / mdadm.h
diff --git a/mdadm.h b/mdadm.h
index 3139259db6b3c151dd43628afe4dfebd163d1bbe..7f222a6d7a78ebbe7611e81955fc50e51ef5edca 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -51,7 +51,6 @@ extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
 #define srandom srand
 #endif
 
-
 #include       <linux/kdev_t.h>
 /*#include     <linux/fs.h> */
 #include       <sys/mount.h>
@@ -130,12 +129,12 @@ extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
 
 #if !defined(__KLIBC__)
 #if BYTE_ORDER == LITTLE_ENDIAN
-#define        __cpu_to_le16(_x) (_x)
-#define __cpu_to_le32(_x) (_x)
-#define __cpu_to_le64(_x) (_x)
-#define        __le16_to_cpu(_x) (_x)
-#define __le32_to_cpu(_x) (_x)
-#define __le64_to_cpu(_x) (_x)
+#define        __cpu_to_le16(_x) (unsigned int)(_x)
+#define __cpu_to_le32(_x) (unsigned int)(_x)
+#define __cpu_to_le64(_x) (unsigned long long)(_x)
+#define        __le16_to_cpu(_x) (unsigned int)(_x)
+#define __le32_to_cpu(_x) (unsigned int)(_x)
+#define __le64_to_cpu(_x) (unsigned long long)(_x)
 
 #define        __cpu_to_be16(_x) bswap_16(_x)
 #define __cpu_to_be32(_x) bswap_32(_x)
@@ -151,18 +150,17 @@ extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
 #define __le32_to_cpu(_x) bswap_32(_x)
 #define __le64_to_cpu(_x) bswap_64(_x)
 
-#define        __cpu_to_be16(_x) (_x)
-#define __cpu_to_be32(_x) (_x)
-#define __cpu_to_be64(_x) (_x)
-#define        __be16_to_cpu(_x) (_x)
-#define __be32_to_cpu(_x) (_x)
-#define __be64_to_cpu(_x) (_x)
+#define        __cpu_to_be16(_x) (unsigned int)(_x)
+#define __cpu_to_be32(_x) (unsigned int)(_x)
+#define __cpu_to_be64(_x) (unsigned long long)(_x)
+#define        __be16_to_cpu(_x) (unsigned int)(_x)
+#define __be32_to_cpu(_x) (unsigned int)(_x)
+#define __be64_to_cpu(_x) (unsigned long long)(_x)
 #else
 #  error "unknown endianness."
 #endif
 #endif /* __KLIBC__ */
 
-
 /*
  * min()/max()/clamp() macros that also do
  * strict type-checking.. See the
@@ -180,6 +178,8 @@ extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
        (void) (&_max1 == &_max2);              \
        _max1 > _max2 ? _max1 : _max2; })
 
+#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
+
 /* general information that might be extracted from a superblock */
 struct mdinfo {
        mdu_array_info_t        array;
@@ -233,7 +233,7 @@ struct mdinfo {
        int container_enough; /* flag external handlers can set to
                               * indicate that subarrays have not enough (-1),
                               * enough to start (0), or all expected disks (1) */
-       char            sys_name[20];
+       char            sys_name[20];
        struct mdinfo *devs;
        struct mdinfo *next;
 
@@ -311,6 +311,7 @@ enum special_options {
        Brief,
        ManageOpt,
        Add,
+       AddSpare,
        Remove,
        Fail,
        Replace,
@@ -339,6 +340,8 @@ enum special_options {
        KillOpt,
        DataOffset,
        ExamineBB,
+       Dump,
+       Restore,
 };
 
 enum prefix_standard {
@@ -446,7 +449,6 @@ typedef struct mapping {
        int num;
 } mapping_t;
 
-
 struct mdstat_ent {
        char            *dev;
        char            devnm[32];
@@ -461,11 +463,12 @@ struct mdstat_ent {
        struct dev_member {
                char                    *name;
                struct dev_member       *next;
-       }               *members;
+       }               *members;
        struct mdstat_ent *next;
 };
 
 extern struct mdstat_ent *mdstat_read(int hold, int start);
+extern void mdstat_close(void);
 extern void free_mdstat(struct mdstat_ent *ms);
 extern void mdstat_wait(int seconds);
 extern void mdstat_wait_fd(int fd, const sigset_t *sigmask);
@@ -485,12 +488,22 @@ extern int map_update(struct map_ent **mpp, char *devnm, char *metadata,
                      int uuid[4], char *path);
 extern void map_remove(struct map_ent **map, char *devnm);
 extern struct map_ent *map_by_uuid(struct map_ent **map, int uuid[4]);
+#ifdef MDASSEMBLE
+static inline struct map_ent *map_by_devnm(struct map_ent **map, char *name)
+{
+       return NULL;
+}
+static inline void map_free(struct map_ent *map)
+{
+}
+#else
 extern struct map_ent *map_by_devnm(struct map_ent **map, char *devnm);
+extern void map_free(struct map_ent *map);
+#endif
 extern struct map_ent *map_by_name(struct map_ent **map, char *name);
 extern void map_read(struct map_ent **melp);
 extern int map_write(struct map_ent *mel);
 extern void map_delete(struct map_ent **mapp, char *devnm);
-extern void map_free(struct map_ent *map);
 extern void map_add(struct map_ent **melp,
                    char *devnm, char *metadata, int uuid[4], char *path);
 extern int map_lock(struct map_ent **melp);
@@ -539,6 +552,9 @@ extern int sysfs_get_fd(struct mdinfo *sra, struct mdinfo *dev,
 extern int sysfs_fd_get_ll(int fd, unsigned long long *val);
 extern int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev,
                        char *name, unsigned long long *val);
+extern int sysfs_fd_get_two(int fd, unsigned long long *v1, unsigned long long *v2);
+extern int sysfs_get_two(struct mdinfo *sra, struct mdinfo *dev,
+                        char *name, unsigned long long *v1, unsigned long long *v2);
 extern int sysfs_fd_get_str(int fd, char *val, int size);
 extern int sysfs_attribute_available(struct mdinfo *sra, struct mdinfo *dev,
                                     char *name);
@@ -550,6 +566,7 @@ extern int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd, int resume);
 extern int sysfs_disk_to_scsi_id(int fd, __u32 *id);
 extern int sysfs_unique_holder(char *devnm, long rdev);
 extern int sysfs_freeze_array(struct mdinfo *sra);
+extern int sysfs_wait(int fd, int *msec);
 extern int load_sys(char *path, char *buf);
 extern int reshape_prepare_fdlist(char *devname,
                                  struct mdinfo *sra,
@@ -603,7 +620,6 @@ static inline char *map_dev(int major, int minor, int create)
 struct active_array;
 struct metadata_update;
 
-
 /* 'struct reshape' records the intermediate states of
  * a general reshape.
  * The starting geometry is converted to the 'before' geometry
@@ -615,6 +631,10 @@ struct metadata_update;
  * This will be a multiple of the stripe size in each of the
  * 'before' and 'after' geometries.
  * If 'blocks' is 0, no restriping is necessary.
+ * 'min_offset_change' is the minimum change to data_offset to
+ * allow the reshape to happen.  It is at least the larger of
+ * the old  and new chunk sizes, and typically the same as 'blocks'
+ * divided by number of data disks.
  */
 struct reshape {
        int level;
@@ -624,13 +644,14 @@ struct reshape {
                int data_disks;
        } before, after;
        unsigned long long backup_blocks;
+       unsigned long long min_offset_change;
        unsigned long long stripes; /* number of old stripes that comprise 'blocks'*/
        unsigned long long new_size; /* New size of array in sectors */
 };
 
 /* A superswitch provides entry point the a metadata handler.
  *
- * The super_switch primarily operates on some "metadata" that
+ * The superswitch primarily operates on some "metadata" that
  * is accessed via the 'supertype'.
  * This metadata has one of three possible sources.
  * 1/ It is read from a single device.  In this case it may not completely
@@ -665,6 +686,7 @@ extern struct superswitch {
        void (*brief_examine_subarrays)(struct supertype *st, int verbose);
        void (*export_examine_super)(struct supertype *st);
        int (*examine_badblocks)(struct supertype *st, int fd, char *devname);
+       int (*copy_metadata)(struct supertype *st, int from, int to);
 
        /* Used to report details of an active array.
         * ->load_super was possibly given a 'component' string.
@@ -728,6 +750,11 @@ extern struct superswitch {
         *   linear-grow-update - now change the size of the array.
         *   writemostly - set the WriteMostly1 bit in the superblock devflags
         *   readwrite - clear the WriteMostly1 bit in the superblock devflags
+        *   no-bitmap - clear any record that a bitmap is present.
+        *   bbl       - add a bad-block-log if possible
+        *   no-bbl    - remove and bad-block-log is it is empty.
+        *   revert-reshape - If a reshape is in progress, modify metadata so
+        *                    it will resume going in the opposite direction.
         */
        int (*update_super)(struct supertype *st, struct mdinfo *info,
                            char *update,
@@ -763,23 +790,62 @@ extern struct superswitch {
        /*  Write all metadata for this array.
         */
        int (*write_init_super)(struct supertype *st);
+       /* Check if metadata read from one device is compatible with an array,
+        * used when assembling an array, or pseudo-assembling was with
+        * "--examine --brief"
+        * If "st" has not yet been loaded the superblock from, "tst" is
+        * moved in, otherwise the superblock in 'st' is compared with
+        * 'tst'.
+        */
        int (*compare_super)(struct supertype *st, struct supertype *tst);
+       /* Load metadata from a single device.  If 'devname' is not NULL
+        * print error messages as appropriate */
        int (*load_super)(struct supertype *st, int fd, char *devname);
+       /* 'fd' is a 'container' md array - load array metadata from the
+        * whole container.
+        */
        int (*load_container)(struct supertype *st, int fd, char *devname);
+       /* If 'arg' is a valid name of this metadata type, allocate and
+        * return a 'supertype' for the particular minor version */
        struct supertype * (*match_metadata_desc)(char *arg);
+       /* If a device has the given size, and the data_offset has been
+        * requested - work out how much space is available for data.
+        * This involves adjusting for reserved space (e.g. bitmaps)
+        * and for any rounding.
+        * 'mdadm' only calls this for existing arrays where a possible
+        * spare is being added.  However some super-handlers call it
+        * internally from validate_geometry when creating an array.
+        */
        __u64 (*avail_size)(struct supertype *st, __u64 size,
                            unsigned long long data_offset);
+       /* This is similar to 'avail_size' in purpose, but is used for
+        * containers for which there is no 'component size' to compare.
+        * This reports that whole-device size which is a minimum
+        */
        unsigned long long (*min_acceptable_spare_size)(struct supertype *st);
+       /* Find somewhere to put a bitmap - possibly auto-size it - and
+        * update the metadata to record this.  The array may be newly
+        * created, in which case data_size may be updated, or it might
+        * already exist.  Metadata handler can know if init_super
+        * has been called, but not write_init_super.
+        */
        int (*add_internal_bitmap)(struct supertype *st, int *chunkp,
                                   int delay, int write_behind,
                                   unsigned long long size, int may_change, int major);
+       /* Seek 'fd' to start of write-intent-bitmap.  Must be an
+        * md-native format bitmap
+        */
        void (*locate_bitmap)(struct supertype *st, int fd);
+       /* if add_internal_bitmap succeeded for existing array, this
+        * writes it out.
+        */
        int (*write_bitmap)(struct supertype *st, int fd);
+       /* Free the superblock and any other allocated data */
        void (*free_super)(struct supertype *st);
 
        /* validate_geometry is called with an st returned by
         * match_metadata_desc.
-        * It should check that the geometry described in compatible with
+        * It should check that the geometry described is compatible with
         * the metadata type.  It will be called repeatedly as devices
         * added to validate changing size and new devices.  If there are
         * inter-device dependencies, it should record sufficient details
@@ -789,7 +855,7 @@ extern struct superswitch {
         *  1: everything is OK
         *  0: not OK for some reason - if 'verbose', then error was reported.
         * -1: st->sb was NULL, 'subdev' is a member of a container of this
-        *     types, but array is not acceptable for some reason
+        *     type, but array is not acceptable for some reason
         *     message was reported even if verbose is 0.
         */
        int (*validate_geometry)(struct supertype *st, int level, int layout,
@@ -799,6 +865,9 @@ extern struct superswitch {
                                 char *subdev, unsigned long long *freesize,
                                 int verbose);
 
+       /* Return a linked list of 'mdinfo' structures for all arrays
+        * in the container.  For non-containers, it is like
+        * getinfo_super with an allocated mdinfo.*/
        struct mdinfo *(*container_content)(struct supertype *st, char *subarray);
        /* query the supertype for default geometry */
        void (*default_geometry)(struct supertype *st, int *level, int *layout, int *chunk); /* optional */
@@ -837,7 +906,7 @@ extern struct superswitch {
         * (in a->resync_start).
         * resync status is really irrelevant if the array is not consistent,
         * but some metadata (DDF!) have a place to record the distinction.
-        * If 'consistent' is '2', then the array can mark it dirty if a 
+        * If 'consistent' is '2', then the array can mark it dirty if a
         * resync/recovery/whatever is required, or leave it clean if not.
         * Return value is 0 dirty (not consistent) and 1 if clean.
         * it is only really important if consistent is passed in as '2'.
@@ -929,6 +998,9 @@ struct supertype {
        char container_devnm[32];    /* devnm of container */
        void *sb;
        void *info;
+       void *other; /* Hack used to convert v0.90 to v1.0 */
+       unsigned long long devsize;
+       unsigned long long data_offset; /* used by v1.x only */
        int ignore_hw_compat; /* used to inform metadata handlers that it should ignore
                                 HW/firmware related incompatability to load metadata.
                                 Used when examining metadata to display content of disk
@@ -1099,10 +1171,10 @@ struct stat64;
 
 extern int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s);
 
-
 extern int Manage_ro(char *devname, int fd, int readonly);
-extern int Manage_runstop(char *devname, int fd, int runstop, int quiet,
-                         int will_retry);
+extern int Manage_run(char *devname, int fd, struct context *c);
+extern int Manage_stop(char *devname, int fd, int quiet,
+                      int will_retry);
 extern int Manage_subdevs(char *devname, int fd,
                          struct mddev_dev *devlist, int verbose, int test,
                          char *update, int force);
@@ -1163,10 +1235,10 @@ extern int Update_subarray(char *dev, char *subarray, char *update, struct mddev
 extern int Wait(char *dev);
 extern int WaitClean(char *dev, int sock, int verbose);
 
-extern int Incremental(char *devname, struct context *c,
+extern int Incremental(struct mddev_dev *devlist, struct context *c,
                       struct supertype *st);
 extern void RebuildMap(void);
-extern int IncrementalScan(int verbose);
+extern int IncrementalScan(struct context *c, char *devnm);
 extern int IncrementalRemove(char *devname, char *path, int verbose);
 extern int CreateBitmap(char *filename, int force, char uuid[16],
                        unsigned long chunksize, unsigned long daemon_sleep,
@@ -1177,6 +1249,10 @@ extern int ExamineBitmap(char *filename, int brief, struct supertype *st);
 extern int Write_rules(char *rule_name);
 extern int bitmap_update_uuid(int fd, int *uuid, int swap);
 extern unsigned long bitmap_sectors(struct bitmap_super_s *bsb);
+extern int Dump_metadata(char *dev, char *dir, struct context *c,
+                        struct supertype *st);
+extern int Restore_metadata(char *dev, char *dir, struct context *c,
+                           struct supertype *st, int only);
 
 extern int md_get_version(int fd);
 extern int get_linux_version(void);
@@ -1196,11 +1272,13 @@ extern int check_partitions(int fd, char *dname,
 extern int get_mdp_major(void);
 extern int dev_open(char *dev, int flags);
 extern int open_dev(char *devnm);
+extern void reopen_mddev(int mdfd);
 extern int open_dev_flags(char *devnm, int flags);
 extern int open_dev_excl(char *devnm);
 extern int is_standard(char *dev, int *nump);
 extern int same_dev(char *one, char *two);
 extern int compare_paths (char* path1,char* path2);
+extern void enable_fds(int devices);
 
 extern int parse_auto(char *str, char *msg, int config);
 extern struct mddev_ident *conf_get_ident(char *dev);
@@ -1218,6 +1296,7 @@ extern char *conf_word(FILE *file, int allow_key);
 extern void print_quoted(char *str);
 extern void print_escape(char *str);
 extern int use_udev(void);
+extern unsigned long GCD(unsigned long a, unsigned long b);
 extern int conf_name_is_free(char *name);
 extern int conf_verify_devnames(struct mddev_ident *array_list);
 extern int devname_matches(char *name, char *match);
@@ -1253,7 +1332,11 @@ extern void append_metadata_update(struct supertype *st, void *buf, int len);
 extern int assemble_container_content(struct supertype *st, int mdfd,
                                      struct mdinfo *content,
                                      struct context *c,
-                                     char *chosen_name);
+                                     char *chosen_name, int *result);
+#define        INCR_NO         1
+#define        INCR_UNSAFE     2
+#define        INCR_ALREADY    4
+#define        INCR_YES        8
 extern struct mdinfo *container_choose_spares(struct supertype *st,
                                              unsigned long long min_size,
                                              struct domainlist *domlist,
@@ -1274,6 +1357,7 @@ extern void print_r10_layout(int layout);
 extern char *find_free_devnm(int use_partitions);
 
 extern void put_md_name(char *name);
+extern char *devid2kname(int devid);
 extern char *devid2devnm(int devid);
 extern int devnm2devid(char *devnm);
 extern char *get_md_name(char *devnm);
@@ -1308,10 +1392,14 @@ extern int child_monitor(int afd, struct mdinfo *sra, struct reshape *reshape,
                         int dests, int *destfd, unsigned long long *destoffsets);
 void abort_reshape(struct mdinfo *sra);
 
+void *super1_make_v0(struct supertype *st, struct mdinfo *info, mdp_super_t *sb0);
+
 extern void fmt_devname(char *name, int num);
 extern char *stat2devnm(struct stat *st);
 extern char *fd2devnm(int fd);
 
+extern int in_initrd(void);
+
 #define _ROUND_UP(val, base)   (((val) + (base) - 1) & ~(base - 1))
 #define ROUND_UP(val, base)    _ROUND_UP(val, (typeof(val))(base))
 #define ROUND_UP_PTR(ptr, base)        ((typeof(ptr)) \
@@ -1320,7 +1408,7 @@ extern char *fd2devnm(int fd);
 static inline int is_subarray(char *vers)
 {
        /* The version string for a 'subarray' (an array in a container)
-        * is 
+        * is
         *    /containername/componentname    for normal read-write arrays
         *    -containername/componentname    for arrays which mdmon must not
         *                                    reconfigure.  They might be read-only
@@ -1371,7 +1459,6 @@ char *xstrdup(const char *str);
 #define LEVEL_CONTAINER                (-100)
 #define        LEVEL_UNSUPPORTED       (-200)
 
-
 /* faulty stuff */
 
 #define        WriteTransient  0
@@ -1391,7 +1478,6 @@ char *xstrdup(const char *str);
 #define        ModeMask        0x1f
 #define        ModeShift       5
 
-
 #ifdef __TINYC__
 #undef minor
 #undef major
@@ -1429,7 +1515,6 @@ char *xstrdup(const char *str);
 #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).