[mdadm/f15/master] Update to latest stable upstream release, resolve multiple outstanding bugzillas against F15.

Doug Ledford dledford at fedoraproject.org
Fri Mar 25 21:06:01 UTC 2011


commit 7d8ba69d0dbb10cd159ea0a3c32210ec12d09e66
Author: Doug Ledford <dledford at redhat.com>
Date:   Fri Mar 25 17:05:48 2011 -0400

    Update to latest stable upstream release, resolve multiple outstanding
    bugzillas against F15.
    
    Signed-off-by: Doug Ledford <dledford at redhat.com>

 .gitignore                 |    5 +++
 mdadm-2.5.2-static.patch   |   33 +-----------------------
 mdadm-cron                 |    3 ++
 mdadm-raid-check-sysconfig |    4 +++
 mdadm.rules                |   15 ++++++----
 mdadm.spec                 |   33 +++++++++++++++++++-----
 mdmonitor.init             |   12 +++++++++
 raid-check                 |   59 +++++++++++++++++++++++++++++++++++--------
 sources                    |    2 +-
 9 files changed, 109 insertions(+), 57 deletions(-)
---
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 <dledford at redhat.com>
-+ */
-+#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 <dledford at redhat.com> - 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 <rel-eng at lists.fedoraproject.org> - 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`
+	if [ "$array_state" != "clean" -a "$array_state" != "active" ]; then
+	    continue
+	fi
 	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 [ "$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


More information about the scm-commits mailing list