Merge branch 'for-linus' of git://neil.brown.name/md
* 'for-linus' of git://neil.brown.name/md: md: fix deadlock when stopping arrays
This commit is contained in:
commit
bad948ffee
|
@ -214,12 +214,7 @@ static inline mddev_t *mddev_get(mddev_t *mddev)
|
||||||
return mddev;
|
return mddev;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mddev_delayed_delete(struct work_struct *ws)
|
static void mddev_delayed_delete(struct work_struct *ws);
|
||||||
{
|
|
||||||
mddev_t *mddev = container_of(ws, mddev_t, del_work);
|
|
||||||
kobject_del(&mddev->kobj);
|
|
||||||
kobject_put(&mddev->kobj);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mddev_put(mddev_t *mddev)
|
static void mddev_put(mddev_t *mddev)
|
||||||
{
|
{
|
||||||
|
@ -3542,6 +3537,21 @@ static struct kobj_type md_ktype = {
|
||||||
|
|
||||||
int mdp_major = 0;
|
int mdp_major = 0;
|
||||||
|
|
||||||
|
static void mddev_delayed_delete(struct work_struct *ws)
|
||||||
|
{
|
||||||
|
mddev_t *mddev = container_of(ws, mddev_t, del_work);
|
||||||
|
|
||||||
|
if (mddev->private == &md_redundancy_group) {
|
||||||
|
sysfs_remove_group(&mddev->kobj, &md_redundancy_group);
|
||||||
|
if (mddev->sysfs_action)
|
||||||
|
sysfs_put(mddev->sysfs_action);
|
||||||
|
mddev->sysfs_action = NULL;
|
||||||
|
mddev->private = NULL;
|
||||||
|
}
|
||||||
|
kobject_del(&mddev->kobj);
|
||||||
|
kobject_put(&mddev->kobj);
|
||||||
|
}
|
||||||
|
|
||||||
static int md_alloc(dev_t dev, char *name)
|
static int md_alloc(dev_t dev, char *name)
|
||||||
{
|
{
|
||||||
static DEFINE_MUTEX(disks_mutex);
|
static DEFINE_MUTEX(disks_mutex);
|
||||||
|
@ -4033,13 +4043,9 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
|
||||||
mddev->queue->merge_bvec_fn = NULL;
|
mddev->queue->merge_bvec_fn = NULL;
|
||||||
mddev->queue->unplug_fn = NULL;
|
mddev->queue->unplug_fn = NULL;
|
||||||
mddev->queue->backing_dev_info.congested_fn = NULL;
|
mddev->queue->backing_dev_info.congested_fn = NULL;
|
||||||
if (mddev->pers->sync_request) {
|
|
||||||
sysfs_remove_group(&mddev->kobj, &md_redundancy_group);
|
|
||||||
if (mddev->sysfs_action)
|
|
||||||
sysfs_put(mddev->sysfs_action);
|
|
||||||
mddev->sysfs_action = NULL;
|
|
||||||
}
|
|
||||||
module_put(mddev->pers->owner);
|
module_put(mddev->pers->owner);
|
||||||
|
if (mddev->pers->sync_request)
|
||||||
|
mddev->private = &md_redundancy_group;
|
||||||
mddev->pers = NULL;
|
mddev->pers = NULL;
|
||||||
/* tell userspace to handle 'inactive' */
|
/* tell userspace to handle 'inactive' */
|
||||||
sysfs_notify_dirent(mddev->sysfs_state);
|
sysfs_notify_dirent(mddev->sysfs_state);
|
||||||
|
|
Loading…
Reference in New Issue