struct kobject *sysfs_dev_char_kobj;
 struct kobject *sysfs_dev_block_kobj;
 
+static DEFINE_MUTEX(device_hotplug_lock);
+
+void lock_device_hotplug(void)
+{
+       mutex_lock(&device_hotplug_lock);
+}
+
+void unlock_device_hotplug(void)
+{
+       mutex_unlock(&device_hotplug_lock);
+}
+
+int lock_device_hotplug_sysfs(void)
+{
+       if (mutex_trylock(&device_hotplug_lock))
+               return 0;
+
+       /* Avoid busy looping (5 ms of sleep should do). */
+       msleep(5);
+       return restart_syscall();
+}
+
 #ifdef CONFIG_BLOCK
 static inline int device_is_not_partition(struct device *dev)
 {
 {
        bool val;
 
-       lock_device_hotplug();
+       device_lock(dev);
        val = !dev->offline;
-       unlock_device_hotplug();
+       device_unlock(dev);
        return sprintf(buf, "%u\n", val);
 }
 
        if (ret < 0)
                return ret;
 
-       lock_device_hotplug();
+       ret = lock_device_hotplug_sysfs();
+       if (ret)
+               return ret;
+
        ret = val ? device_online(dev) : device_offline(dev);
        unlock_device_hotplug();
        return ret < 0 ? ret : count;
 EXPORT_SYMBOL_GPL(device_create_file);
 EXPORT_SYMBOL_GPL(device_remove_file);
 
-static DEFINE_MUTEX(device_hotplug_lock);
-
-void lock_device_hotplug(void)
-{
-       mutex_lock(&device_hotplug_lock);
-}
-
-void unlock_device_hotplug(void)
-{
-       mutex_unlock(&device_hotplug_lock);
-}
-
 static int device_check_offline(struct device *dev, void *not_used)
 {
        int ret;
 
 
        mem = container_of(dev, struct memory_block, dev);
 
-       lock_device_hotplug();
+       ret = lock_device_hotplug_sysfs();
+       if (ret)
+               return ret;
 
        if (!strncmp(buf, "online_kernel", min_t(int, count, 13))) {
                offline = false;
 
 
 extern void lock_device_hotplug(void);
 extern void unlock_device_hotplug(void);
+extern int lock_device_hotplug_sysfs(void);
 extern int device_offline(struct device *dev);
 extern int device_online(struct device *dev);
 /*