Hi Hans, Thanks for the update. On Tue, May 01, 2018 at 11:00:27AM +0200, Hans Verkuil wrote: > From: Hans Verkuil <hans.verkuil@xxxxxxxxx> > > 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. > > The caller has to call media_request_put() for the returned > request since this function increments the refcount. > > Signed-off-by: Hans Verkuil <hans.verkuil@xxxxxxxxx> > --- > 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 > -- Sakari Ailus e-mail: sakari.ailus@xxxxxx