From: Chris Wright <chrisw@sous-sol.org>
To: linux-kernel@vger.kernel.org, stable@kernel.org, jejb@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
Zwane Mwaikambo <zwane@arm.linux.org.uk>,
"Theodore Ts'o" <tytso@mit.edu>,
Randy Dunlap <rdunlap@xenotime.net>,
Dave Jones <davej@redhat.com>,
Chuck Wolber <chuckw@quantumlinux.com>,
Chris Wedgwood <reviews@ml.cw.f00f.org>,
Michael Krufky <mkrufky@linuxtv.org>,
Chuck Ebbert <cebbert@redhat.com>,
Domenico Andreoli <cavokz@gmail.com>,
torvalds@linux-foundation.org, akpm@linux-foundation.org,
alan@lxorguk.ukuu.org.uk, Dan Williams <dan.j.williams@intel.com>,
Neil Brown <neilb@suse.de>
Subject: [patch 48/50] md: fix prexor vs sync_request race
Date: Fri, 06 Jun 2008 18:03:03 -0700 [thread overview]
Message-ID: <20080607010636.182581291@sous-sol.org> (raw)
In-Reply-To: 20080607010215.358296706@sous-sol.org
[-- Attachment #1: md-fix-prexor-vs-sync_request-race.patch --]
[-- Type: text/plain, Size: 2916 bytes --]
-stable review patch. If anyone has any objections, please let us know.
---------------------
From: Dan Williams <dan.j.williams@intel.com>
upstream commit: e0a115e5aa554b93150a8dc1c3fe15467708abb2
During the initial array synchronization process there is a window between
when a prexor operation is scheduled to a specific stripe and when it
completes for a sync_request to be scheduled to the same stripe. When
this happens the prexor completes and the stripe is unconditionally marked
"insync", effectively canceling the sync_request for the stripe. Prior to
2.6.23 this was not a problem because the prexor operation was done under
sh->lock. The effect in older kernels being that the prexor would still
erroneously mark the stripe "insync", but sync_request would be held off
and re-mark the stripe as "!in_sync".
Change the write completion logic to not mark the stripe "in_sync" if a
prexor was performed. The effect of the change is to sometimes not set
STRIPE_INSYNC. The worst this can do is cause the resync to stall waiting
for STRIPE_INSYNC to be set. If this were happening, then STRIPE_SYNCING
would be set and handle_issuing_new_read_requests would cause all
available blocks to eventually be read, at which point prexor would never
be used on that stripe any more and STRIPE_INSYNC would eventually be set.
echo repair > /sys/block/mdN/md/sync_action will correct arrays that may
have lost this race.
Cc: <stable@kernel.org>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
[chrisw: backport to 2.6.25.5]
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
---
drivers/md/raid5.c | 5 +++++
1 file changed, 5 insertions(+)
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -2621,6 +2621,7 @@ static void handle_stripe5(struct stripe
struct stripe_head_state s;
struct r5dev *dev;
unsigned long pending = 0;
+ int prexor;
memset(&s, 0, sizeof(s));
pr_debug("handling stripe %llu, state=%#lx cnt=%d, pd_idx=%d "
@@ -2740,9 +2741,11 @@ static void handle_stripe5(struct stripe
/* leave prexor set until postxor is done, allows us to distinguish
* a rmw from a rcw during biodrain
*/
+ prexor = 0;
if (test_bit(STRIPE_OP_PREXOR, &sh->ops.complete) &&
test_bit(STRIPE_OP_POSTXOR, &sh->ops.complete)) {
+ prexor = 1;
clear_bit(STRIPE_OP_PREXOR, &sh->ops.complete);
clear_bit(STRIPE_OP_PREXOR, &sh->ops.ack);
clear_bit(STRIPE_OP_PREXOR, &sh->ops.pending);
@@ -2776,6 +2779,8 @@ static void handle_stripe5(struct stripe
if (!test_and_set_bit(
STRIPE_OP_IO, &sh->ops.pending))
sh->ops.count++;
+ if (prexor)
+ continue;
if (!test_bit(R5_Insync, &dev->flags) ||
(i == sh->pd_idx && s.failed == 0))
set_bit(STRIPE_INSYNC, &sh->state);
--
next prev parent reply other threads:[~2008-06-07 1:13 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-07 1:02 [patch 00/50] 2.6.25.6 -stable review Chris Wright
2008-06-07 1:02 ` [patch 01/50] block: do_mounts - accept root=<non-existant partition> Chris Wright
2008-06-09 13:38 ` Adrian Bunk
2008-06-09 16:48 ` Chris Wright
2008-06-07 1:02 ` [patch 02/50] POWERPC Bolt in SLB entry for kernel stack on secondary cpus Chris Wright
2008-06-07 1:02 ` [patch 03/50] USB: remove PICDEM FS USB demo (04d8:000c) device from ldusb Chris Wright
2008-06-07 1:02 ` [patch 04/50] USB: unusual_devs: Add support for GI 0401 SD-Card interface Chris Wright
2008-06-07 1:02 ` [patch 05/50] USB: option: add new Dell 5520 HSDPA variant Chris Wright
2008-06-07 1:02 ` [patch 06/50] USB: add Zoom Telephonics Model 3095F V.92 USB Mini External modem to cdc-acm Chris Wright
2008-06-07 1:02 ` [patch 07/50] USB: do not handle device 1410:5010 in option driver Chris Wright
2008-06-07 1:02 ` [patch 08/50] USB: add Telstra NextG CDMA id to " Chris Wright
2008-06-07 1:02 ` [patch 09/50] ext3/4: fix uninitialized bs in ext3/4_xattr_set_handle() Chris Wright
2008-06-07 1:02 ` [patch 10/50] libata: force hardreset if link is in powersave mode Chris Wright
2008-06-07 1:27 ` Linus Torvalds
2008-06-07 1:57 ` [stable] " Greg KH
2008-06-07 16:51 ` Linus Torvalds
2008-06-07 3:14 ` Jeff Garzik
2008-06-07 1:02 ` [patch 11/50] memory_hotplug: always initialize pageblock bitmap Chris Wright
2008-06-07 1:02 ` [patch 12/50] USB: fix build errors in ohci-omap.c and ohci-sm501.c Chris Wright
2008-06-07 1:02 ` [patch 13/50] i2c-nforce2: Disable the second SMBus channel on the DFI Lanparty NF4 Expert Chris Wright
2008-06-07 1:02 ` [patch 14/50] i2c/max6875: Really prevent 24RF08 corruption Chris Wright
2008-06-07 1:02 ` [patch 15/50] x86: user_regset_view table fix for ia32 on 64-bit Chris Wright
2008-06-07 1:02 ` [patch 16/50] i386: fix asm constraint in do_IRQ() Chris Wright
2008-06-07 1:02 ` [patch 17/50] CIFS: Fix UNC path prefix on QueryUnixPathInfo to have correct slash Chris Wright
2008-06-07 1:02 ` [patch 18/50] USB: add TELIT HDSPA UC864-E modem to option driver Chris Wright
2008-06-07 1:02 ` [patch 19/50] usb-serial: Use ftdi_sio driver for RATOC REX-USB60F Chris Wright
2008-06-07 1:02 ` [patch 20/50] cgroups: remove node_ prefix_from ns subsystem Chris Wright
2008-06-07 1:02 ` [patch 21/50] brd: dont show ramdisks in /proc/partitions Chris Wright
2008-06-07 21:51 ` H. Peter Anvin
2008-06-09 17:08 ` [stable] " Chris Wright
2008-06-09 19:49 ` Willy Tarreau
2008-06-09 20:28 ` H. Peter Anvin
2008-06-07 1:02 ` [patch 22/50] types.h: dont expose struct ustat to userspace Chris Wright
2008-06-07 1:02 ` [patch 23/50] x86: dont read maxlvt before checking if APIC is mapped Chris Wright
2008-06-07 1:02 ` [patch 24/50] IPoIB: Test for NULL broadcast object in ipiob_mcast_join_finish() Chris Wright
2008-06-07 1:02 ` [patch 25/50] x86: fix setup of cyc2ns in tsc_64.c Chris Wright
2008-06-07 1:02 ` [patch 26/50] x86: if we cannot calibrate the TSC, we panic Chris Wright
2008-06-07 1:02 ` [patch 27/50] x86: distangle user disabled TSC from unstable Chris Wright
2008-06-07 1:02 ` [patch 28/50] x86: disable TSC for sched_clock() when calibration failed Chris Wright
2008-06-07 1:02 ` [patch 29/50] XFS: Fix memory corruption with small buffer reads Chris Wright
2008-06-07 1:02 ` [patch 30/50] x86: prevent PGE flush from interruption/preemption Chris Wright
2008-06-07 1:02 ` [patch 31/50] Revert "PCI: remove default PCI expansion ROM memory allocation" Chris Wright
2008-06-07 1:02 ` [patch 32/50] PS3: gelic: fix memory leak Chris Wright
2008-06-07 1:02 ` [patch 33/50] netfilter: xt_iprange: module aliases for xt_iprange Chris Wright
2008-06-07 1:02 ` [patch 34/50] HID: split Numlock emulation quirk from HID_QUIRK_APPLE_HAS_FN Chris Wright
2008-06-07 1:02 ` [patch 35/50] CPUFREQ: Make acpi-cpufreq more robust against BIOS freq changes behind our back Chris Wright
2008-06-07 1:02 ` [patch 36/50] x86, fpu: fix CONFIG_PREEMPT=y corruption of applications FPU stack Chris Wright
2008-06-07 1:02 ` [patch 37/50] netfilter: nf_conntrack_expect: fix error path unwind in nf_conntrack_expect_init() Chris Wright
2008-06-07 1:02 ` [patch 38/50] netfilter: xt_connlimit: fix accouning when receive RST packet in ESTABLISHED state Chris Wright
2008-06-07 1:02 ` [patch 39/50] netfilter: nf_conntrack_ipv6: fix inconsistent lock state in nf_ct_frag6_gather() Chris Wright
2008-06-07 1:02 ` [patch 40/50] atl1: fix 4G memory corruption bug Chris Wright
2008-06-07 1:02 ` [patch 41/50] Smack: fuse mount hang fix Chris Wright
2008-06-07 1:02 ` [patch 42/50] proc: calculate the correct /proc/<pid> link count Chris Wright
2008-06-07 1:02 ` [patch 43/50] pagemap: fix bug in add_to_pagemap, require aligned-length reads of /proc/pid/pagemap Chris Wright
2008-06-07 1:02 ` [patch 44/50] brk: make sys_brk() honor COMPAT_BRK when computing lower bound Chris Wright
2008-06-07 1:03 ` [patch 45/50] eCryptfs: remove unnecessary page decrypt call Chris Wright
2008-06-07 1:03 ` [patch 46/50] md: do not compute parity unless it is on a failed drive Chris Wright
2008-06-07 1:03 ` [patch 47/50] md: fix uninitialized use of mddev->recovery_wait Chris Wright
2008-06-07 1:03 ` Chris Wright [this message]
2008-06-07 1:03 ` [patch 49/50] capabilities: remain source compatible with 32-bit raw legacy capability support Chris Wright
2008-06-07 1:03 ` [patch 50/50] cpufreq: fix null object access on Transmeta CPU Chris Wright
2008-06-07 3:49 ` [patch 00/50] 2.6.25.6 -stable review Hugh Dickins
2008-06-07 4:24 ` [stable] " Chris Wright
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080607010636.182581291@sous-sol.org \
--to=chrisw@sous-sol.org \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=cavokz@gmail.com \
--cc=cebbert@redhat.com \
--cc=chuckw@quantumlinux.com \
--cc=dan.j.williams@intel.com \
--cc=davej@redhat.com \
--cc=jejb@kernel.org \
--cc=jmforbes@linuxtx.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mkrufky@linuxtv.org \
--cc=neilb@suse.de \
--cc=rdunlap@xenotime.net \
--cc=reviews@ml.cw.f00f.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
--cc=zwane@arm.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.