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;
struct map_ent {
struct map_ent *next;
int devnum;
- int major,minor;
+ char metadata[20];
int uuid[4];
char *path;
};
-extern int map_update(struct map_ent **mpp, int devnum, int major, int minor,
+extern int map_update(struct map_ent **mpp, int devnum, char *metadata,
int uuid[4], char *path);
extern struct map_ent *map_by_uuid(struct map_ent **map, int uuid[4]);
extern void map_read(struct map_ent **melp);
extern void map_delete(struct map_ent **mapp, int devnum);
extern void map_free(struct map_ent *map);
extern void map_add(struct map_ent **melp,
- int devnum, int major, int minor, int uuid[4], char *path);
+ int devnum, char *metadata, int uuid[4], char *path);
/* various details can be requested */
#define GET_LEVEL 1
extern int sysfs_set_array(struct mdinfo *sra,
struct mdinfo *info);
extern int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd);
-
-
+extern int sysfs_disk_to_sg(int fd);
+extern int sysfs_disk_to_scsi_id(int fd, __u32 *id);
extern int save_stripes(int *source, unsigned long long *offsets,
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);
- /* 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.
+ 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 (*mark_clean)(struct active_array *a, unsigned long long sync_pos);
+ 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.
* not in fact changed.
*/
void (*set_disk)(struct active_array *a, int n, int state);
- void (*sync_metadata)(struct active_array *a);
-
+ 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[];
-extern struct superswitch super_imsm, super_imsm_raid;
+extern struct superswitch super_imsm, super_imsm_volume;
struct supertype {
struct superswitch *ss;
int minor_version;
int max_devs;
int container_dev; /* devnum of container */
- int container_member; /* numerical position in container */
void *sb;
void *info;