diff mbox series

media: mc: mark the media devnode as registered from the, start

Message ID b28a6f75-eb46-4d71-a919-b4c9c8e35124@xs4all.nl (mailing list archive)
State New
Headers show
Series media: mc: mark the media devnode as registered from the, start | expand

Commit Message

Hans Verkuil Feb. 23, 2024, 8:46 a.m. UTC
First the media device node was created, and if successful it was
marked as 'registered'. This leaves a small race condition where
an application can open the device node and get an error back
because the 'registered' flag was not yet set.

Change the order: first set the 'registered' flag, then actually
register the media device node. If that fails, then clear the flag.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
---
 drivers/media/mc/mc-devnode.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

Comments

Sakari Ailus Feb. 23, 2024, 9:09 a.m. UTC | #1
Hi Hans,

Thanks for the patch.

On Fri, Feb 23, 2024 at 09:46:19AM +0100, Hans Verkuil wrote:
> First the media device node was created, and if successful it was
> marked as 'registered'. This leaves a small race condition where
> an application can open the device node and get an error back
> because the 'registered' flag was not yet set.
> 
> Change the order: first set the 'registered' flag, then actually
> register the media device node. If that fails, then clear the flag.
> 
> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>

Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>

> ---
>  drivers/media/mc/mc-devnode.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/media/mc/mc-devnode.c b/drivers/media/mc/mc-devnode.c
> index 7f67825c8757..318e267e798e 100644
> --- a/drivers/media/mc/mc-devnode.c
> +++ b/drivers/media/mc/mc-devnode.c
> @@ -245,15 +245,14 @@ int __must_check media_devnode_register(struct media_device *mdev,
>  	kobject_set_name(&devnode->cdev.kobj, "media%d", devnode->minor);
> 
>  	/* Part 3: Add the media and char device */
> +	set_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
>  	ret = cdev_device_add(&devnode->cdev, &devnode->dev);
>  	if (ret < 0) {
> +		clear_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
>  		pr_err("%s: cdev_device_add failed\n", __func__);
>  		goto cdev_add_error;
>  	}
> 
> -	/* Part 4: Activate this minor. The char device can now be used. */
> -	set_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
> -
>  	return 0;
> 
>  cdev_add_error:
Laurent Pinchart Feb. 23, 2024, 10 a.m. UTC | #2
Hi Hans,

Thank you for the patch.

There's a typo in the, commit subject.

:-)

On Fri, Feb 23, 2024 at 09:46:19AM +0100, Hans Verkuil wrote:
> First the media device node was created, and if successful it was
> marked as 'registered'. This leaves a small race condition where
> an application can open the device node and get an error back
> because the 'registered' flag was not yet set.
> 
> Change the order: first set the 'registered' flag, then actually
> register the media device node. If that fails, then clear the flag.
> 
> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>

This looks fine for now, so, with the extra comma removed,

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

I however wonder if we couldn't get rid of the flag and delegate the
registration test to cdev.

> ---
>  drivers/media/mc/mc-devnode.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/media/mc/mc-devnode.c b/drivers/media/mc/mc-devnode.c
> index 7f67825c8757..318e267e798e 100644
> --- a/drivers/media/mc/mc-devnode.c
> +++ b/drivers/media/mc/mc-devnode.c
> @@ -245,15 +245,14 @@ int __must_check media_devnode_register(struct media_device *mdev,
>  	kobject_set_name(&devnode->cdev.kobj, "media%d", devnode->minor);
> 
>  	/* Part 3: Add the media and char device */
> +	set_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
>  	ret = cdev_device_add(&devnode->cdev, &devnode->dev);
>  	if (ret < 0) {
> +		clear_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
>  		pr_err("%s: cdev_device_add failed\n", __func__);
>  		goto cdev_add_error;
>  	}
> 
> -	/* Part 4: Activate this minor. The char device can now be used. */
> -	set_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
> -
>  	return 0;
> 
>  cdev_add_error:
Sakari Ailus Feb. 23, 2024, 10:09 a.m. UTC | #3
Hi Laurent,

On Fri, Feb 23, 2024 at 12:00:53PM +0200, Laurent Pinchart wrote:
> I however wonder if we couldn't get rid of the flag and delegate the
> registration test to cdev.

I'd see how this could be done after merging the lifetime management
patches.
diff mbox series

Patch

diff --git a/drivers/media/mc/mc-devnode.c b/drivers/media/mc/mc-devnode.c
index 7f67825c8757..318e267e798e 100644
--- a/drivers/media/mc/mc-devnode.c
+++ b/drivers/media/mc/mc-devnode.c
@@ -245,15 +245,14 @@  int __must_check media_devnode_register(struct media_device *mdev,
 	kobject_set_name(&devnode->cdev.kobj, "media%d", devnode->minor);

 	/* Part 3: Add the media and char device */
+	set_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
 	ret = cdev_device_add(&devnode->cdev, &devnode->dev);
 	if (ret < 0) {
+		clear_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
 		pr_err("%s: cdev_device_add failed\n", __func__);
 		goto cdev_add_error;
 	}

-	/* Part 4: Activate this minor. The char device can now be used. */
-	set_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
-
 	return 0;

 cdev_add_error: