From: Gerald Schaefer Date: Mon, 5 Nov 2007 10:10:09 +0000 (+0100) Subject: [S390] device_schedule_callback() for dcssblk. X-Git-Tag: v2.6.24-rc2~32^2~5 X-Git-Url: http://www.pilppa.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=931bb68ba6355b7111966c90822ed862c102a9cd;p=linux-2.6-omap-h63xx.git [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 Signed-off-by: Martin Schwidefsky --- diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c index 859f870552e..5e083d1f57e 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) } } +static void dcssblk_unregister_callback(struct device *dev) +{ + device_unregister(dev); + put_device(dev); +} + /* * device attribute for switching shared/nonshared (exclusive) * operation (show + store) @@ -276,8 +282,7 @@ removeseg: 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;