LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: Martin Schwidefsky <schwidefsky@de.ibm.com>
To: linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org
Cc: Stefan Weinhuber <wein@de.ibm.com>,
	Martin Schwidefsky <schwidefsky@de.ibm.com>
Subject: [patch 05/13] dasd: fix locking in __dasd_device_process_final_queue
Date: Tue, 19 Feb 2008 15:40:52 +0100	[thread overview]
Message-ID: <20080219144503.894881790@de.ibm.com> (raw)
In-Reply-To: <20080219144047.587547541@de.ibm.com>

[-- Attachment #1: 005-dasd-locking.diff --]
[-- Type: text/plain, Size: 1947 bytes --]

From: Stefan Weinhuber <wein@de.ibm.com>

After setting the status of the cqr and releasing the lock for the
block cqr queue, we call the cqr callback function, which will usually
just trigger the dasd_block_tasklet. But when the tasklet is already
running the cqr might be processed before we invoke the callback
function. In rare cases the callback pointer may already be invalid
by the time we want to call it, which will result in a panic.
Solution: Call the callback function first and then release the lock.

Signed-off-by: Stefan Weinhuber <wein@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
---

 drivers/s390/block/dasd.c |   12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

Index: quilt-2.6/drivers/s390/block/dasd.c
===================================================================
--- quilt-2.6.orig/drivers/s390/block/dasd.c
+++ quilt-2.6/drivers/s390/block/dasd.c
@@ -1149,12 +1149,14 @@ static void __dasd_device_process_final_
 {
 	struct list_head *l, *n;
 	struct dasd_ccw_req *cqr;
+	struct dasd_block *block;
 
 	list_for_each_safe(l, n, final_queue) {
 		cqr = list_entry(l, struct dasd_ccw_req, devlist);
 		list_del_init(&cqr->devlist);
-		if (cqr->block)
-			spin_lock_bh(&cqr->block->queue_lock);
+		block = cqr->block;
+		if (block)
+			spin_lock_bh(&block->queue_lock);
 		switch (cqr->status) {
 		case DASD_CQR_SUCCESS:
 			cqr->status = DASD_CQR_DONE;
@@ -1172,15 +1174,13 @@ static void __dasd_device_process_final_
 				    cqr, cqr->status);
 			BUG();
 		}
-		if (cqr->block)
-			spin_unlock_bh(&cqr->block->queue_lock);
 		if (cqr->callback != NULL)
 			(cqr->callback)(cqr, cqr->callback_data);
+		if (block)
+			spin_unlock_bh(&block->queue_lock);
 	}
 }
 
-
-
 /*
  * Take a look at the first request on the ccw queue and check
  * if it reached its expire time. If so, terminate the IO.

-- 
blue skies,
   Martin.

"Reality continues to ruin my life." - Calvin.


  parent reply	other threads:[~2008-02-19 14:47 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-19 14:40 [patch 00/13] s390 bux fixes for 2.6.25-rc2 Martin Schwidefsky
2008-02-19 14:40 ` [patch 01/13] cio: Remember to initialize recovery_lock Martin Schwidefsky
2008-02-19 14:40 ` [patch 02/13] cio: Do timed recovery on workqueue Martin Schwidefsky
2008-02-19 14:40 ` [patch 03/13] Let NR_CPUS default to 32/64 on s390/s390x Martin Schwidefsky
2008-02-19 14:40 ` [patch 04/13] Make sure enabled wait psw is loaded in default_idle Martin Schwidefsky
2008-02-19 14:40 ` Martin Schwidefsky [this message]
2008-02-19 14:40 ` [patch 06/13] find bit corner case Martin Schwidefsky
2008-02-19 14:40 ` [patch 07/13] Initialize per cpu lowcores on cpu hotplug Martin Schwidefsky
2008-02-19 15:13   ` Bastian Blank
2008-02-19 15:38     ` Heiko Carstens
2008-02-19 15:41       ` Heiko Carstens
2008-02-19 18:44         ` Segher Boessenkool
2008-02-20  9:45           ` Heiko Carstens
2008-02-20 10:09             ` Bastian Blank
2008-02-20 10:24               ` Heiko Carstens
2008-02-19 14:40 ` [patch 08/13] qdio: fix qdio_activate timeout handling Martin Schwidefsky
2008-02-19 14:40 ` [patch 09/13] etr: fix compile error on !SMP Martin Schwidefsky
2008-02-19 14:40 ` [patch 10/13] sclp: clean up send/receive naming scheme Martin Schwidefsky
2008-02-19 14:40 ` [patch 11/13] dcss: Fix Unlikely(x) != y Martin Schwidefsky
2008-02-19 14:40 ` [patch 12/13] Fix futex_atomic_cmpxchg_std inline assembly Martin Schwidefsky
2008-02-19 14:41 ` [patch 13/13] qdio: FCP/SCSI write I/O stagnates on LPAR Martin Schwidefsky

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=20080219144503.894881790@de.ibm.com \
    --to=schwidefsky@de.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=wein@de.ibm.com \
    --subject='Re: [patch 05/13] dasd: fix locking in __dasd_device_process_final_queue' \
    /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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).