On Wed, Aug 09, 2023 at 06:16:19PM +0800, Baolu Lu wrote: > On 2023/8/8 23:35, Yi Liu wrote: > > +static int iommufd_fill_hw_info(struct device *dev, void __user *user_ptr, > > + unsigned int *length, u32 *type) > > +{ > > + const struct iommu_ops *ops; > > + unsigned int data_len; > > + void *data; > > + int rc = 0; > > + > > + ops = dev_iommu_ops(dev); > > + if (!ops->hw_info) { > > + *length = 0; > > + *type = IOMMU_HW_INFO_TYPE_NONE; > > + return 0; > > + } > > + > > + data = ops->hw_info(dev, &data_len, type); > > + if (IS_ERR(data)) > > + return PTR_ERR(data); > > + > > + /* > > + * drivers that have hw_info callback should have a unique > > + * iommu_hw_info_type. > > + */ > > + if (WARN_ON_ONCE(*type == IOMMU_HW_INFO_TYPE_NONE)) { > > + rc = -ENODEV; > > + goto err_free; > > + } > > + > > + *length = min(*length, data_len); > > + if (copy_to_user(user_ptr, data, *length)) { > > copy_to_user() returns the number of bytes that were successfully > copied, right? It returns length on failure and 0 on success Jason