sysfs_create_file-->sysfs_add_file-->sysfs_add_file_mode
[cpp] view plain copy intsysfs_add_file_mode(struct sysfs_dirent *dir_sd, conststruct attribute *attr, int type, mode_t amode) { umode_tmode = (amode & S_IALLUGO) | S_IFREG; structsysfs_addrm_cxt acxt; structsysfs_dirent *sd; intrc; sd= sysfs_new_dirent(attr->name, mode, type); //sysfs_dirent的初始化 if(!sd) return-ENOMEM; sd->s_attr.attr= (void *)attr; //属性文件的关系 sysfs_dirent_init_lockdep(sd); sysfs_addrm_start(&acxt,dir_sd); rc= sysfs_add_one(&acxt, sd); //层次关系的建立 sysfs_addrm_finish(&acxt); if(rc) sysfs_put(sd); returnrc; } 唯一的区别就是:在目录时是
sd->s_dir.kobj= kobj; //sysfs_dirent与kobject的联系建立
而在属性文件时是sd->s_attr.attr = (void *)attr; //sysfs_dirent与attribute的联系
后面,在分析文件的读写时,会再次回头看到attr的,这里先给出attribute的定义:
[cpp] view plain copy struct attribute { const char *name; struct module *owner; mode_t mode; #ifdef CONFIG_DEBUG_LOCK_ALLOC struct lock_class_key *key; struct lock_class_key skey; #endif };