Skip to content

Commit

Permalink
[S390] cio: ccw group fix unbind behaviour.
Browse files Browse the repository at this point in the history
For a ccw group device unbinding it from its driver should do the
same as a call to ungroup, since this virtual device can not exist
without a driver.

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 Mar 26, 2009
1 parent 50f1548 commit e909074
Showing 1 changed file with 36 additions and 6 deletions.
42 changes: 36 additions & 6 deletions drivers/s390/cio/ccwgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -314,16 +314,32 @@ int ccwgroup_create_from_string(struct device *root, unsigned int creator_id,
}
EXPORT_SYMBOL(ccwgroup_create_from_string);

static int __init
init_ccwgroup (void)
static int ccwgroup_notifier(struct notifier_block *nb, unsigned long action,
void *data);

static struct notifier_block ccwgroup_nb = {
.notifier_call = ccwgroup_notifier
};

static int __init init_ccwgroup(void)
{
return bus_register (&ccwgroup_bus_type);
int ret;

ret = bus_register(&ccwgroup_bus_type);
if (ret)
return ret;

ret = bus_register_notifier(&ccwgroup_bus_type, &ccwgroup_nb);
if (ret)
bus_unregister(&ccwgroup_bus_type);

return ret;
}

static void __exit
cleanup_ccwgroup (void)
static void __exit cleanup_ccwgroup(void)
{
bus_unregister (&ccwgroup_bus_type);
bus_unregister_notifier(&ccwgroup_bus_type, &ccwgroup_nb);
bus_unregister(&ccwgroup_bus_type);
}

module_init(init_ccwgroup);
Expand Down Expand Up @@ -455,6 +471,7 @@ ccwgroup_remove (struct device *dev)
struct ccwgroup_driver *gdrv;

device_remove_file(dev, &dev_attr_online);
device_remove_file(dev, &dev_attr_ungroup);

if (!dev->driver)
return 0;
Expand Down Expand Up @@ -492,6 +509,19 @@ static struct bus_type ccwgroup_bus_type = {
.shutdown = ccwgroup_shutdown,
};


static int ccwgroup_notifier(struct notifier_block *nb, unsigned long action,
void *data)
{
struct device *dev = data;

if (action == BUS_NOTIFY_UNBIND_DRIVER)
device_schedule_callback(dev, ccwgroup_ungroup_callback);

return NOTIFY_OK;
}


/**
* ccwgroup_driver_register() - register a ccw group driver
* @cdriver: driver to be registered
Expand Down

0 comments on commit e909074

Please sign in to comment.