int cache_size; /* size of raid456 stripe cache*/
int mismatch_cnt;
char text_version[50];
- int container_member; /* for assembling external-metatdata arrays */
+
+ int container_member; /* for assembling external-metatdata arrays
+ * This is to be used internally by metadata
+ * handler only */
char sys_name[20];
struct mdinfo *devs;
/* 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;
};
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);
+extern void mdstat_wait_fd(int fd, const sigset_t *sigmask);
extern int mddev_busy(int devnum);
struct map_ent {
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);
extern char *map_dev(int major, int minor, int create);
struct active_array;
+struct metadata_update;
extern struct superswitch {
void (*examine_super)(struct supertype *st, char *homehost);
struct mdinfo *(*container_content)(struct supertype *st);
/* for mdmon */
- int (*open_new)(struct supertype *c, struct active_array *a, int inst);
- void (*mark_clean)(struct active_array *a, unsigned long long sync_pos);
- void (*mark_dirty)(struct active_array *a);
- void (*set_disk)(struct active_array *a, int n);
- void (*sync_metadata)(struct active_array *a);
-
+ int (*open_new)(struct supertype *c, struct active_array *a,
+ char *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 supertype *st);
+ void (*process_update)(struct supertype *st,
+ struct metadata_update *update);
+
+ /* activate_spare will check if the array is degraded and, if it
+ * is, try to find some spare space in the container.
+ * On success, it add appropriate updates (For process_update) to
+ * to the 'updates' list and returns a list of 'mdinfo' identifying
+ * the device, or devices as there might be multiple missing
+ * devices and multiple spares available.
+ */
+ struct mdinfo *(*activate_spare)(struct active_array *a,
+ struct metadata_update **updates);
int major;
- char *text_version;
int swapuuid; /* true if uuid is bigending rather than hostendian */
int external;
} super0, super1, super_ddf, super_ddf_bvd, super_ddf_svd, *superlist[];
int minor_version;
int max_devs;
int container_dev; /* devnum of container */
- int container_member; /* numerical position in container */
void *sb;
void *info;
/* extra stuff used by mdmon */
struct active_array *arrays;
- int devfd;
int sock; /* listen to external programs */
- int pipe[2]; /* communicate between threads */
+ 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 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);
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)