Skip to content

Commit

Permalink
fix deadlock in loop.c
Browse files Browse the repository at this point in the history
... doh

Jeremy Fitzhardinge noted that the recent loop.c cleanups worked, but
cause lockdep to complain.

Ouch.  OK, the deadlock is real and yes, I'm an idiot.  Speaking of which,
we probably want to s/lock/pin/ in drivers/base/map.c to avoid such
brainos again.  And yes, this stuff needs clear documentation.  Will try
to put one together once I get some sleep...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Al Viro authored and Linus Torvalds committed May 13, 2007
1 parent 3940386 commit 705962c
Showing 1 changed file with 9 additions and 8 deletions.
17 changes: 9 additions & 8 deletions drivers/block/loop.c
Original file line number Diff line number Diff line change
Expand Up @@ -1399,6 +1399,11 @@ static struct loop_device *loop_init_one(int i)
struct loop_device *lo;
struct gendisk *disk;

list_for_each_entry(lo, &loop_devices, lo_list) {
if (lo->lo_number == i)
return lo;
}

lo = kzalloc(sizeof(*lo), GFP_KERNEL);
if (!lo)
goto out;
Expand Down Expand Up @@ -1443,17 +1448,13 @@ static void loop_del_one(struct loop_device *lo)
kfree(lo);
}

static int loop_lock(dev_t dev, void *data)
{
mutex_lock(&loop_devices_mutex);
return 0;
}

static struct kobject *loop_probe(dev_t dev, int *part, void *data)
{
struct loop_device *lo = loop_init_one(dev & MINORMASK);
struct loop_device *lo;
struct kobject *kobj;

mutex_lock(&loop_devices_mutex);
lo = loop_init_one(dev & MINORMASK);
kobj = lo ? get_disk(lo->lo_disk) : ERR_PTR(-ENOMEM);
mutex_unlock(&loop_devices_mutex);

Expand All @@ -1466,7 +1467,7 @@ static int __init loop_init(void)
if (register_blkdev(LOOP_MAJOR, "loop"))
return -EIO;
blk_register_region(MKDEV(LOOP_MAJOR, 0), 1UL << MINORBITS,
THIS_MODULE, loop_probe, loop_lock, NULL);
THIS_MODULE, loop_probe, NULL, NULL);

if (max_loop) {
printk(KERN_INFO "loop: the max_loop option is obsolete "
Expand Down

0 comments on commit 705962c

Please sign in to comment.