All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] loop: queue_lock NULL pointer derefence in blk_throtl_exit
@ 2011-01-14 19:25 Sergey Senozhatsky
  2011-01-20  0:32 ` Jens Axboe
  2011-01-20 11:32 ` Vivek Goyal
  0 siblings, 2 replies; 8+ messages in thread
From: Sergey Senozhatsky @ 2011-01-14 19:25 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Philipp Reisner, Andrew Morton, Lars Ellenberg,
	Stephen M. Cameron, linux-kernel

Performing 
$ sudo mount -o loop -o umask=0 /dev/sdb1 /mnt/
mount: wrong fs type, bad option, bad superblock on /dev/loop0,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so

$ sudo modprobe -r loop

results in oops:

 BUG: unable to handle kernel NULL pointer dereference at 0000000000000004
 IP: [<ffffffff812479d4>] do_raw_spin_lock+0x14/0x122
 Process modprobe (pid: 6189, threadinfo ffff88009a898000, task ffff880154a88000)
 Call Trace:
  [<ffffffff81486788>] _raw_spin_lock_irq+0x4a/0x51
  [<ffffffff8123404b>] ? blk_throtl_exit+0x3b/0xa0
  [<ffffffff8105b120>] ? cancel_delayed_work_sync+0xd/0xf
  [<ffffffff8123404b>] blk_throtl_exit+0x3b/0xa0
  [<ffffffff81229bc8>] blk_release_queue+0x21/0x65
  [<ffffffff8123bb06>] kobject_release+0x51/0x66
  [<ffffffff8123bab5>] ? kobject_release+0x0/0x66
  [<ffffffff8123ce1e>] kref_put+0x43/0x4d
  [<ffffffff8123ba27>] kobject_put+0x47/0x4b
  [<ffffffff8122717c>] blk_cleanup_queue+0x56/0x5b
  [<ffffffffa01c3824>] loop_exit+0x68/0x844 [loop]
  [<ffffffff8107cccc>] sys_delete_module+0x1e8/0x25b
  [<ffffffff814864c9>] ? trace_hardirqs_on_thunk+0x3a/0x3f
  [<ffffffff81002112>] system_call_fastpath+0x16/0x1b


because of an attempt to acquire NULL queue_lock.
I added the same lines as in blk_queue_make_request - 
`fall back to embedded per-queue lock'.

Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>

---

 drivers/block/loop.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 44e18c0..49e6a54 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -1641,6 +1641,9 @@ out:
 
 static void loop_free(struct loop_device *lo)
 {
+	if (!lo->lo_queue->queue_lock)
+		lo->lo_queue->queue_lock = &lo->lo_queue->__queue_lock;
+
 	blk_cleanup_queue(lo->lo_queue);
 	put_disk(lo->lo_disk);
 	list_del(&lo->lo_list);


^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2011-01-21 12:55 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-01-14 19:25 [PATCH] loop: queue_lock NULL pointer derefence in blk_throtl_exit Sergey Senozhatsky
2011-01-20  0:32 ` Jens Axboe
2011-01-20 11:32 ` Vivek Goyal
2011-01-20 12:58   ` [PATCH] loop: queue_lock NULL pointer derefence in blk_throtl_exit (v2) Sergey Senozhatsky
2011-01-20 14:35     ` Vivek Goyal
2011-01-20 15:18       ` Sergey Senozhatsky
2011-01-20 15:43         ` Vivek Goyal
2011-01-21 12:55           ` [PATCH] loop: queue_lock NULL pointer derefence in blk_throtl_exit (v3) Sergey Senozhatsky

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.