int sysfs_add_file(struct dentry * dir, const struct attribute * attr) { struct dentry * dentry; int error; down(&dir->d_inode->i_sem); dentry = sysfs_get_dentry(dir,attr->name); if (!IS_ERR(dentry)) { error = sysfs_create(dentry, (attr->mode & S_IALLUGO) | S_IFREG, init_file); if (!error) dentry->d_fsdata = (void *)attr; dput(dentry); } else error = PTR_ERR(dentry); up(&dir->d_inode->i_sem); return error; }
static int create_dir(struct kobject * k, struct dentry * p, const char * n, struct dentry ** d) { int error; down(&p->d_inode->i_sem); *d = sysfs_get_dentry(p,n); if (!IS_ERR(*d)) { error = sysfs_create(*d, S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO, init_dir); if (!error) { (*d)->d_fsdata = k; p->d_inode->i_nlink++; } dput(*d); } else error = PTR_ERR(*d); up(&p->d_inode->i_sem); return error; }
/** * sysfs_create_link - create symlink between two objects. * @kobj: object whose directory we're creating the link in. * @target: object we're pointing to. * @name: name of the symlink. */ int sysfs_create_link(struct kobject * kobj, struct kobject * target, char * name) { struct dentry * dentry = kobj->dentry; struct dentry * d; int error = 0; down(&dentry->d_inode->i_sem); d = sysfs_get_dentry(dentry,name); if (!IS_ERR(d)) { error = sysfs_create(d, S_IFLNK|S_IRWXUGO, init_symlink); if (!error) /* * associate the link dentry with the target kobject */ d->d_fsdata = kobject_get(target); dput(d); } else error = PTR_ERR(d); up(&dentry->d_inode->i_sem); return error; }
int sysfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) { return sysfs_create(dentry, mode, NULL); }