Commit 1a89eb0a authored by Christian Gromm's avatar Christian Gromm Committed by Greg Kroah-Hartman
Browse files

staging: most: configfs: add code for link removal



This patch adds code that cleans up established links whenever the destroy
attribute is set or if the config_item (directory) is being removed.

Signed-off-by: default avatarChristian Gromm <christian.gromm@microchip.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a15f465c
Loading
Loading
Loading
Loading
+36 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ struct mdev_link {
	struct config_item item;
	struct list_head list;
	bool create_link;
	bool destroy_link;
	u16 num_buffers;
	u16 buffer_size;
	u16 subbuffer_size;
@@ -132,8 +133,7 @@ static ssize_t mdev_link_create_link_store(struct config_item *item,
	if (ret)
		return ret;
	if (!tmp)
		return most_remove_link(mdev_link->device, mdev_link->channel,
					mdev_link->comp);
		return count;
	ret = set_config_and_add_link(mdev_link);
	if (ret && ret != -ENODEV)
		return ret;
@@ -142,6 +142,28 @@ static ssize_t mdev_link_create_link_store(struct config_item *item,
	return count;
}

static ssize_t mdev_link_destroy_link_store(struct config_item *item,
					    const char *page, size_t count)
{
	struct mdev_link *mdev_link = to_mdev_link(item);
	bool tmp;
	int ret;

	ret = kstrtobool(page, &tmp);
	if (ret)
		return ret;
	if (!tmp)
		return count;
	mdev_link->destroy_link = tmp;
	ret = most_remove_link(mdev_link->device, mdev_link->channel,
			       mdev_link->comp);
	if (ret)
		return ret;
	if (!list_empty(&mdev_link_list))
		list_del(&mdev_link->list);
	return count;
}

static ssize_t mdev_link_direction_show(struct config_item *item, char *page)
{
	return snprintf(page, PAGE_SIZE, "%s\n", to_mdev_link(item)->direction);
@@ -326,6 +348,7 @@ static ssize_t mdev_link_dbr_size_store(struct config_item *item,
}

CONFIGFS_ATTR_WO(mdev_link_, create_link);
CONFIGFS_ATTR_WO(mdev_link_, destroy_link);
CONFIGFS_ATTR(mdev_link_, device);
CONFIGFS_ATTR(mdev_link_, channel);
CONFIGFS_ATTR(mdev_link_, comp);
@@ -340,6 +363,7 @@ CONFIGFS_ATTR(mdev_link_, dbr_size);

static struct configfs_attribute *mdev_link_attrs[] = {
	&mdev_link_attr_create_link,
	&mdev_link_attr_destroy_link,
	&mdev_link_attr_device,
	&mdev_link_attr_channel,
	&mdev_link_attr_comp,
@@ -356,6 +380,16 @@ static struct configfs_attribute *mdev_link_attrs[] = {

static void mdev_link_release(struct config_item *item)
{
	struct mdev_link *mdev_link = to_mdev_link(item);
	int ret;

	if (!list_empty(&mdev_link_list)) {
		ret = most_remove_link(mdev_link->device, mdev_link->channel,
				       mdev_link->comp);
		if (ret && (ret != -ENODEV))
			pr_err("Removing link failed.\n");
		list_del(&mdev_link->list);
	}
	kfree(to_mdev_link(item));
}