Merge tag 'trace-v5.14-5' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
[linux-2.6-microblaze.git] / drivers / base / core.c
index 2a61003..cadcade 100644 (file)
@@ -2409,6 +2409,25 @@ static ssize_t online_store(struct device *dev, struct device_attribute *attr,
 }
 static DEVICE_ATTR_RW(online);
 
+static ssize_t removable_show(struct device *dev, struct device_attribute *attr,
+                             char *buf)
+{
+       const char *loc;
+
+       switch (dev->removable) {
+       case DEVICE_REMOVABLE:
+               loc = "removable";
+               break;
+       case DEVICE_FIXED:
+               loc = "fixed";
+               break;
+       default:
+               loc = "unknown";
+       }
+       return sysfs_emit(buf, "%s\n", loc);
+}
+static DEVICE_ATTR_RO(removable);
+
 int device_add_groups(struct device *dev, const struct attribute_group **groups)
 {
        return sysfs_create_groups(&dev->kobj, groups);
@@ -2586,8 +2605,16 @@ static int device_add_attrs(struct device *dev)
                        goto err_remove_dev_online;
        }
 
+       if (dev_removable_is_valid(dev)) {
+               error = device_create_file(dev, &dev_attr_removable);
+               if (error)
+                       goto err_remove_dev_waiting_for_supplier;
+       }
+
        return 0;
 
+ err_remove_dev_waiting_for_supplier:
+       device_remove_file(dev, &dev_attr_waiting_for_supplier);
  err_remove_dev_online:
        device_remove_file(dev, &dev_attr_online);
  err_remove_dev_groups:
@@ -2607,6 +2634,7 @@ static void device_remove_attrs(struct device *dev)
        struct class *class = dev->class;
        const struct device_type *type = dev->type;
 
+       device_remove_file(dev, &dev_attr_removable);
        device_remove_file(dev, &dev_attr_waiting_for_supplier);
        device_remove_file(dev, &dev_attr_online);
        device_remove_groups(dev, dev->groups);
@@ -3442,7 +3470,7 @@ bool kill_device(struct device *dev)
         * to run while we are tearing out the bus/class/sysfs from
         * underneath the device.
         */
-       lockdep_assert_held(&dev->mutex);
+       device_lock_assert(dev);
 
        if (dev->p->dead)
                return false;