Skip to content

Commit

Permalink
s390/ccwgroup: obtain extra reference for asynchronous processing
Browse files Browse the repository at this point in the history
Commit 0b60f9e
"s390: use device_remove_file_self() instead of device_schedule_callback()"
changed ccwgroup to use an extra work queue instead of
device_schedule_callback. This function obtained an extra device
reference for its async work which is missing in the new implementation
and results in a "freeing memory with a lock still held" BUG. Fix
this by obtaining an extra reference for the async work.

Reported-by: Stefan Raspl <raspl@linux.vnet.ibm.com>
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
  • Loading branch information
Sebastian Ott authored and Martin Schwidefsky committed Jun 16, 2014
1 parent 613c4e0 commit 9280ddb
Showing 1 changed file with 4 additions and 1 deletion.
5 changes: 4 additions & 1 deletion drivers/s390/cio/ccwgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ static void ccwgroup_ungroup_workfn(struct work_struct *work)
container_of(work, struct ccwgroup_device, ungroup_work);

ccwgroup_ungroup(gdev);
put_device(&gdev->dev);
}

static void ccwgroup_release(struct device *dev)
Expand Down Expand Up @@ -412,8 +413,10 @@ static int ccwgroup_notifier(struct notifier_block *nb, unsigned long action,
{
struct ccwgroup_device *gdev = to_ccwgroupdev(data);

if (action == BUS_NOTIFY_UNBIND_DRIVER)
if (action == BUS_NOTIFY_UNBIND_DRIVER) {
get_device(&gdev->dev);
schedule_work(&gdev->ungroup_work);
}

return NOTIFY_OK;
}
Expand Down

0 comments on commit 9280ddb

Please sign in to comment.