|
@@ -265,8 +265,11 @@ static int kvm_spapr_tce_release(struct inode *inode, struct file *filp)
|
|
{
|
|
{
|
|
struct kvmppc_spapr_tce_table *stt = filp->private_data;
|
|
struct kvmppc_spapr_tce_table *stt = filp->private_data;
|
|
struct kvmppc_spapr_tce_iommu_table *stit, *tmp;
|
|
struct kvmppc_spapr_tce_iommu_table *stit, *tmp;
|
|
|
|
+ struct kvm *kvm = stt->kvm;
|
|
|
|
|
|
|
|
+ mutex_lock(&kvm->lock);
|
|
list_del_rcu(&stt->list);
|
|
list_del_rcu(&stt->list);
|
|
|
|
+ mutex_unlock(&kvm->lock);
|
|
|
|
|
|
list_for_each_entry_safe(stit, tmp, &stt->iommu_tables, next) {
|
|
list_for_each_entry_safe(stit, tmp, &stt->iommu_tables, next) {
|
|
WARN_ON(!kref_read(&stit->kref));
|
|
WARN_ON(!kref_read(&stit->kref));
|
|
@@ -298,7 +301,6 @@ long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm,
|
|
unsigned long npages, size;
|
|
unsigned long npages, size;
|
|
int ret = -ENOMEM;
|
|
int ret = -ENOMEM;
|
|
int i;
|
|
int i;
|
|
- int fd = -1;
|
|
|
|
|
|
|
|
if (!args->size)
|
|
if (!args->size)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
@@ -328,11 +330,6 @@ long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm,
|
|
goto fail;
|
|
goto fail;
|
|
}
|
|
}
|
|
|
|
|
|
- ret = fd = anon_inode_getfd("kvm-spapr-tce", &kvm_spapr_tce_fops,
|
|
|
|
- stt, O_RDWR | O_CLOEXEC);
|
|
|
|
- if (ret < 0)
|
|
|
|
- goto fail;
|
|
|
|
-
|
|
|
|
mutex_lock(&kvm->lock);
|
|
mutex_lock(&kvm->lock);
|
|
|
|
|
|
/* Check this LIOBN hasn't been previously allocated */
|
|
/* Check this LIOBN hasn't been previously allocated */
|
|
@@ -344,17 +341,19 @@ long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (!ret) {
|
|
|
|
|
|
+ if (!ret)
|
|
|
|
+ ret = anon_inode_getfd("kvm-spapr-tce", &kvm_spapr_tce_fops,
|
|
|
|
+ stt, O_RDWR | O_CLOEXEC);
|
|
|
|
+
|
|
|
|
+ if (ret >= 0) {
|
|
list_add_rcu(&stt->list, &kvm->arch.spapr_tce_tables);
|
|
list_add_rcu(&stt->list, &kvm->arch.spapr_tce_tables);
|
|
kvm_get_kvm(kvm);
|
|
kvm_get_kvm(kvm);
|
|
}
|
|
}
|
|
|
|
|
|
mutex_unlock(&kvm->lock);
|
|
mutex_unlock(&kvm->lock);
|
|
|
|
|
|
- if (!ret)
|
|
|
|
- return fd;
|
|
|
|
-
|
|
|
|
- put_unused_fd(fd);
|
|
|
|
|
|
+ if (ret >= 0)
|
|
|
|
+ return ret;
|
|
|
|
|
|
fail:
|
|
fail:
|
|
for (i = 0; i < npages; i++)
|
|
for (i = 0; i < npages; i++)
|