#define MDMON_DIR "/dev/.mdadm/"
#endif /* MDMON_DIR */
+/* FAILED_SLOTS is where to save files storing recent removal of array
+ * member in order to allow future reuse of disk inserted in the same
+ * slot for array recovery
+ */
+#ifndef FAILED_SLOTS_DIR
+#define FAILED_SLOTS_DIR "/dev/.mdadm/failed-slots"
+#endif /* FAILED_SLOTS */
+
#include "md_u.h"
#include "md_p.h"
#include "bitmap.h"
DetailPlatform,
KillSubarray,
UpdateSubarray, /* 16 */
+ IncrementalPath
};
/* structures read from config file */
* devices is considered
*/
#define UnSet (0xfffe)
-typedef struct mddev_ident_s {
+struct mddev_ident {
char *devname;
int uuid_set;
*/
char *member; /* subarray within a container */
- struct mddev_ident_s *next;
+ struct mddev_ident *next;
union {
/* fields needed by different users of this structure */
int assembled; /* set when assembly succeeds */
};
-} *mddev_ident_t;
+};
/* List of device names - wildcards expanded */
-typedef struct mddev_dev_s {
+struct mddev_dev {
char *devname;
char disposition; /* 'a' for add, 'r' for remove, 'f' for fail.
* Not set for names read from .config
char writemostly; /* 1 for 'set writemostly', 2 for 'clear writemostly' */
char re_add;
char used; /* set when used */
- struct mdinfo *content; /* If devname is a container, this might list
- * the remaining member arrays. */
- struct mddev_dev_s *next;
-} *mddev_dev_t;
+ struct mddev_dev *next;
+};
typedef struct mapping {
char *name;
char *level;
char *pattern; /* U or up, _ for down */
int percent; /* -1 if no resync */
- int resync; /* 1 if resync, 0 if recovery */
+ int resync; /* 3 if check, 2 if reshape, 1 if resync, 0 if recovery */
int devcnt;
int raid_disks;
int chunk_size;
* The particular device should be:
* The last device added by add_to_super
* The device the metadata was loaded from by load_super
+ * If 'map' is present, then it is an array raid_disks long
+ * (raid_disk must already be set and correct) and it is filled
+ * with 1 for slots that are thought to be active and 0 for slots which
+ * appear to be failed/missing.
*/
- void (*getinfo_super)(struct supertype *st, struct mdinfo *info);
+ void (*getinfo_super)(struct supertype *st, struct mdinfo *info, char *map);
/* Check if the given metadata is flagged as belonging to "this"
* host. 0 for 'no', 1 for 'yes', -1 for "Don't record homehost"
int (*write_init_super)(struct supertype *st);
int (*compare_super)(struct supertype *st, struct supertype *tst);
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);
int (*add_internal_bitmap)(struct supertype *st, int *chunkp,
char *subdev, unsigned long long *freesize,
int verbose);
- struct mdinfo *(*container_content)(struct supertype *st);
+ struct mdinfo *(*container_content)(struct supertype *st, char *subarray);
/* Allow a metadata handler to override mdadm's default layouts */
int (*default_layout)(int level); /* optional */
/* query the supertype for default chunk size */
/* Permit subarray's to be deleted from inactive containers */
int (*kill_subarray)(struct supertype *st); /* optional */
/* Permit subarray's to be modified */
- int (*update_subarray)(struct supertype *st, char *update, mddev_ident_t ident); /* optional */
+ int (*update_subarray)(struct supertype *st, char *subarray,
+ char *update, struct mddev_ident *ident); /* optional */
/* for mdmon */
int (*open_new)(struct supertype *c, struct active_array *a,
int minor_version;
int max_devs;
int container_dev; /* devnum of container */
- char subarray[32]; /* name of array inside container */
void *sb;
void *info;
- int loaded_container; /* Set if load_super found a container,
- * not just one device */
struct metadata_update *updates;
struct metadata_update **update_tail;
};
-extern struct supertype *super_by_fd(int fd);
-extern struct supertype *guess_super(int fd);
+extern struct supertype *super_by_fd(int fd, char **subarray);
+enum guess_types { guess_any, guess_array, guess_partitions };
+extern struct supertype *guess_super_type(int fd, enum guess_types guess_type);
+static inline struct supertype *guess_super(int fd) {
+ return guess_super_type(fd, guess_any);
+}
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 void get_one_disk(int mdfd, mdu_array_info_t *ainf,
mdu_disk_info_t *disk);
void wait_for(char *dev, int fd);
char *value;
};
-extern char pol_act[], pol_domain[], pol_metadata[];
+extern char pol_act[], pol_domain[], pol_metadata[], pol_auto[];
/* iterate over the sublist starting at list, having the same
* 'name' as 'list', and matching the given metadata (Where
extern char type_part[], type_disk[];
extern void policyline(char *line, char *type);
+extern void policy_add(char *type, ...);
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 void dev_policy_free(struct dev_policy *p);
extern void pol_new(struct dev_policy **pol, char *name, char *val, char *metadata);
extern void domain_merge(struct domainlist **domp, struct dev_policy *pol,
const char *metadata);
+extern void policy_save_path(char *id_path, struct map_ent *array);
+extern int policy_check_path(struct mdinfo *disk, struct map_ent *array);
+
#if __GNUC__ < 3
struct stat64;
#endif
extern int Manage_runstop(char *devname, int fd, int runstop, int quiet);
extern int Manage_resize(char *devname, int fd, long long size, int raid_disks);
extern int Manage_subdevs(char *devname, int fd,
- mddev_dev_t devlist, int verbose, int test);
+ struct mddev_dev *devlist, int verbose, int test);
extern int autodetect(void);
extern int Grow_Add_device(char *devname, int fd, char *newdev);
extern int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int write_behind, int force);
struct mdinfo *info, char *backup_file);
extern int Assemble(struct supertype *st, char *mddev,
- mddev_ident_t ident,
- mddev_dev_t devlist, char *backup_file,
+ struct mddev_ident *ident,
+ struct mddev_dev *devlist, char *backup_file,
int readonly, int runstop,
char *update, char *homehost, int require_homehost,
int verbose, int force);
extern int Build(char *mddev, int chunk, int level, int layout,
- int raiddisks, mddev_dev_t devlist, int assume_clean,
+ int raiddisks, struct mddev_dev *devlist, int assume_clean,
char *bitmap_file, int bitmap_chunk, int write_behind,
int delay, int verbose, int autof, unsigned long long size);
extern int Create(struct supertype *st, char *mddev,
int chunk, int level, int layout, unsigned long long size, int raiddisks, int sparedisks,
char *name, char *homehost, int *uuid,
- int subdevs, mddev_dev_t devlist,
+ int subdevs, struct mddev_dev *devlist,
int runstop, int verbose, int force, int assume_clean,
char *bitmap_file, int bitmap_chunk, int write_behind, int delay, int autof);
extern int Detail(char *dev, int brief, int export, int test, char *homehost);
extern int Detail_Platform(struct superswitch *ss, int scan, int verbose);
extern int Query(char *dev);
-extern int Examine(mddev_dev_t devlist, int brief, int export, int scan,
+extern int Examine(struct mddev_dev *devlist, int brief, int export, int scan,
int SparcAdjust, struct supertype *forcest, char *homehost);
-extern int Monitor(mddev_dev_t devlist,
+extern int Monitor(struct mddev_dev *devlist,
char *mailaddr, char *alert_cmd,
int period, int daemonise, int scan, int oneshot,
int dosyslog, int test, char *pidfile, int increments);
extern int Kill(char *dev, struct supertype *st, int force, int quiet, int noexcl);
extern int Kill_subarray(char *dev, char *subarray, int quiet);
-extern int Update_subarray(char *dev, char *subarray, char *update, mddev_ident_t ident, int quiet);
+extern int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident *ident, int quiet);
extern int Wait(char *dev);
extern int WaitClean(char *dev, int sock, int verbose);
extern int Incremental(char *devname, int verbose, int runstop,
struct supertype *st, char *homehost, int require_homehost,
int autof);
-extern int Incremental_container(struct supertype *st, char *devname,
- int verbose, int runstop, int autof,
- int trustworthy);
extern void RebuildMap(void);
extern int IncrementalScan(int verbose);
-extern int IncrementalRemove(char *devname, int verbose);
+extern int IncrementalRemove(char *devname, char *path, int verbose);
extern int CreateBitmap(char *filename, int force, char uuid[16],
unsigned long chunksize, unsigned long daemon_sleep,
unsigned long write_behind,
extern int same_dev(char *one, char *two);
extern int parse_auto(char *str, char *msg, int config);
-extern mddev_ident_t conf_get_ident(char *dev);
-extern mddev_dev_t conf_get_devs(void);
+extern struct mddev_ident *conf_get_ident(char *dev);
+extern struct mddev_dev *conf_get_devs(void);
extern int conf_test_dev(char *devname);
-extern int conf_test_metadata(const char *version, int is_homehost);
+extern int conf_test_metadata(const char *version, struct dev_policy *pol, int is_homehost);
extern struct createinfo *conf_get_create_info(void);
extern void set_conffile(char *file);
extern char *conf_get_mailaddr(void);
extern char *conf_word(FILE *file, int allow_key);
extern int conf_name_is_free(char *name);
extern int devname_matches(char *name, char *match);
-extern struct mddev_ident_s *conf_match(struct mdinfo *info, struct supertype *st);
+extern struct mddev_ident *conf_match(struct mdinfo *info, struct supertype *st);
extern void free_line(char *line);
extern int match_oneof(char *devices, char *devname);
extern unsigned long calc_csum(void *super, int bytes);
extern int enough(int level, int raid_disks, int layout, int clean,
char *avail, int avail_disks);
+extern int enough_fd(int fd);
extern int ask(char *mesg);
extern unsigned long long get_component_size(int fd);
extern void remove_partitions(int fd);
extern int is_container_member(struct mdstat_ent *ent, char *devname);
extern int is_subarray_active(char *subarray, char *devname);
int is_container_active(char *devname);
-extern int open_subarray(char *dev, struct supertype *st, int quiet);
+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);