@@ -759,6 +759,9 @@ void media_device_unregister(struct media_device *mdev)
return;
}
+ /* Protect unregister path - clear MEDIA_FLAG_REGISTERED */
+ clear_bit(MEDIA_FLAG_REGISTERED, &mdev->devnode.flags);
+
/* Remove all entities from the media device */
list_for_each_entry_safe(entity, next, &mdev->entities, graph_obj.list)
__media_device_unregister_entity(entity);
and changing media_devnode_unregister() to simply call
device_unregister(&mdev->dev);
Again clearing MEDIA_FLAG_REGISTERED bit in
media_device_unregister() some problems.
For one thing clearing this bit should be
done holding media_devnode_lock. It can be
done cleanly if we do the following:
How about if we split media_devnode_unregister()
into twp ohases:
media_devnode_start_unregister()
to clear this bit. It can do:
media_devnode_start_unregister()
{
mutex_lock(&media_devnode_lock);
if (!media_devnode_is_registered(mdev)) {
mutex_unlock(&media_devnode_lock);
return;
}
clear_bit(MEDIA_FLAG_REGISTERED, &mdev->flags);
mutex_unlock(&media_devnode_lock);
}
then:media_device_unregister(struct media_device *mdev)
will call this first thing and then hold mdev->lock
do the rest and the call media_devnode_unregister()
and which will be changed to as follows:
@@ -274,13 +274,6 @@ error:
void media_devnode_unregister(struct media_devnode *mdev)
{
- /* Check if mdev was ever registered at all */
- if (!media_devnode_is_registered(mdev))
- return;
-
- mutex_lock(&media_devnode_lock);
- clear_bit(MEDIA_FLAG_REGISTERED, &mdev->flags);
- mutex_unlock(&media_devnode_lock);
device_unregister(&mdev->dev);
}