/* interface for exporting device attributes */
struct device_attribute {
struct attribute attr;
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
char *buf);
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count);
};
int device_create_file(struct device *dev, const struct device_attribute *attr) //kernel/drivers/base/core.c
sysfs_create_file(&dev->kobj, &attr->attr); //kernel/include/linux/sysfs.h
sysfs_create_file_ns(&dev->kobj, &attr->attr, NULL); //kernel/fs/sysfs/file.c
sysfs_add_file_mode_ns(kobj->sd, attr, false, attr->mode, ns); //kernel/fs/sysfs/file.c
struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, ...)
//kernel/drivers/base/core.c
device_create_vargs(class, parent, devt, drvdata, fmt, vargs); //kernel/drivers/base/core.c
device_create_groups_vargs(class, parent, devt, drvdata, NULL,fmt, args); //kernel/drivers/base/core.c
device_add(dev); //kernel/drivers/base/core.c