static int bpf_mkobj_ops(struct inode *dir, struct dentry *dentry, umode_t mode, const struct inode_operations *iops) { struct inode *inode; inode = bpf_get_inode(dir->i_sb, dir, mode | S_IFREG); if (IS_ERR(inode)) return PTR_ERR(inode); inode->i_op = iops; inode->i_private = dentry->d_fsdata; bpf_dentry_finalize(dentry, inode, dir); return 0; }
static int bpf_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) { struct inode *inode; inode = bpf_get_inode(dir->i_sb, dir, mode | S_IFDIR); if (IS_ERR(inode)) return PTR_ERR(inode); inode->i_op = &bpf_dir_iops; inode->i_fop = &simple_dir_operations; inc_nlink(inode); inc_nlink(dir); bpf_dentry_finalize(dentry, inode, dir); return 0; }
static int bpf_mkobj_ops(struct inode *dir, struct dentry *dentry, umode_t mode, const struct inode_operations *iops) { struct inode *inode; if (bpf_dname_reserved(dentry)) return -EPERM; inode = bpf_get_inode(dir->i_sb, dir, mode | S_IFREG); if (IS_ERR(inode)) return PTR_ERR(inode); inode->i_op = iops; inode->i_private = dentry->d_fsdata; d_instantiate(dentry, inode); dget(dentry); return 0; }
static int bpf_symlink(struct inode *dir, struct dentry *dentry, const char *target) { char *link = kstrdup(target, GFP_USER | __GFP_NOWARN); struct inode *inode; if (!link) return -ENOMEM; inode = bpf_get_inode(dir->i_sb, dir, S_IRWXUGO | S_IFLNK); if (IS_ERR(inode)) { kfree(link); return PTR_ERR(inode); } inode->i_op = &simple_symlink_inode_operations; inode->i_link = link; bpf_dentry_finalize(dentry, inode, dir); return 0; }
static int bpf_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) { struct inode *inode; if (bpf_dname_reserved(dentry)) return -EPERM; inode = bpf_get_inode(dir->i_sb, dir, mode | S_IFDIR); if (IS_ERR(inode)) return PTR_ERR(inode); inode->i_op = &bpf_dir_iops; inode->i_fop = &simple_dir_operations; inc_nlink(inode); inc_nlink(dir); d_instantiate(dentry, inode); dget(dentry); return 0; }