summaryrefslogtreecommitdiffstats
path: root/drivers/staging/most
diff options
context:
space:
mode:
authorChristian Gromm2019-04-03 15:19:54 +0200
committerGreg Kroah-Hartman2019-04-16 13:25:18 +0200
commit1a89eb0a8f6d5c25174b0b465cda6d5e480c5830 (patch)
tree7a5c73edb30327108edbdf434af67cabe6170e17 /drivers/staging/most
parentstaging: most: configfs: make create attributes write-only (diff)
downloadkernel-qcow2-linux-1a89eb0a8f6d5c25174b0b465cda6d5e480c5830.tar.gz
kernel-qcow2-linux-1a89eb0a8f6d5c25174b0b465cda6d5e480c5830.tar.xz
kernel-qcow2-linux-1a89eb0a8f6d5c25174b0b465cda6d5e480c5830.zip
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: Christian Gromm <christian.gromm@microchip.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/most')
-rw-r--r--drivers/staging/most/configfs.c38
1 files changed, 36 insertions, 2 deletions
diff --git a/drivers/staging/most/configfs.c b/drivers/staging/most/configfs.c
index b622d27387a3..934fb6d668a5 100644
--- a/drivers/staging/most/configfs.c
+++ b/drivers/staging/most/configfs.c
@@ -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));
}