Skip to content

Commit

Permalink
[S390] device_schedule_callback() for dcssblk.
Browse files Browse the repository at this point in the history
Unregistering a device from within a device attribute handler leads to
a deadlock. Need to use device_schedule_callback() to unregister device
in error path.

Signed-off-by: Gerald Schaefer <geraldsc@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
  • Loading branch information
Gerald Schaefer authored and Martin Schwidefsky committed Nov 5, 2007
1 parent 0fc3ddd commit 931bb68
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions drivers/s390/block/dcssblk.c
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,12 @@ dcssblk_segment_warn(int rc, char* seg_name)
}
}

static void dcssblk_unregister_callback(struct device *dev)
{
device_unregister(dev);
put_device(dev);
}

/*
* device attribute for switching shared/nonshared (exclusive)
* operation (show + store)
Expand Down Expand Up @@ -276,8 +282,7 @@ dcssblk_shared_store(struct device *dev, struct device_attribute *attr, const ch
blk_cleanup_queue(dev_info->dcssblk_queue);
dev_info->gd->queue = NULL;
put_disk(dev_info->gd);
device_unregister(dev);
put_device(dev);
rc = device_schedule_callback(dev, dcssblk_unregister_callback);
out:
up_write(&dcssblk_devices_sem);
return rc;
Expand Down

0 comments on commit 931bb68

Please sign in to comment.