On 04/12/2018 02:08 PM, Sakari Ailus wrote:
> Hi Hans,
> 
> On Mon, Apr 09, 2018 at 04:20:03PM +0200, Hans Verkuil wrote:
>> From: Hans Verkuil <hans.verk...@cisco.com>
>>
>> Add media_request_find() to find a request based on the file
>> descriptor.
>>
>> The caller has to call media_request_put() for the returned
>> request since this function increments the refcount.
>>
>> Signed-off-by: Hans Verkuil <hans.verk...@cisco.com>
>> ---
>>  drivers/media/media-request.c | 47 
>> +++++++++++++++++++++++++++++++++++++++++++
>>  include/media/media-request.h | 10 +++++++++
>>  2 files changed, 57 insertions(+)
>>
>> diff --git a/drivers/media/media-request.c b/drivers/media/media-request.c
>> index 27739ff7cb09..02b620c81de5 100644
>> --- a/drivers/media/media-request.c
>> +++ b/drivers/media/media-request.c
>> @@ -207,6 +207,53 @@ static const struct file_operations request_fops = {
>>      .release = media_request_close,
>>  };
>>  
>> +/**
>> + * media_request_find - Find a request based on the file descriptor
>> + * @mdev: The media device
>> + * @request: The request file handle
>> + *
>> + * Find and return the request associated with the given file descriptor, or
>> + * an error if no such request exists.
>> + *
>> + * When the function returns a request it increases its reference count. The
>> + * caller is responsible for releasing the reference by calling
>> + * media_request_put() on the request.
>> + */
>> +struct media_request *
>> +media_request_find(struct media_device *mdev, int request_fd)
>> +{
>> +    struct file *filp;
>> +    struct media_request *req;
>> +
>> +    if (!mdev || !mdev->ops || !mdev->ops->req_queue)
>> +            return ERR_PTR(-EPERM);
>> +
>> +    filp = fget(request_fd);
>> +    if (!filp)
>> +            return ERR_PTR(-ENOENT);
>> +
>> +    if (filp->f_op != &request_fops)
>> +            goto err_fput;
>> +    req = filp->private_data;
>> +    media_request_get(req);
> 
> As you're holding a reference to filp, you also indirectly have reference
> to ref --- you otherwise couldn't access file->private_data either.
> 
> Therefore you could move the check for the right mdev before getting a
> reference to req, thus simplifying error handling as a result.

True. Done.

Regards,

        Hans

> 
>> +
>> +    if (req->mdev != mdev)
>> +            goto err_kref_put;
>> +
>> +    fput(filp);
>> +
>> +    return req;
>> +
>> +err_kref_put:
>> +    media_request_put(req);
>> +
>> +err_fput:
>> +    fput(filp);
>> +
>> +    return ERR_PTR(-ENOENT);
>> +}
>> +EXPORT_SYMBOL_GPL(media_request_find);
>> +
>>  int media_request_alloc(struct media_device *mdev,
>>                      struct media_request_alloc *alloc)
>>  {
> 

Reply via email to