diff --git a/.gitignore b/.gitignore index 9190924..b275048 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,8 @@ mdadm-3.1.2.tar.bz2 mdadm-3.1.3-git07202010.tar.bz2 mdadm-3.1.3-git20100722.tar.bz2 mdadm-3.1.3-git20100804.tar.bz2 +mdadm-3.1.5.tar.bz2 +.build* +clog +*.src.rpm +*/ diff --git a/mdadm-2.5.2-static.patch b/mdadm-2.5.2-static.patch index 843c2f0..cde1eb8 100644 --- a/mdadm-2.5.2-static.patch +++ b/mdadm-2.5.2-static.patch @@ -7,23 +7,12 @@ -MAP_DIR=/dev/.mdadm -MAP_FILE = map -MDMON_DIR = /dev/.mdadm -+MAP_DIR=/dev/md ++MAP_DIR = /dev/md +MAP_FILE = md-device-map +MDMON_DIR = /dev/md DIRFLAGS = -DMAP_DIR=\"$(MAP_DIR)\" -DMAP_FILE=\"$(MAP_FILE)\" DIRFLAGS += -DMDMON_DIR=\"$(MDMON_DIR)\" CFLAGS = $(CWFLAGS) $(CXFLAGS) -DSendmail=\""$(MAILCMD)"\" $(CONFFILEFLAGS) $(DIRFLAGS) -@@ -165,9 +165,8 @@ mdadm.O2 : $(SRCS) mdadm.h mdmon.O2 - mdmon.O2 : $(MON_SRCS) mdadm.h mdmon.h - $(CC) -o mdmon.O2 $(CFLAGS) $(LDFLAGS) -DHAVE_STDINT_H -O2 -D_FORTIFY_SOURCE=2 $(MON_SRCS) - --# use '-z now' to guarantee no dynamic linker interactions with the monitor thread - mdmon : $(MON_OBJS) -- $(CC) $(LDFLAGS) -z now -o mdmon $(MON_OBJS) $(LDLIBS) -+ $(CC) $(LDFLAGS) -o mdmon $(MON_OBJS) $(LDLIBS) - msg.o: msg.c msg.h - - test_stripe : restripe.c mdadm.h @@ -224,16 +223,16 @@ install : mdadm mdmon install-man instal $(INSTALL) -D $(STRIP) -m 755 mdmon $(DESTDIR)$(BINDIR)/mdmon @@ -45,23 +34,3 @@ install-man: mdadm.8 md.4 mdadm.conf.5 mdmon.8 $(INSTALL) -D -m 644 mdadm.8 $(DESTDIR)$(MAN8DIR)/mdadm.8 ---- mdadm-3.1.3-git20100804/mapfile.c.static 2010-07-28 23:50:15.000000000 -0400 -+++ mdadm-3.1.3-git20100804/mapfile.c 2010-08-04 11:27:35.391342438 -0400 -@@ -60,9 +60,15 @@ - dir "/" base ".lock", \ - dir } - --#define MAP_DIRS 2 -+/* -+ * one ring to bind them all... -+ * -+ * We only use a single map file location. The multiple locations issue -+ * has caused more confusion than it was worth. -+ * Doug Ledford -+ */ -+#define MAP_DIRS 1 - char *mapname[MAP_DIRS][4] = { -- mapnames("/var/run/mdadm", "map"), - mapnames(MAP_DIR, MAP_FILE), - }; - diff --git a/mdadm-cron b/mdadm-cron new file mode 100644 index 0000000..4e05d68 --- /dev/null +++ b/mdadm-cron @@ -0,0 +1,3 @@ +# Run system wide raid-check once a week on Sunday at 1am by default +0 1 * * Sun root /usr/sbin/raid-check + diff --git a/mdadm-raid-check-sysconfig b/mdadm-raid-check-sysconfig index e1f6a7a..81c5a14 100644 --- a/mdadm-raid-check-sysconfig +++ b/mdadm-raid-check-sysconfig @@ -31,6 +31,9 @@ # REPAIR_DEVS - a space delimited list of devs that the user # specifically wants to run a repair on. # SKIP_DEVS - a space delimited list of devs that should be skipped +# NICE - Change the raid check CPU and IO priority in order to make +# the system more responsive during lengthy checks. Valid +# values are high, normal, low, idle. # # Note: the raid-check script intentionaly runs last in the cron.weekly # sequence. This is so we can wait for all the resync operations to complete @@ -47,6 +50,7 @@ ENABLED=yes CHECK=check +NICE=low # To check devs /dev/md0 and /dev/md3, use "md0 md3" CHECK_DEVS="" REPAIR_DEVS="" diff --git a/mdadm.rules b/mdadm.rules index 5fffb8b..ddd9e67 100644 --- a/mdadm.rules +++ b/mdadm.rules @@ -4,12 +4,15 @@ ENV{ANACONDA}=="?*", GOTO="md_imsm_inc_end" SUBSYSTEM=="block", ACTION=="add", ENV{ID_FS_TYPE}=="linux_raid_member", \ - RUN+="/sbin/mdadm -I $tempnode" + RUN+="/sbin/mdadm -I $env{DEVNAME}" SUBSYSTEM=="block", ACTION=="remove", ENV{ID_FS_TYPE}=="linux_raid_member", \ - RUN+="/sbin/mdadm -If $env{DEVNAME}" + RUN+="/sbin/mdadm -If $name --path $env{ID_PATH}" -ENV{rd_NO_MDIMSM}=="?*", GOTO="md_imsm_inc_end" +IMPORT{cmdline}="noiswmd" +IMPORT{cmdline}="nodmraid" ENV{noiswmd}=="?*", GOTO="md_imsm_inc_end" +ENV{nodmraid}=="?*", GOTO="md_imsm_inc_end" + # In case the initramfs only started some of the arrays in our container, # run incremental assembly on the container itself. Note: we ran mdadm # on the container in 64-md-raid.rules, and that's how the MD_LEVEL @@ -18,11 +21,11 @@ ENV{noiswmd}=="?*", GOTO="md_imsm_inc_end" # IMPORT{program}="/sbin/mdadm -D --export $tempnode", \ SUBSYSTEM=="block", ACTION=="add", KERNEL=="md*", \ - ENV{MD_LEVEL}=="container", RUN+="/sbin/mdadm -I $tempnode" + ENV{MD_LEVEL}=="container", RUN+="/sbin/mdadm -I $env{DEVNAME}" SUBSYSTEM=="block", ACTION=="add", ENV{ID_FS_TYPE}=="isw_raid_member", \ - RUN+="/sbin/mdadm -I $tempnode" + RUN+="/sbin/mdadm -I $env{DEVNAME}" SUBSYSTEM=="block", ACTION=="remove", ENV{ID_FS_TYPE}=="isw_raid_member", \ - RUN+="/sbin/mdadm -If $env{DEVNAME}" + RUN+="/sbin/mdadm -If $name --path $env{ID_PATH}" LABEL="md_imsm_inc_end" diff --git a/mdadm.spec b/mdadm.spec index 90d11ae..8ec4d82 100644 --- a/mdadm.spec +++ b/mdadm.spec @@ -1,12 +1,13 @@ Summary: The mdadm program controls Linux md devices (software RAID arrays) Name: mdadm -Version: 3.1.3 -Release: 0.git20100804.2%{?dist}.1 -Source: http://www.kernel.org/pub/linux/utils/raid/mdadm/mdadm-%{version}-git20100804.tar.bz2 +Version: 3.1.5 +Release: 1%{?dist} +Source: http://www.kernel.org/pub/linux/utils/raid/mdadm/mdadm-%{version}.tar.bz2 Source1: mdmonitor.init Source2: raid-check Source3: mdadm.rules Source4: mdadm-raid-check-sysconfig +Source5: mdadm-cron Patch19: mdadm-3.1.3-udev.patch Patch20: mdadm-2.5.2-static.patch URL: http://www.kernel.org/pub/linux/utils/raid/mdadm/ @@ -27,7 +28,7 @@ almost all functions without a configuration file, though a configuration file can be used to help with some common tasks. %prep -%setup -q -n mdadm-3.1.3-git20100804 +%setup -q %patch19 -p1 -b .udev %patch20 -p1 -b .static @@ -39,9 +40,10 @@ rm -rf %{buildroot} make DESTDIR=%{buildroot} MANDIR=%{_mandir} BINDIR=/sbin install rm -f %{buildroot}/lib/udev/rules.d/64* install -Dp -m 755 %{SOURCE1} %{buildroot}%{_initrddir}/mdmonitor -install -Dp -m 755 %{SOURCE2} %{buildroot}%{_sysconfdir}/cron.weekly/99-raid-check +install -Dp -m 755 %{SOURCE2} %{buildroot}%{_sbindir}/raid-check install -Dp -m 644 %{SOURCE3} %{buildroot}/lib/udev/rules.d/65-md-incremental.rules install -Dp -m 644 %{SOURCE4} %{buildroot}%{_sysconfdir}/sysconfig/raid-check +install -Dp -m 644 %{SOURCE5} %{buildroot}%{_sysconfdir}/cron.d/raid-check mkdir -p -m 700 %{buildroot}/var/run/mdadm %clean @@ -68,13 +70,30 @@ fi %doc TODO ChangeLog mdadm.conf-example COPYING misc/* /lib/udev/rules.d/* /sbin/* +%{_sbindir}/raid-check %{_initrddir}/* %{_mandir}/man*/md* -%{_sysconfdir}/cron.weekly/* +%config(noreplace) %{_sysconfdir}/cron.d/* %config(noreplace) %{_sysconfdir}/sysconfig/* -%attr(0700,root,root) %dir /var/run/mdadm +%ghost %attr(0700,root,root) %dir /var/run/mdadm %changelog +* Fri Mar 25 2011 Doug Ledford - 3.1.5-1 +- Update to latest upstream stable release +- Update mdadm.rules file to honor noiswmd and nodmraid command line options +- Ghost the directory in /var/run, create /var/run/mdadm in mdmonitor init + script +- Don't report mismatch counts on either raid1 or raid10 +- Check both active and idle arrays during raid check runs +- Move the raid-check script from cron.weekly to /usr/sbin, add a crontab + file to /etc/cron.d and mark it config(noreplace). This way users can + select their own raid-check frequency and have it honored through + upgrades. +- Allow the raid-check script to set the process and io priority of the + thread performing the check in order to preserve responsiveness of the + machine during the check. +- Resolves: 633229, 656620. 679843, 671076, 659933 + * Tue Feb 08 2011 Fedora Release Engineering - 3.1.3-0.git20100804.2.1 - Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild diff --git a/mdmonitor.init b/mdmonitor.init index cb2cfed..f0d57d9 100755 --- a/mdmonitor.init +++ b/mdmonitor.init @@ -20,6 +20,7 @@ # and mdadm man pages for possible ways to configure this service. ### END INIT INFO +PIDPATH=/var/run/mdadm PIDFILE=/var/run/mdadm/mdadm.pid PATH=/sbin:/usr/sbin:$PATH RETVAL=0 @@ -53,6 +54,17 @@ start () # MAILADDR or PROGRAM or both must be set in order to run mdadm --monitor [ -f /etc/mdadm.conf ] || return 6 grep '^\(MAILADDR\|PROGRAM\) .' /etc/mdadm.conf >/dev/null 2>&1 || return 6 + # Create our directory if it isn't there yet + if [ ! -d $PIDPATH ]; then + mkdir -m 0700 -Z system_u:object_r:mdadm_var_run_t $PIDPATH >&/dev/null + RC=$? + if [ $RC -ne 0 ]; then + echo -n "Failed to create /var/run/mdadm" + failure + echo + return 1 + fi + fi if [ -f "$PIDFILE" ]; then checkpid `cat $PIDFILE` && return 0 fi diff --git a/raid-check b/raid-check index 0f8c263..829dc58 100644 --- a/raid-check +++ b/raid-check @@ -19,6 +19,24 @@ case "$CHECK" in *) exit 0;; esac +ionice="" +renice="" +case $NICE in + high) + renice="-n -5" + ;; + low) + renice="-n 5" + ionice="-c2 -n7" + ;; + idle) + renice="-n 15" + ionice="-c3" + ;; + *) + ;; +esac + active_list=`grep "^md.*: active" /proc/mdstat | cut -f 1 -d ' '` [ -z "$active_list" ] && exit 0 @@ -26,29 +44,45 @@ declare -A check dev_list="" check_list="" for dev in $active_list; do - echo $SKIP_DEVS | grep -w $dev >/dev/null 2>&1 && continue + echo $SKIP_DEVS | grep -w $dev >&/dev/null && continue if [ -f /sys/block/$dev/md/sync_action ]; then # Only perform the checks on idle, healthy arrays, but delay # actually writing the check field until the next loop so we # don't switch currently idle arrays to active, which happens # when two or more arrays are on the same physical disk array_state=`cat /sys/block/$dev/md/array_state` - sync_action=`cat /sys/block/$dev/md/sync_action` - if [ "$array_state" = clean -a "$sync_action" = idle ]; then - ck="" - echo $REPAIR_DEVS | grep -w $dev >/dev/null 2>&1 && ck="repair" - echo $CHECK_DEVS | grep -w $dev >/dev/null 2>&1 && ck="check" - [ -z "$ck" ] && ck=$CHECK - dev_list="$dev_list $dev" - check[$dev]=$ck - [ "$ck" = "check" ] && check_list="$check_list $dev" + if [ "$array_state" != "clean" -a "$array_state" != "active" ]; then + continue fi + sync_action=`cat /sys/block/$dev/md/sync_action` + if [ "$sync_action" != idle ]; then + continue + fi + ck="" + echo $REPAIR_DEVS | grep -w $dev >&/dev/null && ck="repair" + echo $CHECK_DEVS | grep -w $dev >&/dev/null && ck="check" + [ -z "$ck" ] && ck=$CHECK + dev_list="$dev_list $dev" + check[$dev]=$ck + [ "$ck" = "check" ] && check_list="$check_list $dev" fi done [ -z "$dev_list" ] && exit 0 for dev in $dev_list; do echo "${check[$dev]}" > /sys/block/$dev/md/sync_action + + resync_pid="" + wait=10 + while [ $wait -gt 0 -a -z "$resync_pid" ]; do + sleep 6 + let wait-- + resync_pid=$(ps -ef | awk -v mddev=$dev 'BEGIN { pattern = "^\\[" mddev "_resync]$" } $8 ~ pattern { print $2 }') + done + [ -n "$resync_pid" -a -n "$renice" ] && + renice $renice -p $resync_pid >&/dev/null + [ -n "$resync_pid" -a -n "$ionice" ] && + ionice $ionice -p $resync_pid >&/dev/null done [ -z "$check_list" ] && exit 0 @@ -66,7 +100,7 @@ do done for dev in $check_list; do mismatch_cnt=`cat /sys/block/$dev/md/mismatch_cnt` - # Due to the fact that raid1 writes in the kernel are unbuffered, + # Due to the fact that raid1/10 writes in the kernel are unbuffered, # a raid1 array can have non-0 mismatch counts even when the # array is healthy. These non-0 counts will only exist in # transient data areas where they don't pose a problem. However, @@ -78,7 +112,10 @@ for dev in $check_list; do # check, we still catch and correct any bad sectors there might # be in the device. raid_lvl=`cat /sys/block/$dev/md/level` - if [ "$mismatch_cnt" -ne 0 -a "$raid_lvl" != "raid1" ]; then + if [ "$raid_lvl" = "raid1" -o "$raid_lvl" = "raid10" ]; then + continue + fi + if [ "$mismatch_cnt" -ne 0 ]; then echo "WARNING: mismatch_cnt is not 0 on /dev/$dev" fi done diff --git a/sources b/sources index 991d92c..531d5b6 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -bfc11a6f0693e3e086bbd851215c824e mdadm-3.1.3-git20100804.tar.bz2 +a7575707a5f2d1ed6d408446eabcb19b mdadm-3.1.5.tar.bz2