浏览代码

iommu/vt-d: Fix error handling in ANDD processing

If we failed to find an ACPI device to correspond to an ANDD record, we
would fail to increment our pointer and would just process the same record
over and over again, with predictable results.

Turn it from a while() loop into a for() loop to let the 'continue' in
the error paths work correctly.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
David Woodhouse 11 年之前
父节点
当前提交
7713ec066a
共有 1 个文件被更改,包括 3 次插入5 次删除
  1. 3 5
      drivers/iommu/dmar.c

+ 3 - 5
drivers/iommu/dmar.c

@@ -662,10 +662,9 @@ static int __init dmar_acpi_dev_scope_init(void)
 	if (dmar_tbl == NULL)
 		return -ENODEV;
 
-	andd = (void *)dmar_tbl + sizeof(struct acpi_table_dmar);
-
-	while (((unsigned long)andd) <
-	       ((unsigned long)dmar_tbl) + dmar_tbl->length) {
+	for (andd = (void *)dmar_tbl + sizeof(struct acpi_table_dmar);
+	     ((unsigned long)andd) < ((unsigned long)dmar_tbl) + dmar_tbl->length;
+	     andd = ((void *)andd) + andd->header.length) {
 		if (andd->header.type == ACPI_DMAR_TYPE_ANDD) {
 			acpi_handle h;
 			struct acpi_device *adev;
@@ -685,7 +684,6 @@ static int __init dmar_acpi_dev_scope_init(void)
 			}
 			dmar_acpi_insert_dev_scope(andd->device_number, adev);
 		}
-		andd = ((void *)andd) + andd->header.length;
 	}
 	return 0;
 }