On Mon, Jul 10, 2023 at 07:59:22PM -0700, Yi Liu wrote:
> It's common to get a reference to the iommufd context from a given file
> descriptor. So adds an API for it. Existing users of this API are compiled
> only when IOMMUFD is enabled, so no need to have a stub for the IOMMUFD
> disabled case.
> 
> Signed-off-by: Yi Liu <[email protected]>
> ---
>  drivers/iommu/iommufd/main.c | 23 +++++++++++++++++++++++
>  include/linux/iommufd.h      |  1 +
>  2 files changed, 24 insertions(+)
> 
> diff --git a/drivers/iommu/iommufd/main.c b/drivers/iommu/iommufd/main.c
> index 32ce7befc8dd..e99a338d4fdf 100644
> --- a/drivers/iommu/iommufd/main.c
> +++ b/drivers/iommu/iommufd/main.c
> @@ -377,6 +377,29 @@ struct iommufd_ctx *iommufd_ctx_from_file(struct file 
> *file)
>  }
>  EXPORT_SYMBOL_NS_GPL(iommufd_ctx_from_file, IOMMUFD);
>  
> +/**
> + * iommufd_ctx_from_fd - Acquires a reference to the iommufd context
> + * @fd: File descriptor to obtain the reference from
> + *
> + * Returns a pointer to the iommufd_ctx, otherwise ERR_PTR. On success
> + * the caller is responsible to call iommufd_ctx_put().
> + */
> +struct iommufd_ctx *iommufd_ctx_from_fd(int fd)
> +{
> +     struct iommufd_ctx *iommufd;
> +     struct fd f;
> +
> +     f = fdget(fd);
> +     if (!f.file)
> +             return ERR_PTR(-EBADF);
> +
> +     iommufd = iommufd_ctx_from_file(f.file);
> +
> +     fdput(f);
> +     return iommufd;
> +}
> +EXPORT_SYMBOL_NS_GPL(iommufd_ctx_from_fd, IOMMUFD);

This is a little wonky since iommufd_ctx_from_file() also obtains a
reference

Just needs to be like this:

struct iommufd_ctx *iommufd_ctx_from_fd(int fd)
{
        struct file *file;

        file = fget(fd);
        if (!file)
                return ERR_PTR(-EBADF);

        if (file->f_op != &iommufd_fops) {
                fput(file);
                return ERR_PTR(-EBADFD);
        }
        /* fget is the same as iommufd_ctx_get() */
        return file->private_data;
}
EXPORT_SYMBOL_NS_GPL(iommufd_ctx_from_fd, IOMMUFD);

?

Jason

Reply via email to