On 03/05/18 00:06, Sakari Ailus wrote:
> Hi Hans,
> 
> Thanks for the update.
> 
> On Tue, May 01, 2018 at 11:00:27AM +0200, Hans Verkuil wrote:
>> From: Hans Verkuil <hans.verk...@cisco.com>
>>
>> Add media_request_find() to find a request based on the file
>> descriptor.
> 
> What would you think of calling this media_request_get_by_fd() instead?
> 
> I think what the function does has changed over the time a bit but the name
> has stayed.

Good idea, done.

Regards,

        Hans

> 
>>
>> 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 | 44 +++++++++++++++++++++++++++++++++++
>>  include/media/media-request.h | 10 ++++++++
>>  2 files changed, 54 insertions(+)
>>
>> diff --git a/drivers/media/media-request.c b/drivers/media/media-request.c
>> index 22881d5700c8..a186db290d51 100644
>> --- a/drivers/media/media-request.c
>> +++ b/drivers/media/media-request.c
>> @@ -234,6 +234,50 @@ 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_fd: 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_validate || !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;
>> +    if (req->mdev != mdev)
>> +            goto err_fput;
>> +
>> +    media_request_get(req);
>> +    fput(filp);
>> +
>> +    return 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)
>>  {
>> diff --git a/include/media/media-request.h b/include/media/media-request.h
>> index 9051dfbc7d30..ce62fe74ebd6 100644
>> --- a/include/media/media-request.h
>> +++ b/include/media/media-request.h
>> @@ -70,6 +70,9 @@ static inline void media_request_get(struct media_request 
>> *req)
>>  void media_request_put(struct media_request *req);
>>  void media_request_cancel(struct media_request *req);
>>  
>> +struct media_request *
>> +media_request_find(struct media_device *mdev, int request_fd);
>> +
>>  int media_request_alloc(struct media_device *mdev,
>>                      struct media_request_alloc *alloc);
>>  #else
>> @@ -85,6 +88,12 @@ static inline void media_request_cancel(struct 
>> media_request *req)
>>  {
>>  }
>>  
>> +static inline struct media_request *
>> +media_request_find(struct media_device *mdev, int request_fd)
>> +{
>> +    return ERR_PTR(-ENOENT);
>> +}
>> +
>>  #endif
>>  
>>  struct media_request_object_ops {
>> @@ -188,6 +197,7 @@ static inline void media_request_object_unbind(struct 
>> media_request_object *obj)
>>  static inline void media_request_object_complete(struct 
>> media_request_object *obj)
>>  {
>>  }
>> +
>>  #endif
>>  
>>  #endif
>> -- 
>> 2.17.0
>>
> 

Reply via email to