/* 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);
/* for mdmon */
int (*open_new)(struct supertype *c, struct active_array *a, int inst);
+ /* This tells the metadata handler that all data up to sync_pos is
+ * known to be insync, and will stay insync until told otherwise.
+ * All data beyond sync_pos may not be insync.
+ * If sync_pos == 0, this marks the array as 'dirty'.
+ * If sync_pos == ~0, this marks it as fully 'clean'.
+ * If other numbers cannot be stored, they should be treated as 0.
+ * mark_clean is always called with a sync_pos of 0 before any
+ * write to an array with redundancy is allowed.
+ */
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);
+
+ /* 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);
/* 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;