diff options
author | 2019-04-03 15:19:54 +0200 | |
---|---|---|
committer | 2019-04-16 13:25:18 +0200 | |
commit | 1a89eb0a8f6d5c25174b0b465cda6d5e480c5830 (patch) | |
tree | 7a5c73edb30327108edbdf434af67cabe6170e17 /drivers/staging/most | |
parent | staging: most: configfs: make create attributes write-only (diff) | |
download | linux-1a89eb0a8f6d5c25174b0b465cda6d5e480c5830.tar.gz linux-1a89eb0a8f6d5c25174b0b465cda6d5e480c5830.tar.bz2 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.c | 38 |
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)); } |