On Mon, Mar 27, 2023 at 02:33:47AM -0700, Yi Liu wrote:
> @@ -494,6 +479,30 @@ void iommufd_access_destroy(struct iommufd_access 
> *access)
>  }
>  EXPORT_SYMBOL_NS_GPL(iommufd_access_destroy, IOMMUFD);
>  
> +int iommufd_access_attach(struct iommufd_access *access, u32 ioas_id)
> +{
> +     struct iommufd_ioas *new_ioas;
> +     int rc = 0;
> +
> +     if (access->ioas != NULL && access->ioas->obj.id != ioas_id)
> +             return -EINVAL;

This should just be

   if (access->ioas)
        return -EINVAL;

> +
> +     new_ioas = iommufd_get_ioas(access->ictx, ioas_id);
> +     if (IS_ERR(new_ioas))
> +             return PTR_ERR(new_ioas);
> +
> +     rc = iopt_add_access(&new_ioas->iopt, access);
> +     if (rc) {
> +             iommufd_put_object(&new_ioas->obj);
> +             return rc;
> +     }
> +     iommufd_ref_to_users(&new_ioas->obj);
> +
> +     access->ioas = new_ioas;

Since if ioas is non-null here then we will lose the reference counts
already held.

I'll fix it

Jason

Reply via email to