]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - mdadm.h
tests: zero devices before --adding them.
[thirdparty/mdadm.git] / mdadm.h
diff --git a/mdadm.h b/mdadm.h
index 6d219f7f85f83837a24cf0c6e28d7aa297220d38..c7b5183b0fc4441563de74947c44c443928864a7 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -25,9 +25,9 @@
 #define        _GNU_SOURCE
 #define _FILE_OFFSET_BITS 64
 #include       <unistd.h>
-#if !defined(__dietlibc__) && !defined(__KLIBC__)
+#ifdef __GLIBC__
 extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
-#else
+#elif !defined(lseek64)
 # if defined(__NO_STAT64) || __WORDSIZE != 32
 # define lseek64 lseek
 # endif
@@ -188,6 +188,7 @@ struct mdinfo {
        int                     uuid[4];
        char                    name[33];
        unsigned long long      data_offset;
+       unsigned long long      new_data_offset;
        unsigned long long      component_size; /* same as array.size, except in
                                                 * sectors and up to 64bits.
                                                 */
@@ -197,6 +198,7 @@ struct mdinfo {
 #define NO_RESHAPE             0
 #define VOLUME_RESHAPE         1
 #define CONTAINER_RESHAPE      2
+#define RESHAPE_NO_BACKUP      16 /* Mask 'or'ed in */
        int                     reshape_active;
        unsigned long long      reshape_progress;
        int                     recovery_blocked; /* for external metadata it
@@ -206,6 +208,12 @@ struct mdinfo {
                                                   * for native metadata it is
                                                   * reshape_active field mirror
                                                   */
+       /* During reshape we can sometimes change the data_offset to avoid
+        * over-writing still-valid data.  We need to know if there is space.
+        * So getinfo_super will fill in space_before and space_after in sectors.
+        * data_offset can be increased or decreased by this amount.
+        */
+       unsigned long long      space_before, space_after;
        union {
                unsigned long long resync_start; /* per-array resync position */
                unsigned long long recovery_start; /* per-device rebuild position */
@@ -304,6 +312,8 @@ enum special_options {
        Add,
        Remove,
        Fail,
+       Replace,
+       With,
        MiscOpt,
        WaitOpt,
        ConfigFile,
@@ -326,6 +336,13 @@ enum special_options {
        OffRootOpt,
        Prefer,
        KillOpt,
+       DataOffset,
+       ExamineBB,
+};
+
+enum prefix_standard {
+       JEDEC,
+       IEC
 };
 
 /* structures read from config file */
@@ -418,7 +435,8 @@ struct mddev_dev {
                                 * Not set for names read from .config
                                 */
        char writemostly;       /* 1 for 'set writemostly', 2 for 'clear writemostly' */
-       char used;              /* set when used */
+       int used;               /* set when used */
+       long long data_offset;
        struct mddev_dev *next;
 };
 
@@ -430,7 +448,7 @@ typedef struct mapping {
 
 struct mdstat_ent {
        char            *dev;
-       int             devnum;
+       char            devnm[32];
        int             active;
        char            *level;
        char            *pattern; /* U or up, _ for down */
@@ -450,30 +468,30 @@ extern struct mdstat_ent *mdstat_read(int hold, int start);
 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);
-extern int mddev_busy(int devnum);
+extern int mddev_busy(char *devnm);
 extern struct mdstat_ent *mdstat_by_component(char *name);
-extern struct mdstat_ent *mdstat_by_subdev(char *subdev, int container);
+extern struct mdstat_ent *mdstat_by_subdev(char *subdev, char *container);
 
 struct map_ent {
        struct map_ent *next;
-       int     devnum;
+       char    devnm[32];
        char    metadata[20];
        int     uuid[4];
        int     bad;
        char    *path;
 };
-extern int map_update(struct map_ent **mpp, int devnum, char *metadata,
+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, int devnum);
+extern void map_remove(struct map_ent **map, char *devnm);
 extern struct map_ent *map_by_uuid(struct map_ent **map, int uuid[4]);
-extern struct map_ent *map_by_devnum(struct map_ent **map, int devnum);
+extern struct map_ent *map_by_devnm(struct map_ent **map, char *devnm);
 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, int devnum);
+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,
-                   int devnum, char *metadata, int uuid[4], char *path);
+                   char *devnm, char *metadata, int uuid[4], char *path);
 extern int map_lock(struct map_ent **melp);
 extern void map_unlock(struct map_ent **melp);
 extern void map_fork(void);
@@ -500,12 +518,12 @@ enum sysfs_read_flags {
 };
 
 /* If fd >= 0, get the array it is open on,
- * else use devnum. >=0 -> major9. <0.....
+ * else use devnm.
  */
-extern int sysfs_open(int devnum, char *devname, char *attr);
-extern void sysfs_init(struct mdinfo *mdi, int fd, int devnum);
+extern int sysfs_open(char *devnm, char *devname, char *attr);
+extern void sysfs_init(struct mdinfo *mdi, int fd, char *devnm);
 extern void sysfs_free(struct mdinfo *sra);
-extern struct mdinfo *sysfs_read(int fd, int devnum, unsigned long options);
+extern struct mdinfo *sysfs_read(int fd, char *devnm, unsigned long options);
 extern int sysfs_attr_match(const char *attr, const char *str);
 extern int sysfs_match_word(const char *word, char **list);
 extern int sysfs_set_str(struct mdinfo *sra, struct mdinfo *dev,
@@ -529,7 +547,7 @@ 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, int resume);
 extern int sysfs_disk_to_scsi_id(int fd, __u32 *id);
-extern int sysfs_unique_holder(int devnum, long rdev);
+extern int sysfs_unique_holder(char *devnm, long rdev);
 extern int sysfs_freeze_array(struct mdinfo *sra);
 extern int load_sys(char *path, char *buf);
 extern int reshape_prepare_fdlist(char *devname,
@@ -585,7 +603,7 @@ struct active_array;
 struct metadata_update;
 
 
-/* 'struct reshape' records the intermediate states
+/* 'struct reshape' records the intermediate states of
  * a general reshape.
  * The starting geometry is converted to the 'before' geometry
  * by at most an atomic level change. They could be the same.
@@ -645,6 +663,7 @@ extern struct superswitch {
        void (*brief_examine_super)(struct supertype *st, int verbose);
        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);
 
        /* Used to report details of an active array.
         * ->load_super was possibly given a 'component' string.
@@ -654,8 +673,8 @@ extern struct superswitch {
        void (*export_detail_super)(struct supertype *st);
 
        /* Optional: platform hardware / firmware details */
-       int (*detail_platform)(int verbose, int enumerate_only);
-       int (*export_detail_platform)(int verbose);
+       int (*detail_platform)(int verbose, int enumerate_only, char *controller_path);
+       int (*export_detail_platform)(int verbose, char *controller_path);
 
        /* Used:
         *   to get uuid to storing in bitmap metadata
@@ -721,13 +740,15 @@ extern struct superswitch {
         */
        int (*init_super)(struct supertype *st, mdu_array_info_t *info,
                          unsigned long long size, char *name,
-                         char *homehost, int *uuid);
+                         char *homehost, int *uuid,
+                         unsigned long long data_offset);
 
        /* update the metadata to include new device, either at create or
         * when hot-adding a spare.
         */
        int (*add_to_super)(struct supertype *st, mdu_disk_info_t *dinfo,
-                           int fd, char *devname);
+                           int fd, char *devname,
+                           unsigned long long data_offset);
        /* update the metadata to delete a device,
         * when hot-removing.
         */
@@ -745,7 +766,8 @@ extern struct superswitch {
        int (*load_super)(struct supertype *st, int fd, char *devname);
        int (*load_container)(struct supertype *st, int fd, char *devname);
        struct supertype * (*match_metadata_desc)(char *arg);
-       __u64 (*avail_size)(struct supertype *st, __u64 size);
+       __u64 (*avail_size)(struct supertype *st, __u64 size,
+                           unsigned long long data_offset);
        unsigned long long (*min_acceptable_spare_size)(struct supertype *st);
        int (*add_internal_bitmap)(struct supertype *st, int *chunkp,
                                   int delay, int write_behind,
@@ -772,6 +794,7 @@ extern struct superswitch {
        int (*validate_geometry)(struct supertype *st, int level, int layout,
                                 int raiddisks,
                                 int *chunk, unsigned long long size,
+                                unsigned long long data_offset,
                                 char *subdev, unsigned long long *freesize,
                                 int verbose);
 
@@ -902,7 +925,7 @@ struct supertype {
        struct superswitch *ss;
        int minor_version;
        int max_devs;
-       int container_dev;    /* devnum of container */
+       char container_devnm[32];    /* devnm of container */
        void *sb;
        void *info;
        int ignore_hw_compat; /* used to inform metadata handlers that it should ignore
@@ -916,10 +939,9 @@ struct supertype {
        /* extra stuff used by mdmon */
        struct active_array *arrays;
        int sock; /* listen to external programs */
-       int devnum;
-       char *devname; /* e.g. md0.  This appears in metadata_verison:
-                       *  external:/md0/12
-                       */
+       char devnm[32]; /* e.g. md0.  This appears in metadata_version:
+                        *  external:/md0/12
+                        */
        int devcnt;
        int retry_soon;
 
@@ -937,8 +959,6 @@ extern struct supertype *dup_super(struct supertype *st);
 extern int get_dev_size(int fd, char *dname, unsigned long long *sizep);
 extern int must_be_container(int fd);
 extern int dev_size_from_id(dev_t id, unsigned long long *size);
-extern void get_one_disk(int mdfd, mdu_array_info_t *ainf,
-                        mdu_disk_info_t *disk);
 void wait_for(char *dev, int fd);
 
 /*
@@ -996,7 +1016,7 @@ extern void policy_free(void);
 
 extern struct dev_policy *path_policy(char *path, char *type);
 extern struct dev_policy *disk_policy(struct mdinfo *disk);
-extern struct dev_policy *devnum_policy(int dev);
+extern struct dev_policy *devid_policy(int devid);
 extern void dev_policy_free(struct dev_policy *p);
 
 //extern void pol_new(struct dev_policy **pol, char *name, char *val, char *metadata);
@@ -1028,7 +1048,7 @@ extern int domain_test(struct domainlist *dom, struct dev_policy *pol,
                       const char *metadata);
 extern struct domainlist *domain_from_array(struct mdinfo *mdi,
                                            const char *metadata);
-extern void domainlist_add_dev(struct domainlist **dom, int devnum,
+extern void domainlist_add_dev(struct domainlist **dom, int devid,
                               const char *metadata);
 extern void domain_free(struct domainlist *dl);
 extern void domain_merge(struct domainlist **domp, struct dev_policy *pol,
@@ -1091,6 +1111,7 @@ extern int Grow_addbitmap(char *devname, int fd,
                          struct context *c, struct shape *s);
 extern int Grow_reshape(char *devname, int fd,
                        struct mddev_dev *devlist,
+                       unsigned long long data_offset,
                        struct context *c, struct shape *s);
 extern int Grow_restart(struct supertype *st, struct mdinfo *info,
                        int *fdlist, int cnt, char *backup_file, int verbose);
@@ -1119,11 +1140,13 @@ extern int Create(struct supertype *st, char *mddev,
                  char *name, int *uuid,
                  int subdevs, struct mddev_dev *devlist,
                  struct shape *s,
-                 struct context *c);
+                 struct context *c,
+                 unsigned long long data_offset);
 
 extern int Detail(char *dev, struct context *c);
-extern int Detail_Platform(struct superswitch *ss, int scan, int verbose, int export);
+extern int Detail_Platform(struct superswitch *ss, int scan, int verbose, int export, char *controller_path);
 extern int Query(char *dev);
+extern int ExamineBadblocks(char *devname, int brief, struct supertype *forcest);
 extern int Examine(struct mddev_dev *devlist, struct context *c,
                   struct supertype *forcest);
 extern int Monitor(struct mddev_dev *devlist,
@@ -1171,11 +1194,12 @@ 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(int devnum);
-extern int open_dev_flags(int devnum, int flags);
-extern int open_dev_excl(int devnum);
+extern int open_dev(char *devnm);
+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 int parse_auto(char *str, char *msg, int config);
 extern struct mddev_ident *conf_get_ident(char *dev);
@@ -1190,6 +1214,9 @@ extern char *conf_get_program(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 void print_quoted(char *str);
+extern void print_escape(char *str);
+extern int use_udev(void);
 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);
@@ -1240,14 +1267,15 @@ extern int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info);
 unsigned long long min_recovery_start(struct mdinfo *array);
 
 extern char *human_size(long long bytes);
-extern char *human_size_brief(long long bytes);
+extern char *human_size_brief(long long bytes, int prefix);
 extern void print_r10_layout(int layout);
 
-#define NoMdDev (1<<23)
-extern int find_free_devnum(int use_partitions);
+extern char *find_free_devnm(int use_partitions);
 
 extern void put_md_name(char *name);
-extern char *get_md_name(int dev);
+extern char *devid2devnm(int devid);
+extern int devnm2devid(char *devnm);
+extern char *get_md_name(char *devnm);
 
 extern char DefaultConfFile[];
 
@@ -1260,16 +1288,18 @@ extern int create_mddev(char *dev, char *name, int autof, int trustworthy,
 #define        METADATA 3
 extern int open_mddev(char *dev, int report_errors);
 extern int open_container(int fd);
+extern int metadata_container_matches(char *metadata, char *devnm);
+extern int metadata_subdev_matches(char *metadata, char *devnm);
 extern int is_container_member(struct mdstat_ent *ent, char *devname);
 extern int is_subarray_active(char *subarray, char *devname);
 extern int open_subarray(char *dev, char *subarray, struct supertype *st, int quiet);
 extern struct superswitch *version_to_superswitch(char *vers);
 
-extern int mdmon_running(int devnum);
-extern int mdmon_pid(int devnum);
+extern int mdmon_running(char *devnm);
+extern int mdmon_pid(char *devnm);
 extern int check_env(char *name);
 extern __u32 random32(void);
-extern int start_mdmon(int devnum);
+extern int start_mdmon(char *devnm);
 
 extern int child_monitor(int afd, struct mdinfo *sra, struct reshape *reshape,
                         struct supertype *st, unsigned long stripes,
@@ -1277,26 +1307,9 @@ 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);
 
-extern char *devnum2devname(int num);
 extern void fmt_devname(char *name, int num);
-extern int devname2devnum(char *name);
-extern int stat2devnum(struct stat *st);
-extern int fd2devnum(int fd);
-
-static inline int dev2major(int d)
-{
-       if (d >= 0)
-               return MD_MAJOR;
-       else
-               return get_mdp_major();
-}
-
-static inline int dev2minor(int d)
-{
-       if (d >= 0)
-               return d;
-       return (-1-d) << MdpMinorShift;
-}
+extern char *stat2devnm(struct stat *st);
+extern char *fd2devnm(int fd);
 
 #define _ROUND_UP(val, base)   (((val) + (base) - 1) & ~(base - 1))
 #define ROUND_UP(val, base)    _ROUND_UP(val, (typeof(val))(base))
@@ -1452,4 +1465,10 @@ char *xstrdup(const char *str);
  * In those cases with use MAX_SIZE
  */
 #define MAX_SIZE       1
-extern int __offroot;
+
+/* We want to use unsigned numbers for sector counts, but need
+ * a value for 'invalid'.  Use '1'.
+ */
+#define INVALID_SECTORS 1
+/* And another special number needed for --data_offset=variable */
+#define VARIABLE_OFFSET 3