]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - mdmon.h
mdadm: improve the dlm locking mechanism for clustered raid
[thirdparty/mdadm.git] / mdmon.h
diff --git a/mdmon.h b/mdmon.h
index f1b6d76ea367a2ec55cb06df41bb173e4f0c0930..818367cbb14c95755d8384702abcc155d41d0e96 100644 (file)
--- a/mdmon.h
+++ b/mdmon.h
@@ -1,33 +1,55 @@
-#ifdef DEBUG
-#define dprintf(fmt, arg...) \
-       fprintf(stderr, fmt, ##arg)
-#else
-#define dprintf(fmt, arg...) \
-        ({ if (0) fprintf(stderr, fmt, ##arg); 0; })
-#endif
+/*
+ * mdmon - monitor external metadata arrays
+ *
+ * Copyright (C) 2007-2009 Neil Brown <neilb@suse.de>
+ * Copyright (C) 2007-2009 Intel Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+extern const char Name[];
 
 enum array_state { clear, inactive, suspended, readonly, read_auto,
                   clean, active, write_pending, active_idle, bad_word};
 
 enum sync_action { idle, reshape, resync, recover, check, repair, bad_action };
 
-
 struct active_array {
        struct mdinfo info;
        struct supertype *container;
        struct active_array *next, *replaces;
+       int to_remove;
 
        int action_fd;
        int resync_start_fd;
+       int metadata_fd; /* for monitoring rw/ro status */
+       int sync_completed_fd; /* for checkpoint notification events */
+       int safe_mode_delay_fd;
+       unsigned long long last_checkpoint; /* sync_completed fires for many
+                                            * reasons this field makes sure the
+                                            * kernel has made progress before
+                                            * moving the checkpoint.  It is
+                                            * cleared by the metadata handler
+                                            * when it determines recovery is
+                                            * terminated.
+                                            */
 
        enum array_state prev_state, curr_state, next_state;
        enum sync_action prev_action, curr_action, next_action;
 
        int check_degraded; /* flag set by mon, read by manage */
-
-       int devnum;
-
-       unsigned long long resync_start;
+       int check_reshape; /* flag set by mon, read by manage */
 };
 
 /*
@@ -41,12 +63,6 @@ struct active_array {
  * superswitch.  All common code sees them as opaque
  * blobs.
  */
-struct metadata_update {
-       int     len;
-       char    *buf;
-       void    *space; /* allocated space that monitor will use */
-       struct metadata_update *next;
-};
 extern struct metadata_update *update_queue, *update_queue_handled;
 
 #define MD_MAJOR 9
@@ -56,15 +72,40 @@ extern struct active_array *discard_this;
 extern struct active_array *pending_discard;
 extern struct md_generic_cmd *active_cmd;
 
-
 void remove_pidfile(char *devname);
 void do_monitor(struct supertype *container);
 void do_manager(struct supertype *container);
+extern int sigterm;
 
 int read_dev_state(int fd);
+int is_container_member(struct mdstat_ent *mdstat, char *container);
 
 struct mdstat_ent *mdstat_read(int hold, int start);
 
-extern struct superswitch super_ddf, super_ddf_bvd, super_ddf_svd;
-
 extern int exit_now, manager_ready;
+extern int mon_tid, mgr_tid;
+extern int monitor_loop_cnt;
+
+/* helper routine to determine resync completion since MaxSector is a
+ * moving target
+ */
+static inline int is_resync_complete(struct mdinfo *array)
+{
+       unsigned long long sync_size = 0;
+       int ncopies, l;
+       switch(array->array.level) {
+       case 1:
+       case 4:
+       case 5:
+       case 6:
+               sync_size = array->component_size;
+               break;
+       case 10:
+               l = array->array.layout;
+               ncopies = (l & 0xff) * ((l >> 8) & 0xff);
+               sync_size = array->component_size * array->array.raid_disks;
+               sync_size /= ncopies;
+               break;
+       }
+       return array->resync_start >= sync_size;
+}