]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - mdadm.h
Change mark_clean to set_array_state.
[thirdparty/mdadm.git] / mdadm.h
diff --git a/mdadm.h b/mdadm.h
index 176d1c30319346936ba11230dc53a42132222665..b6102aaa3acf4147446d46573184432989ce2e07 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -76,6 +76,7 @@ extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
 #include       "md_u.h"
 #include       "md_p.h"
 #include       "bitmap.h"
+#include       "msg.h"
 
 #include <endian.h>
 /* Redhat don't like to #include <asm/byteorder.h>, and
@@ -158,6 +159,17 @@ struct mdinfo {
        char            sys_name[20];
        struct mdinfo *devs;
        struct mdinfo *next;
+
+       /* Device info for mdmon: */
+       int state_fd;
+       #define DS_FAULTY       1
+       #define DS_INSYNC       2
+       #define DS_WRITE_MOSTLY 4
+       #define DS_SPARE        8
+       #define DS_BLOCKED      16
+       #define DS_REMOVE       1024
+       int prev_state, curr_state, next_state;
+
 };
 
 struct createinfo {
@@ -270,12 +282,17 @@ struct mdstat_ent {
        char            *pattern; /* U or up, _ for down */
        int             percent; /* -1 if no resync */
        int             resync; /* 1 if resync, 0 if recovery */
+       int             devcnt;
+       int             raid_disks;
+       int             chunk_size;
+       char *          metadata_version;
        struct mdstat_ent *next;
 };
 
 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);
 
 struct map_ent {
@@ -303,6 +320,7 @@ extern void map_add(struct map_ent **melp,
 #define GET_CACHE      16
 #define        GET_MISMATCH    32
 #define        GET_VERSION     64
+#define        GET_DISKS       128
 
 #define        GET_DEVS        1024 /* gets role, major, minor */
 #define        GET_OFFSET      2048
@@ -313,6 +331,7 @@ extern void map_add(struct map_ent **melp,
 /* If fd >= 0, get the array it is open on,
  * else use devnum. >=0 -> major9. <0.....
  */
+extern int sysfs_open(int devnum, char *devname, char *attr);
 extern void sysfs_free(struct mdinfo *sra);
 extern struct mdinfo *sysfs_read(int fd, int devnum, unsigned long options);
 extern int sysfs_set_str(struct mdinfo *sra, struct mdinfo *dev,
@@ -323,7 +342,7 @@ extern int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev,
                        char *name, unsigned long long *val);
 extern int sysfs_set_array(struct mdinfo *sra,
                           struct mdinfo *info);
-extern int sysfs_add_disk(struct mdinfo *sra, int fd, struct mdinfo *sd);
+extern int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd);
 
 
 
@@ -349,6 +368,7 @@ extern mapping_t r5layout[], pers[], modes[], faultylayout[];
 
 extern char *map_dev(int major, int minor, int create);
 
+struct active_array;
 
 extern struct superswitch {
        void (*examine_super)(struct supertype *st, char *homehost);
@@ -389,6 +409,29 @@ extern struct superswitch {
 
        struct mdinfo *(*container_content)(struct supertype *st);
 
+/* for mdmon */
+       int (*open_new)(struct supertype *c, struct active_array *a, int inst);
+
+       /* Tell the metadata handler the current state of the array.
+        * This covers whether it is known to be consistent (no pending writes)
+        * when how far along a resync is known to have progressed
+        * (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.
+        */
+       void (*set_array_state)(struct active_array *a, int consistent);
+
+       /* When the state of a device might have changed, we call set_disk to
+        * tell the metadata what the current state is.
+        * Typically this happens on spare->in_sync and (spare|in_sync)->faulty
+        * transitions.
+        * set_disk might be called when the state of the particular disk has
+        * not in fact changed.
+        */
+       void (*set_disk)(struct active_array *a, int n, int state);
+       void (*sync_metadata)(struct active_array *a);
+
+
        int major;
        char *text_version;
        int swapuuid; /* true if uuid is bigending rather than hostendian */
@@ -405,8 +448,24 @@ struct supertype {
        int container_member; /* numerical position in container */
        void *sb;
        void *info;
+
+       /* extra stuff used by mdmon */
+       struct active_array *arrays;
+       int sock; /* listen to external programs */
+       int mgr_pipe[2]; /* communicate between threads */
+       int mon_pipe[2]; /* communicate between threads */
+       int devnum;
+       char *devname; /* e.g. md0.  This appears in metadata_verison:
+                       *  external:/md0/12
+                       */
+       int devcnt;
+       char *device_name; /* e.g. /dev/md/whatever */
+
+       struct mdinfo *devs;
+
 };
 
+extern struct supertype supertype_container_member;
 extern struct supertype *super_by_fd(int fd);
 extern struct supertype *guess_super(int fd);
 extern struct supertype *dup_super(struct supertype *st);
@@ -524,6 +583,7 @@ extern int check_raid(int fd, char *name);
 
 extern int get_mdp_major(void);
 extern int dev_open(char *dev, int flags);
+extern int open_dev_excl(int devnum);
 extern int is_standard(char *dev, int *nump);
 
 extern int parse_auto(char *str, char *msg, int config);
@@ -569,9 +629,27 @@ extern int open_mddev_devnum(char *devname, int devnum, char *name,
                             char *chosen_name, int parts);
 extern int open_container(int fd);
 
+extern int mdmon_running(int devnum);
+extern int signal_mdmon(int devnum);
+
 extern char *devnum2devname(int num);
 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;
+}
+
 #define        LEVEL_MULTIPATH         (-4)
 #define        LEVEL_LINEAR            (-1)
 #define        LEVEL_FAULTY            (-5)