/** * pdcs_register_pathentries - Prepares path entries kobjects for sysfs usage. * * It creates kobjects corresponding to each path entry with nice sysfs * links to the real device. This is where the magic takes place: when * registering the subsystem attributes during module init, each kobject hereby * created will show in the sysfs tree as a folder containing files as defined * by path_subsys_attr[]. */ static inline int __init pdcs_register_pathentries(void) { unsigned short i; struct pdcspath_entry *entry; int err; /* Initialize the entries rw_lock before anything else */ for (i = 0; (entry = pdcspath_entries[i]); i++) rwlock_init(&entry->rw_lock); for (i = 0; (entry = pdcspath_entries[i]); i++) { write_lock(&entry->rw_lock); err = pdcspath_fetch(entry); write_unlock(&entry->rw_lock); if (err < 0) continue; entry->kobj.kset = paths_kset; err = kobject_init_and_add(&entry->kobj, &ktype_pdcspath, NULL, "%s", entry->name); if (err) return err; /* kobject is now registered */ write_lock(&entry->rw_lock); entry->ready = 2; /* Add a nice symlink to the real device */ if (entry->dev) { err = sysfs_create_link(&entry->kobj, &entry->dev->kobj, "device"); WARN_ON(err); } write_unlock(&entry->rw_lock); kobject_uevent(&entry->kobj, KOBJ_ADD); } return 0; }
/** * pdcs_register_pathentries - Prepares path entries kobjects for sysfs usage. * * It creates kobjects corresponding to each path entry with nice sysfs * links to the real device. This is where the magic takes place: when * registering the subsystem attributes during module init, each kobject hereby * created will show in the sysfs tree as a folder containing files as defined * by path_subsys_attr[]. */ static inline int __init pdcs_register_pathentries(void) { unsigned short i; struct pdcspath_entry *entry; int err; /* Initialize the entries rw_lock before anything else */ for (i = 0; (entry = pdcspath_entries[i]); i++) rwlock_init(&entry->rw_lock); for (i = 0; (entry = pdcspath_entries[i]); i++) { write_lock(&entry->rw_lock); err = pdcspath_fetch(entry); write_unlock(&entry->rw_lock); if (err < 0) continue; if ((err = kobject_set_name(&entry->kobj, "%s", entry->name))) return err; kobj_set_kset_s(entry, paths_subsys); if ((err = kobject_register(&entry->kobj))) return err; /* kobject is now registered */ write_lock(&entry->rw_lock); entry->ready = 2; /* Add a nice symlink to the real device */ if (entry->dev) sysfs_create_link(&entry->kobj, &entry->dev->kobj, "device"); write_unlock(&entry->rw_lock); } return 0; }