mdadm/mdmon.h

112 lines
3.5 KiB
C
Raw Normal View History

/*
* 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[];
2008-05-15 08:48:37 +02:00
enum array_state { clear, inactive, suspended, readonly, read_auto,
mdadm: Introduce new array state 'broken' for raid0/linear Currently if a md raid0/linear array gets one or more members removed while being mounted, kernel keeps showing state 'clean' in the 'array_state' sysfs attribute. Despite udev signaling the member device is gone, 'mdadm' cannot issue the STOP_ARRAY ioctl successfully, given the array is mounted. Nothing else hints that something is wrong (except that the removed devices don't show properly in the output of mdadm 'detail' command). There is no other property to be checked, and if user is not performing reads/writes to the array, even kernel log is quiet and doesn't give a clue about the missing member. This patch is the mdadm counterpart of kernel new array state 'broken'. The 'broken' state mimics the state 'clean' in every aspect, being useful only to distinguish if an array has some member missing. All necessary paths in mdadm were changed to deal with 'broken' state, and in case the tool runs in a kernel that is not updated, it'll work normally, i.e., it doesn't require the 'broken' state in order to work. Also, this patch changes the way the array state is showed in the 'detail' command (for raid0/linear only) - now it takes the 'array_state' sysfs attribute into account instead of only rely in the MD_SB_CLEAN flag. Cc: Jes Sorensen <jes.sorensen@gmail.com> Cc: NeilBrown <neilb@suse.de> Cc: Song Liu <songliubraving@fb.com> Signed-off-by: Guilherme G. Piccoli <gpiccoli@canonical.com> Signed-off-by: Jes Sorensen <jsorensen@fb.com>
2019-09-03 21:49:01 +02:00
clean, active, write_pending, active_idle, broken, bad_word};
2008-05-15 08:48:37 +02:00
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;
2008-05-15 08:48:37 +02:00
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.
*/
2008-05-15 08:48:37 +02:00
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 check_reshape; /* flag set by mon, read by manage */
2008-05-15 08:48:37 +02:00
};
/*
* Metadata updates are handled by the monitor thread,
* as it has exclusive access to the metadata.
* When the manager want to updates metadata, either
* for it's own reason (e.g. committing a spare) or
* on behalf of mdadm, it creates a metadata_update
* structure and queues it to the monitor.
* Updates are created and processed by code under the
* superswitch. All common code sees them as opaque
* blobs.
*/
extern struct metadata_update *update_queue, *update_queue_handled;
2008-05-15 08:48:37 +02:00
#define MD_MAJOR 9
extern struct active_array *container;
extern struct active_array *discard_this;
extern struct active_array *pending_discard;
extern struct md_generic_cmd *active_cmd;
2008-05-15 08:48:37 +02:00
void remove_pidfile(char *devname);
2008-05-15 08:48:37 +02:00
void do_monitor(struct supertype *container);
void do_manager(struct supertype *container);
extern int sigterm;
2008-05-15 08:48:37 +02:00
int read_dev_state(int fd);
int is_container_member(struct mdstat_ent *mdstat, char *container);
2008-05-15 08:48:37 +02:00
struct mdstat_ent *mdstat_read(int hold, int start);
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;
}