]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - mdadm.h
Provide a mdstat_ent to subarray helper
[thirdparty/mdadm.git] / mdadm.h
diff --git a/mdadm.h b/mdadm.h
index 614dc69029ad42bdf6de9784969545e84c99ca85..a44bb2a98a21cef296d49e074f006c13d4a9d456 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -93,6 +93,14 @@ extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
 #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"
@@ -280,6 +288,8 @@ enum special_options {
        DetailPlatform,
        KillSubarray,
        UpdateSubarray, /* 16 */
+       IncrementalPath,
+       NoSharing
 };
 
 /* structures read from config file */
@@ -337,8 +347,6 @@ struct mddev_dev {
        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 *next;
 };
 
@@ -540,7 +548,7 @@ extern struct superswitch {
         * appear to be failed/missing.
         */
        void (*getinfo_super)(struct supertype *st, struct mdinfo *info, char *map);
-
+       struct mdinfo *(*getinfo_super_disks)(struct supertype *st);
        /* Check if the given metadata is flagged as belonging to "this"
         * host.  0 for 'no', 1 for 'yes', -1 for "Don't record homehost"
         */
@@ -600,6 +608,7 @@ extern struct superswitch {
        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);
+       unsigned long long (*min_acceptable_spare_size)(struct supertype *st);
        int (*add_internal_bitmap)(struct supertype *st, int *chunkp,
                                   int delay, int write_behind,
                                   unsigned long long size, int may_change, int major);
@@ -673,6 +682,21 @@ extern struct superswitch {
         */
        struct mdinfo *(*activate_spare)(struct active_array *a,
                                         struct metadata_update **updates);
+       /*
+        * Return statically allocated string that represents metadata specific
+        * controller domain of the disk. The domain is used in disk domain
+        * matching functions. Disks belong to the same domain if the they have
+        * the same domain from mdadm.conf and belong the same metadata domain.
+        * Returning NULL or not providing this handler means that metadata
+        * does not distinguish the differences between disks that belong to
+        * different controllers. They are in the domain specified by
+        * configuration file (mdadm.conf).
+        * In case when the metadata has the notion of domains based on disk
+        * it shall return NULL for disks that do not belong to the controller
+        * the supported domains. Such disks will form another domain and won't
+        * be mixed with supported ones.
+        */
+       const char *(*get_disk_controller_domain)(const char *path);
 
        int swapuuid; /* true if uuid is bigending rather than hostendian */
        int external;
@@ -714,8 +738,6 @@ struct supertype {
        int container_dev;    /* devnum of 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;
@@ -741,6 +763,8 @@ static inline struct supertype *guess_super(int fd) {
 }
 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 int dev_size_from_id(unsigned id, unsigned long long *size);
 extern void get_one_disk(int mdfd, mdu_array_info_t *ainf,
                         mdu_disk_info_t *disk);
 void wait_for(char *dev, int fd);
@@ -759,7 +783,7 @@ struct dev_policy {
                         * name and metadata can be compared by address equality.
                         */
        const char *metadata;
-       char *value;
+       const char *value;
 };
 
 extern char pol_act[], pol_domain[], pol_metadata[], pol_auto[];
@@ -803,15 +827,18 @@ 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 pol_new(struct dev_policy **pol, char *name, char *val, char *metadata);
+extern void pol_add(struct dev_policy **pol, char *name, char *val, char *metadata);
 extern struct dev_policy *pol_find(struct dev_policy *pol, char *name);
 
 enum policy_action {
        act_default,
        act_include,
        act_re_add,
-       act_spare,
-       act_force_spare,
+       act_spare,      /* This only applies to bare devices */
+       act_spare_same_slot, /* this allows non-bare devices,
+                             * but only if recent removal */
+       act_force_spare, /* this allow non-bare devices in any case */
        act_err
 };
 
@@ -822,16 +849,22 @@ extern int disk_action_allows(struct mdinfo *disk, const char *metadata,
 
 struct domainlist {
        struct domainlist *next;
-       char *dom;
+       const char *dom;
 };
 
 extern int domain_test(struct domainlist *dom, struct dev_policy *pol,
                       const char *metadata);
 extern struct domainlist *domain_from_array(struct mdinfo *mdi,
                                            const char *metadata);
+extern void domainlist_add_dev(struct domainlist **dom, int devnum,
+                              const char *metadata);
 extern void domain_free(struct domainlist *dl);
 extern void domain_merge(struct domainlist **domp, struct dev_policy *pol,
                         const char *metadata);
+void domain_add(struct domainlist **domp, char *domain);
+
+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;
@@ -918,7 +951,8 @@ extern int Examine(struct mddev_dev *devlist, int brief, int export, int scan,
 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);
+                  int dosyslog, int test, char *pidfile, int increments,
+                  int share);
 
 extern int Kill(char *dev, struct supertype *st, int force, int quiet, int noexcl);
 extern int Kill_subarray(char *dev, char *subarray, int quiet);
@@ -931,7 +965,7 @@ extern int Incremental(char *devname, int verbose, int runstop,
                       int autof);
 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,
@@ -1076,6 +1110,11 @@ static inline int is_subarray(char *vers)
        return (*vers == '/' || *vers == '-');
 }
 
+static inline char *to_subarray(struct mdstat_ent *ent, char *container)
+{
+       return &ent->metadata_version[10+strlen(container)+1];
+}
+
 #ifdef DEBUG
 #define dprintf(fmt, arg...) \
        fprintf(stderr, fmt, ##arg)