struct acpi_thermal_trips trips;
        struct acpi_handle_list devices;
        struct timer_list timer;
+       struct mutex lock;
 };
 
 static const struct file_operations acpi_thermal_state_fops = {
                return;
        }
 
+       /* Check if someone else is already running */
+       if (!mutex_trylock(&tz->lock))
+               return;
+
        state = tz->state;
 
        result = acpi_thermal_get_temperature(tz);
        if (result)
-               return;
+               goto unlock;
 
        memset(&tz->state, 0, sizeof(tz->state));
 
                        add_timer(&(tz->timer));
                }
        }
-
-       return;
+      unlock:
+       mutex_unlock(&tz->lock);
 }
 
 /* --------------------------------------------------------------------------
        strcpy(acpi_device_name(device), ACPI_THERMAL_DEVICE_NAME);
        strcpy(acpi_device_class(device), ACPI_THERMAL_CLASS);
        acpi_driver_data(device) = tz;
-
+       mutex_init(&tz->lock);
        result = acpi_thermal_get_info(tz);
        if (result)
                goto end;
        }
 
        acpi_thermal_remove_fs(device);
-
+       mutex_destroy(&tz->lock);
        kfree(tz);
        return 0;
 }