struct dentry *efs_get_parent(struct dentry *child) { struct dentry *parent; struct inode *inode; efs_ino_t ino; long error; lock_kernel(); error = -ENOENT; ino = efs_find_entry(child->d_inode, "..", 2); if (!ino) goto fail; inode = efs_iget(child->d_inode->i_sb, ino); if (IS_ERR(inode)) { error = PTR_ERR(inode); goto fail; } error = -ENOMEM; parent = d_alloc_anon(inode); if (!parent) goto fail_iput; unlock_kernel(); return parent; fail_iput: iput(inode); fail: unlock_kernel(); return ERR_PTR(error); }
struct dentry *efs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) { efs_ino_t inodenum; struct inode *inode = NULL; inodenum = efs_find_entry(dir, dentry->d_name.name, dentry->d_name.len); if (inodenum) inode = efs_iget(dir->i_sb, inodenum); return d_splice_alias(inode, dentry); }
struct dentry *efs_get_parent(struct dentry *child) { struct dentry *parent = ERR_PTR(-ENOENT); efs_ino_t ino; ino = efs_find_entry(d_inode(child), "..", 2); if (ino) parent = d_obtain_alias(efs_iget(d_inode(child)->i_sb, ino)); return parent; }
struct dentry *efs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) { efs_ino_t inodenum; struct inode * inode = NULL; inodenum = efs_find_entry(dir, dentry->d_name.name, dentry->d_name.len); if (inodenum) { inode = efs_iget(dir->i_sb, inodenum); if (IS_ERR(inode)) return ERR_CAST(inode); } return d_splice_alias(inode, dentry); }
struct dentry *efs_get_parent(struct dentry *child) { struct dentry *parent = ERR_PTR(-ENOENT); efs_ino_t ino; lock_kernel(); ino = efs_find_entry(child->d_inode, "..", 2); if (ino) parent = d_obtain_alias(efs_iget(child->d_inode->i_sb, ino)); unlock_kernel(); return parent; }
static struct inode *efs_nfs_get_inode(struct super_block *sb, u64 ino, u32 generation) { struct inode *inode; if (ino == 0) return ERR_PTR(-ESTALE); inode = efs_iget(sb, ino); if (IS_ERR(inode)) return ERR_CAST(inode); if (generation && inode->i_generation != generation) { iput(inode); return ERR_PTR(-ESTALE); } return inode; }
static int efs_fill_super(struct super_block *s, void *d, int silent) { struct efs_sb_info *sb; struct buffer_head *bh; struct inode *root; sb = kzalloc(sizeof(struct efs_sb_info), GFP_KERNEL); if (!sb) return -ENOMEM; s->s_fs_info = sb; s->s_magic = EFS_SUPER_MAGIC; if (!sb_set_blocksize(s, EFS_BLOCKSIZE)) { pr_err("device does not support %d byte blocks\n", EFS_BLOCKSIZE); return -EINVAL; } /* read the vh (volume header) block */ bh = sb_bread(s, 0); if (!bh) { pr_err("cannot read volume header\n"); return -EINVAL; } /* * if this returns zero then we didn't find any partition table. * this isn't (yet) an error - just assume for the moment that * the device is valid and go on to search for a superblock. */ sb->fs_start = efs_validate_vh((struct volume_header *) bh->b_data); brelse(bh); if (sb->fs_start == -1) { return -EINVAL; } bh = sb_bread(s, sb->fs_start + EFS_SUPER); if (!bh) { pr_err("cannot read superblock\n"); return -EINVAL; } if (efs_validate_super(sb, (struct efs_super *) bh->b_data)) { #ifdef DEBUG pr_warn("invalid superblock at block %u\n", sb->fs_start + EFS_SUPER); #endif brelse(bh); return -EINVAL; } brelse(bh); if (!(s->s_flags & MS_RDONLY)) { #ifdef DEBUG pr_info("forcing read-only mode\n"); #endif s->s_flags |= MS_RDONLY; } s->s_op = &efs_superblock_operations; s->s_export_op = &efs_export_ops; root = efs_iget(s, EFS_ROOTINODE); if (IS_ERR(root)) { pr_err("get root inode failed\n"); return PTR_ERR(root); } s->s_root = d_make_root(root); if (!(s->s_root)) { pr_err("get root dentry failed\n"); return -ENOMEM; } return 0; }