|
@@ -1487,6 +1487,7 @@ static int __attach_device(struct device *dev,
|
|
|
struct protection_domain *domain)
|
|
|
{
|
|
|
struct iommu_dev_data *dev_data, *alias_data;
|
|
|
+ int ret;
|
|
|
|
|
|
dev_data = get_dev_data(dev);
|
|
|
alias_data = get_dev_data(dev_data->alias);
|
|
@@ -1498,13 +1499,14 @@ static int __attach_device(struct device *dev,
|
|
|
spin_lock(&domain->lock);
|
|
|
|
|
|
/* Some sanity checks */
|
|
|
+ ret = -EBUSY;
|
|
|
if (alias_data->domain != NULL &&
|
|
|
alias_data->domain != domain)
|
|
|
- return -EBUSY;
|
|
|
+ goto out_unlock;
|
|
|
|
|
|
if (dev_data->domain != NULL &&
|
|
|
dev_data->domain != domain)
|
|
|
- return -EBUSY;
|
|
|
+ goto out_unlock;
|
|
|
|
|
|
/* Do real assignment */
|
|
|
if (dev_data->alias != dev) {
|
|
@@ -1520,10 +1522,14 @@ static int __attach_device(struct device *dev,
|
|
|
|
|
|
atomic_inc(&dev_data->bind);
|
|
|
|
|
|
+ ret = 0;
|
|
|
+
|
|
|
+out_unlock:
|
|
|
+
|
|
|
/* ready */
|
|
|
spin_unlock(&domain->lock);
|
|
|
|
|
|
- return 0;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/*
|