Message ID | 20230524-video-mux-active-state-v1-1-325c69937ac3@pengutronix.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | media: video-mux: fix error paths and update to active state | expand |
Hi Philipp, Thank you for the patch. On Wed, May 24, 2023 at 03:29:24PM +0200, Philipp Zabel wrote: > Move notifier cleanup into video_mux_async_register() to avoid calling > v4l2_async_nf_unregister() when v4l2_async_subdev_nf_register() failed. > In case video_mux_async_register() fails, call media_entity_cleanup(). > > Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > drivers/media/platform/video-mux.c | 26 +++++++++++++++++++------- > 1 file changed, 19 insertions(+), 7 deletions(-) > > diff --git a/drivers/media/platform/video-mux.c b/drivers/media/platform/video-mux.c > index 1d9f32e5a917..4fe31386afc7 100644 > --- a/drivers/media/platform/video-mux.c > +++ b/drivers/media/platform/video-mux.c > @@ -389,7 +389,7 @@ static int video_mux_async_register(struct video_mux *vmux, > ret = PTR_ERR(asd); > /* OK if asd already exists */ > if (ret != -EEXIST) > - return ret; > + goto err_nf_cleanup; > } > } > > @@ -397,9 +397,19 @@ static int video_mux_async_register(struct video_mux *vmux, > > ret = v4l2_async_subdev_nf_register(&vmux->subdev, &vmux->notifier); > if (ret) > - return ret; > + goto err_nf_cleanup; > > - return v4l2_async_register_subdev(&vmux->subdev); > + ret = v4l2_async_register_subdev(&vmux->subdev); > + if (ret) > + goto err_nf_unregister; > + > + return 0; > + > +err_nf_unregister: > + v4l2_async_nf_unregister(&vmux->notifier); > +err_nf_cleanup: > + v4l2_async_nf_cleanup(&vmux->notifier); > + return ret; > } > > static int video_mux_probe(struct platform_device *pdev) > @@ -473,11 +483,13 @@ static int video_mux_probe(struct platform_device *pdev) > vmux->subdev.entity.ops = &video_mux_ops; > > ret = video_mux_async_register(vmux, num_pads - 1); > - if (ret) { > - v4l2_async_nf_unregister(&vmux->notifier); > - v4l2_async_nf_cleanup(&vmux->notifier); > - } > + if (ret) > + goto err_entity_cleanup; > > + return 0; > + > +err_entity_cleanup: > + media_entity_cleanup(&vmux->subdev.entity); > return ret; > } > >
diff --git a/drivers/media/platform/video-mux.c b/drivers/media/platform/video-mux.c index 1d9f32e5a917..4fe31386afc7 100644 --- a/drivers/media/platform/video-mux.c +++ b/drivers/media/platform/video-mux.c @@ -389,7 +389,7 @@ static int video_mux_async_register(struct video_mux *vmux, ret = PTR_ERR(asd); /* OK if asd already exists */ if (ret != -EEXIST) - return ret; + goto err_nf_cleanup; } } @@ -397,9 +397,19 @@ static int video_mux_async_register(struct video_mux *vmux, ret = v4l2_async_subdev_nf_register(&vmux->subdev, &vmux->notifier); if (ret) - return ret; + goto err_nf_cleanup; - return v4l2_async_register_subdev(&vmux->subdev); + ret = v4l2_async_register_subdev(&vmux->subdev); + if (ret) + goto err_nf_unregister; + + return 0; + +err_nf_unregister: + v4l2_async_nf_unregister(&vmux->notifier); +err_nf_cleanup: + v4l2_async_nf_cleanup(&vmux->notifier); + return ret; } static int video_mux_probe(struct platform_device *pdev) @@ -473,11 +483,13 @@ static int video_mux_probe(struct platform_device *pdev) vmux->subdev.entity.ops = &video_mux_ops; ret = video_mux_async_register(vmux, num_pads - 1); - if (ret) { - v4l2_async_nf_unregister(&vmux->notifier); - v4l2_async_nf_cleanup(&vmux->notifier); - } + if (ret) + goto err_entity_cleanup; + return 0; + +err_entity_cleanup: + media_entity_cleanup(&vmux->subdev.entity); return ret; }
Move notifier cleanup into video_mux_async_register() to avoid calling v4l2_async_nf_unregister() when v4l2_async_subdev_nf_register() failed. In case video_mux_async_register() fails, call media_entity_cleanup(). Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> --- drivers/media/platform/video-mux.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-)