x86: adds put_domain() for breaks in arch_do_domctl().
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 25 Jul 2008 08:47:41 +0000 (09:47 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 25 Jul 2008 08:47:41 +0000 (09:47 +0100)
Signed-off-by: Weidong Han <weidong.han@intel.com>
xen/arch/x86/domctl.c

index 52add55afa9cb5d139d02733e7a1fa1ab1385d77..8f1df3ed941c5a3634ff58e196f1b7e9e75ed5af 100644 (file)
@@ -661,6 +661,7 @@ long arch_do_domctl(
         if ( !iommu_pv_enabled && !is_hvm_domain(d) )
         {
             ret = -ENOSYS;
+            put_domain(d);
             break;
         }
 
@@ -669,12 +670,16 @@ long arch_do_domctl(
             gdprintk(XENLOG_ERR, "XEN_DOMCTL_assign_device: "
                      "%x:%x:%x already assigned, or non-existent\n",
                      bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
+            put_domain(d);
             break;
         }
 
         ret = assign_device(d, bus, devfn);
-        gdprintk(XENLOG_INFO, "XEN_DOMCTL_assign_device: bdf = %x:%x:%x\n",
-                 bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
+        if ( ret )
+            gdprintk(XENLOG_ERR, "XEN_DOMCTL_assign_device: "
+                     "assign device (%x:%x:%x) failed\n",
+                     bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
+
         put_domain(d);
     }
     break;
@@ -701,11 +706,15 @@ long arch_do_domctl(
         if ( !iommu_pv_enabled && !is_hvm_domain(d) )
         {
             ret = -ENOSYS;
+            put_domain(d);
             break;
         }
 
         if ( !device_assigned(bus, devfn) )
+        {
+            put_domain(d);
             break;
+        }
 
         ret = 0;
         deassign_device(d, bus, devfn);