diff options
| author | Gerald Schaefer <geraldsc@de.ibm.com> | 2007-11-05 05:10:09 -0500 |
|---|---|---|
| committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2007-11-05 05:10:16 -0500 |
| commit | 931bb68ba6355b7111966c90822ed862c102a9cd (patch) | |
| tree | 33899e3be8cfd386a79cc67b72b4bb8b2b963ac2 /drivers/s390/block | |
| parent | 0fc3ddd67a6781238b038165d9dd8c1f9ba81111 (diff) | |
[S390] device_schedule_callback() for dcssblk.
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>
Diffstat (limited to 'drivers/s390/block')
| -rw-r--r-- | drivers/s390/block/dcssblk.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c index 859f870552..5e083d1f57 100644 --- a/drivers/s390/block/dcssblk.c +++ b/drivers/s390/block/dcssblk.c | |||
| @@ -193,6 +193,12 @@ dcssblk_segment_warn(int rc, char* seg_name) | |||
| 193 | } | 193 | } |
| 194 | } | 194 | } |
| 195 | 195 | ||
| 196 | static void dcssblk_unregister_callback(struct device *dev) | ||
| 197 | { | ||
| 198 | device_unregister(dev); | ||
| 199 | put_device(dev); | ||
| 200 | } | ||
| 201 | |||
| 196 | /* | 202 | /* |
| 197 | * device attribute for switching shared/nonshared (exclusive) | 203 | * device attribute for switching shared/nonshared (exclusive) |
| 198 | * operation (show + store) | 204 | * operation (show + store) |
| @@ -276,8 +282,7 @@ removeseg: | |||
| 276 | blk_cleanup_queue(dev_info->dcssblk_queue); | 282 | blk_cleanup_queue(dev_info->dcssblk_queue); |
| 277 | dev_info->gd->queue = NULL; | 283 | dev_info->gd->queue = NULL; |
| 278 | put_disk(dev_info->gd); | 284 | put_disk(dev_info->gd); |
| 279 | device_unregister(dev); | 285 | rc = device_schedule_callback(dev, dcssblk_unregister_callback); |
| 280 | put_device(dev); | ||
| 281 | out: | 286 | out: |
| 282 | up_write(&dcssblk_devices_sem); | 287 | up_write(&dcssblk_devices_sem); |
| 283 | return rc; | 288 | return rc; |
