Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cc095f0a authored by Corey Minyard's avatar Corey Minyard
Browse files

ipmi: Fix some error cleanup issues



device_remove_group() was called on any cleanup, even if the
device attrs had not been added yet.  That can occur in certain
error scenarios, so add a flag to know if it has been added.

Also make sure we remove the dev if we added it ourselves.

Signed-off-by: default avatarCorey Minyard <cminyard@mvista.com>
Cc: stable@vger.kernel.org # 4.15
Cc: Laura Abbott <labbott@redhat.com>
Tested-by: default avatarBill Perkins <wmp@grnwood.net>
parent 243ac210
Loading
Loading
Loading
Loading
+14 −4
Original line number Diff line number Diff line
@@ -232,6 +232,9 @@ struct smi_info {
	/* Default driver model device. */
	struct platform_device *pdev;

	/* Have we added the device group to the device? */
	bool dev_group_added;

	/* Counters and things for the proc filesystem. */
	atomic_t stats[SI_NUM_STATS];

@@ -2007,8 +2010,8 @@ int ipmi_si_add_smi(struct si_sm_io *io)
	if (initialized) {
		rv = try_smi_init(new_smi);
		if (rv) {
			mutex_unlock(&smi_infos_lock);
			cleanup_one_si(new_smi);
			mutex_unlock(&smi_infos_lock);
			return rv;
		}
	}
@@ -2167,6 +2170,7 @@ static int try_smi_init(struct smi_info *new_smi)
			rv);
		goto out_err_stop_timer;
	}
	new_smi->dev_group_added = true;

	rv = ipmi_register_smi(&handlers,
			       new_smi,
@@ -2220,7 +2224,10 @@ static int try_smi_init(struct smi_info *new_smi)
	return 0;

out_err_remove_attrs:
	if (new_smi->dev_group_added) {
		device_remove_group(new_smi->io.dev, &ipmi_si_dev_attr_group);
		new_smi->dev_group_added = false;
	}
	dev_set_drvdata(new_smi->io.dev, NULL);

out_err_stop_timer:
@@ -2268,6 +2275,7 @@ static int try_smi_init(struct smi_info *new_smi)
		else
			platform_device_put(new_smi->pdev);
		new_smi->pdev = NULL;
		new_smi->io.dev = NULL;
	}

	kfree(init_name);
@@ -2364,7 +2372,9 @@ static void cleanup_one_si(struct smi_info *to_clean)
		}
	}

	if (to_clean->dev_group_added)
		device_remove_group(to_clean->io.dev, &ipmi_si_dev_attr_group);
	if (to_clean->io.dev)
		dev_set_drvdata(to_clean->io.dev, NULL);

	list_del(&to_clean->link);