From: Greg KH <gregkh@suse.de>
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>, Willy Tarreau <w@1wt.eu>,
Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
Jake Edge <jake@lwn.net>, Eugene Teo <eteo@redhat.com>,
torvalds@linux-foundation.org, akpm@linux-foundation.org,
alan@lxorguk.ukuu.org.uk, Mikulas Patocka <mpatocka@redhat.com>,
Alasdair G Kergon <agk@redhat.com>
Subject: [patch 10/27] dm snapshot: fix primary_pe race
Date: Thu, 23 Oct 2008 21:34:13 -0700 [thread overview]
Message-ID: <20081024043413.GK30828@kroah.com> (raw)
In-Reply-To: <20081024043303.GA30828@kroah.com>
[-- Attachment #1: dm-snapshot-fix-primary_pe-race.patch --]
[-- Type: text/plain, Size: 3720 bytes --]
2.6.27-stable review patch. If anyone has any objections, please let us
know.
------------------
From: Mikulas Patocka <mpatocka@redhat.com>
commit 7c5f78b9d7f21937e46c26db82976df4b459c95c upstream
Fix a race condition with primary_pe ref_count handling.
put_pending_exception runs under dm_snapshot->lock, it does atomic_dec_and_test
on primary_pe->ref_count, and later does atomic_read primary_pe->ref_count.
__origin_write does atomic_dec_and_test on primary_pe->ref_count without holding
dm_snapshot->lock.
This opens the following race condition:
Assume two CPUs, CPU1 is executing put_pending_exception (and holding
dm_snapshot->lock). CPU2 is executing __origin_write in parallel.
primary_pe->ref_count == 2.
CPU1:
if (primary_pe && atomic_dec_and_test(&primary_pe->ref_count))
origin_bios = bio_list_get(&primary_pe->origin_bios);
.. decrements primary_pe->ref_count to 1. Doesn't load origin_bios
CPU2:
if (first && atomic_dec_and_test(&primary_pe->ref_count)) {
flush_bios(bio_list_get(&primary_pe->origin_bios));
free_pending_exception(primary_pe);
/* If we got here, pe_queue is necessarily empty. */
return r;
}
.. decrements primary_pe->ref_count to 0, submits pending bios, frees
primary_pe.
CPU1:
if (!primary_pe || primary_pe != pe)
free_pending_exception(pe);
.. this has no effect.
if (primary_pe && !atomic_read(&primary_pe->ref_count))
free_pending_exception(primary_pe);
.. sees ref_count == 0 (written by CPU 2), does double free !!
This bug can happen only if someone is simultaneously writing to both the
origin and the snapshot.
If someone is writing only to the origin, __origin_write will submit kcopyd
request after it decrements primary_pe->ref_count (so it can't happen that the
finished copy races with primary_pe->ref_count decrementation).
If someone is writing only to the snapshot, __origin_write isn't invoked at all
and the race can't happen.
The race happens when someone writes to the snapshot --- this creates
pending_exception with primary_pe == NULL and starts copying. Then, someone
writes to the same chunk in the snapshot, and __origin_write races with
termination of already submitted request in pending_complete (that calls
put_pending_exception).
This race may be reason for bugs:
http://bugzilla.kernel.org/show_bug.cgi?id=11636
https://bugzilla.redhat.com/show_bug.cgi?id=465825
The patch fixes the code to make sure that:
1. If atomic_dec_and_test(&primary_pe->ref_count) returns false, the process
must no longer dereference primary_pe (because someone else may free it under
us).
2. If atomic_dec_and_test(&primary_pe->ref_count) returns true, the process
is responsible for freeing primary_pe.
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/md/dm-snap.c | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
--- a/drivers/md/dm-snap.c
+++ b/drivers/md/dm-snap.c
@@ -824,8 +824,10 @@ static struct bio *put_pending_exception
* the bios for the original write to the origin.
*/
if (primary_pe &&
- atomic_dec_and_test(&primary_pe->ref_count))
+ atomic_dec_and_test(&primary_pe->ref_count)) {
origin_bios = bio_list_get(&primary_pe->origin_bios);
+ free_pending_exception(primary_pe);
+ }
/*
* Free the pe if it's not linked to an origin write or if
@@ -834,12 +836,6 @@ static struct bio *put_pending_exception
if (!primary_pe || primary_pe != pe)
free_pending_exception(pe);
- /*
- * Free the primary pe if nothing references it.
- */
- if (primary_pe && !atomic_read(&primary_pe->ref_count))
- free_pending_exception(primary_pe);
-
return origin_bios;
}
--
next prev parent reply other threads:[~2008-10-24 4:43 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20081024042023.054190751@mini.kroah.org>
2008-10-24 4:33 ` [patch 00/27] 2.6.27.4-stable review Greg KH
2008-10-24 4:33 ` [patch 01/27] gpiolib: fix oops in gpio_get_value_cansleep() Greg KH
2008-10-24 4:33 ` [patch 02/27] edac cell: fix incorrect edac_mode Greg KH
2008-10-24 4:33 ` [patch 03/27] x86 ACPI: fix breakage of resume on 64-bit UP systems with SMP kernel Greg KH
2008-10-24 4:33 ` [patch 04/27] sched: fix the wrong mask_len Greg KH
2008-10-24 4:33 ` [patch 05/27] USB: cdc-wdm: make module autoload work Greg KH
2008-10-24 4:33 ` [patch 06/27] USB: dont rebind drivers after failed resume or reset Greg KH
2008-10-24 4:33 ` [patch 07/27] USB: fix memory leak in cdc-acm Greg KH
2008-10-24 4:34 ` [patch 08/27] USB: Speedtouch: add pre_reset and post_reset routines Greg KH
2008-10-24 4:34 ` [patch 09/27] dm kcopyd: avoid queue shuffle Greg KH
2008-10-24 4:34 ` Greg KH [this message]
2008-10-24 4:34 ` [patch 11/27] dm exception store: refactor zero_area Greg KH
2008-10-24 5:36 ` Greg KH
2008-10-25 1:40 ` Mikulas Patocka
2008-10-25 20:28 ` Greg KH
2008-10-24 4:34 ` [patch 12/27] dm exception store: fix misordered writes Greg KH
2008-10-24 4:34 ` [patch 13/27] amd_iommu: fix nasty bug that caused ILLEGAL_DEVICE_TABLE_ENTRY errors Greg KH
2008-10-24 4:34 ` [patch 14/27] CIFS: fix saving of resume key before CIFSFindNext Greg KH
2008-10-24 4:34 ` [patch 15/27] ext: Avoid printk floods in the face of directory corruption (CVE-2008-3528) Greg KH
2008-10-24 4:34 ` [patch 16/27] netfilter: xt_iprange: fix range inversion match Greg KH
2008-10-24 4:34 ` [patch 17/27] netfilter: snmp nat leaks memory in case of failure Greg KH
2008-10-24 4:34 ` Greg KH
2008-10-24 4:34 ` [patch 18/27] netfilter: restore lost ifdef guarding defrag exception Greg KH
2008-10-24 4:34 ` [patch 19/27] anon_vma_prepare: properly lock even newly allocated entries Greg KH
2008-10-24 4:34 ` [patch 20/27] hvc_console: Fix free_irq in spinlocked section Greg KH
2008-10-24 4:35 ` [patch 21/27] ACPI Suspend: Enable ACPI during resume if SCI_EN is not set Greg KH
2008-10-24 4:35 ` [patch 22/27] ACPI suspend: Blacklist HP xw4600 Workstation for old code ordering Greg KH
2008-10-24 4:35 ` [patch 23/27] ACPI suspend: Always use the 32-bit waking vector Greg KH
2008-10-24 4:35 ` [patch 24/27] proc: fix vma display mismatch between /proc/pid/{maps,smaps} Greg KH
2008-10-24 4:35 ` [patch 25/27] SCSI: scsi_dh: add Dell product information into rdac device handler Greg KH
2008-10-24 4:35 ` [patch 26/27] PCI hotplug: cpqphp: fix kernel NULL pointer dereference Greg KH
2008-10-24 4:35 ` [patch 27/27] ath5k: fix suspend-related oops on rmmod Greg KH
2008-10-24 20:36 ` Elias Oltmanns
2008-10-24 21:10 ` Bob Copeland
2008-10-24 21:28 ` Greg KH
2008-10-24 5:41 ` [patch 00/27] 2.6.27.4-stable review Greg KH
2008-10-24 21:38 ` [stable] " Greg KH
2008-10-24 21:40 ` [patch 28/27] V4L/DVB (9300): pvrusb2: Fix deadlock problem Greg KH
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=20081024043413.GK30828@kroah.com \
--to=gregkh@suse.de \
--cc=agk@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=cavokz@gmail.com \
--cc=cebbert@redhat.com \
--cc=chuckw@quantumlinux.com \
--cc=davej@redhat.com \
--cc=eteo@redhat.com \
--cc=jake@lwn.net \
--cc=jejb@kernel.org \
--cc=jmforbes@linuxtx.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mkrufky@linuxtv.org \
--cc=mpatocka@redhat.com \
--cc=rbranco@la.checkpoint.com \
--cc=rdunlap@xenotime.net \
--cc=reviews@ml.cw.f00f.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
--cc=w@1wt.eu \
--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.