属性文件的建立和目录的建立相差不大,因为不管目录还是普通文件,都由一个sysfs_dirent代表
sysfs_create_file-->sysfs_add_file-->sysfs_add_file_mode
- 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的定义:
- 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
- };