summaryrefslogtreecommitdiff
path: root/drivers/media/mc
diff options
context:
space:
mode:
authorYunke Cao <yunkec@google.com>2022-04-12 09:23:13 +0300
committerMauro Carvalho Chehab <mchehab@kernel.org>2022-04-24 09:56:44 +0300
commit6008dea1c70e1a7df05c5e1bccd48e51ea29e670 (patch)
tree040afbe04aa60a5b92f29b0cdcb18edf6a010535 /drivers/media/mc
parentd8fdfc66cfd720985480db42b939892e7bf65475 (diff)
downloadlinux-6008dea1c70e1a7df05c5e1bccd48e51ea29e670.tar.xz
media: entity: skip non-data link when removing reverse links
The original implementation removes reverse links for any input link and assumes the presense of sink/source. It fails when the link is a not a data link. media_entity_remove_links when there's an ancillary link can also fail. We only need to remove reverse links for a data link. Signed-off-by: Yunke Cao <yunkec@google.com> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
Diffstat (limited to 'drivers/media/mc')
-rw-r--r--drivers/media/mc/mc-entity.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/drivers/media/mc/mc-entity.c b/drivers/media/mc/mc-entity.c
index 8ab0913d8d82..20f5a76bd78b 100644
--- a/drivers/media/mc/mc-entity.c
+++ b/drivers/media/mc/mc-entity.c
@@ -579,26 +579,30 @@ static void __media_entity_remove_link(struct media_entity *entity,
struct media_link *rlink, *tmp;
struct media_entity *remote;
- if (link->source->entity == entity)
- remote = link->sink->entity;
- else
- remote = link->source->entity;
+ /* Remove the reverse links for a data link. */
+ if ((link->flags & MEDIA_LNK_FL_LINK_TYPE) == MEDIA_LNK_FL_DATA_LINK) {
+ if (link->source->entity == entity)
+ remote = link->sink->entity;
+ else
+ remote = link->source->entity;
- list_for_each_entry_safe(rlink, tmp, &remote->links, list) {
- if (rlink != link->reverse)
- continue;
+ list_for_each_entry_safe(rlink, tmp, &remote->links, list) {
+ if (rlink != link->reverse)
+ continue;
- if (link->source->entity == entity)
- remote->num_backlinks--;
+ if (link->source->entity == entity)
+ remote->num_backlinks--;
- /* Remove the remote link */
- list_del(&rlink->list);
- media_gobj_destroy(&rlink->graph_obj);
- kfree(rlink);
+ /* Remove the remote link */
+ list_del(&rlink->list);
+ media_gobj_destroy(&rlink->graph_obj);
+ kfree(rlink);
- if (--remote->num_links == 0)
- break;
+ if (--remote->num_links == 0)
+ break;
+ }
}
+
list_del(&link->list);
media_gobj_destroy(&link->graph_obj);
kfree(link);