]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - mdadm.h
reshape_array: move lots of code out of a 'switch'.
[thirdparty/mdadm.git] / mdadm.h
diff --git a/mdadm.h b/mdadm.h
index a5d94d7195ee1c2fe34b7b8748264ab28d396e33..f67120e5865b8adc36c68c64b71f529394b026db 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -401,6 +401,7 @@ extern void mdstat_wait(int seconds);
 extern void mdstat_wait_fd(int fd, const sigset_t *sigmask);
 extern int mddev_busy(int devnum);
 extern struct mdstat_ent *mdstat_by_component(char *name);
+extern struct mdstat_ent *mdstat_by_subdev(char *subdev, int container);
 
 struct map_ent {
        struct map_ent *next;
@@ -520,6 +521,31 @@ extern char *map_dev(int major, int minor, int create);
 struct active_array;
 struct metadata_update;
 
+
+/* 'struct reshape' records the intermediate states
+ * a general reshape.
+ * The starting geometry is converted to the 'before' geometry
+ * by at most an atomic level change. They could be the same.
+ * Similarly the 'after' geometry is converted to the final
+ * geometry by at most a level change.
+ * Note that 'before' and 'after' must have the same level.
+ * 'blocks' is the minimum number of sectors for a reshape unit.
+ * This will be a multiple of the stripe size in each of the
+ * 'before' and 'after' geometries.
+ * If 'blocks' is 0, no restriping is necessary.
+ */
+struct reshape {
+       int level;
+       int parity; /* number of parity blocks/devices */
+       struct {
+               int layout;
+               int data_disks;
+       } before, after;
+       unsigned long long backup_blocks;
+       unsigned long long stripes; /* number of old stripes that comprise 'blocks'*/
+       unsigned long long new_size; /* New size of array in sectors */
+};
+
 /* A superswitch provides entry point the a metadata handler.
  *
  * The super_switch primarily operates on some "metadata" that
@@ -634,7 +660,11 @@ extern struct superswitch {
         * when hot-adding a spare.
         */
        int (*add_to_super)(struct supertype *st, mdu_disk_info_t *dinfo,
-                            int fd, char *devname);
+                           int fd, char *devname);
+       /* update the metadata to delete a device,
+        * when hot-removing.
+        */
+       int (*remove_from_super)(struct supertype *st, mdu_disk_info_t *dinfo);
 
        /* Write metadata to one device when fixing problems or adding
         * a new device.
@@ -688,7 +718,11 @@ extern struct superswitch {
        int (*reshape_super)(struct supertype *st, long long size, int level,
                             int layout, int chunksize, int raid_disks,
                             char *backup, char *dev, int verbose); /* optional */
-       int (*manage_reshape)(struct supertype *st, char *backup); /* optional */
+       int (*manage_reshape)( /* optional */
+               int afd, struct mdinfo *sra, struct reshape *reshape,
+               struct supertype *st, unsigned long blocks,
+               int *fds, unsigned long long *offsets,
+               int dests, int *destfd, unsigned long long *destoffsets);
 
 /* for mdmon */
        int (*open_new)(struct supertype *c, struct active_array *a,
@@ -759,6 +793,9 @@ struct metadata_update {
        int     len;
        char    *buf;
        void    *space; /* allocated space that monitor will use */
+       void    **space_list; /* list of allocated spaces that monitor can
+                              * use or that it returned.
+                              */
        struct metadata_update *next;
 };
 
@@ -1066,7 +1103,7 @@ extern int experimental(void);
 extern void free_line(char *line);
 extern int match_oneof(char *devices, char *devname);
 extern void uuid_from_super(int uuid[4], mdp_super_t *super);
-extern const int uuid_match_any[4];
+extern const int uuid_zero[4];
 extern int same_uuid(int a[4], int b[4], int swapuuid);
 extern void copy_uuid(void *a, int b[4], int swapuuid);
 extern char *__fname_from_uuid(int id[4], int swap, char *buf, char sep);
@@ -1087,7 +1124,12 @@ extern void append_metadata_update(struct supertype *st, void *buf, int len);
 extern int assemble_container_content(struct supertype *st, int mdfd,
                                      struct mdinfo *content, int runstop,
                                      char *chosen_name, int verbose);
-
+extern struct mdinfo *container_choose_spares(struct supertype *st,
+                                             unsigned long long min_size,
+                                             struct domainlist *domlist,
+                                             char *spare_group,
+                                             const char *metadata, int get_one);
+extern int move_spare(char *from_devname, char *to_devname, dev_t devid);
 extern int add_disk(int mdfd, struct supertype *st,
                    struct mdinfo *sra, struct mdinfo *info);
 extern int remove_disk(int mdfd, struct supertype *st,
@@ -1128,7 +1170,13 @@ extern int check_env(char *name);
 extern __u32 random32(void);
 extern int start_mdmon(int devnum);
 
+extern int child_monitor(int afd, struct mdinfo *sra, struct reshape *reshape,
+                        struct supertype *st, unsigned long stripes,
+                        int *fds, unsigned long long *offsets,
+                        int dests, int *destfd, unsigned long long *destoffsets);
+
 extern char *devnum2devname(int num);
+extern void fmt_devname(char *name, int num);
 extern int devname2devnum(char *name);
 extern int stat2devnum(struct stat *st);
 extern int fd2devnum(int fd);