static int oprofilefs_fill_super(struct super_block * sb, void * data, int silent) { struct inode * root_inode; struct dentry * root_dentry; sb->s_blocksize = PAGE_CACHE_SIZE; sb->s_blocksize_bits = PAGE_CACHE_SHIFT; sb->s_magic = OPROFILEFS_MAGIC; sb->s_op = &s_ops; sb->s_time_gran = 1; root_inode = oprofilefs_get_inode(sb, S_IFDIR | 0755); if (!root_inode) return -ENOMEM; root_inode->i_op = &simple_dir_inode_operations; root_inode->i_fop = &simple_dir_operations; root_dentry = d_alloc_root(root_inode); if (!root_dentry) { iput(root_inode); return -ENOMEM; } sb->s_root = root_dentry; oprofile_create_files(sb, root_dentry); // FIXME: verify kill_litter_super removes our dentries return 0; }
struct dentry * oprofilefs_mkdir(struct super_block * sb, struct dentry * root, char const * name) { struct dentry * dentry; struct inode * inode; dentry = d_alloc_name(root, name); if (!dentry) return NULL; inode = oprofilefs_get_inode(sb, S_IFDIR | 0755); if (!inode) { dput(dentry); return NULL; } inode->i_op = &simple_dir_inode_operations; inode->i_fop = &simple_dir_operations; d_add(dentry, inode); return dentry; }
static struct dentry * __oprofilefs_create_file(struct super_block * sb, struct dentry * root, char const * name, const struct file_operations * fops, int perm) { struct dentry * dentry; struct inode * inode; dentry = d_alloc_name(root, name); if (!dentry) return NULL; inode = oprofilefs_get_inode(sb, S_IFREG | perm); if (!inode) { dput(dentry); return NULL; } inode->i_fop = fops; d_add(dentry, inode); return dentry; }
static int __oprofilefs_create_file(struct super_block *sb, struct dentry *root, char const *name, const struct file_operations *fops, int perm, void *priv) { struct dentry *dentry; struct inode *inode; dentry = d_alloc_name(root, name); if (!dentry) return -ENOMEM; inode = oprofilefs_get_inode(sb, S_IFREG | perm); if (!inode) { dput(dentry); return -ENOMEM; } inode->i_fop = fops; d_add(dentry, inode); dentry->d_inode->i_private = priv; return 0; }
static struct dentry * __oprofilefs_create_file(struct super_block * sb, struct dentry * root, char const * name, struct file_operations * fops) { struct dentry * dentry; struct inode * inode; struct qstr qname; qname.name = name; qname.len = strlen(name); qname.hash = full_name_hash(qname.name, qname.len); dentry = d_alloc(root, &qname); if (!dentry) return 0; inode = oprofilefs_get_inode(sb, S_IFREG | 0644); if (!inode) { dput(dentry); return 0; } inode->i_fop = fops; d_add(dentry, inode); return dentry; }
struct dentry * oprofilefs_mkdir(struct super_block * sb, struct dentry * root, char const * name) { struct dentry * dentry; struct inode * inode; struct qstr qname; qname.name = name; qname.len = strlen(name); qname.hash = full_name_hash(qname.name, qname.len); dentry = d_alloc(root, &qname); if (!dentry) return 0; inode = oprofilefs_get_inode(sb, S_IFDIR | 0755); if (!inode) { dput(dentry); return 0; } inode->i_op = &oprofilefs_dir_inode_operations; inode->i_fop = &oprofilefs_dir_operations; d_add(dentry, inode); return dentry; }
struct dentry *oprofilefs_mkdir(struct dentry *parent, char const *name) { struct dentry *dentry; struct inode *inode; inode_lock(d_inode(parent)); dentry = d_alloc_name(parent, name); if (!dentry) { inode_unlock(d_inode(parent)); return NULL; } inode = oprofilefs_get_inode(parent->d_sb, S_IFDIR | 0755); if (!inode) { dput(dentry); inode_unlock(d_inode(parent)); return NULL; } inode->i_op = &simple_dir_inode_operations; inode->i_fop = &simple_dir_operations; d_add(dentry, inode); inode_unlock(d_inode(parent)); return dentry; }