Beispiel #1
0
struct dentry *efs_get_parent(struct dentry *child)
{
    struct dentry *parent;
    struct inode *inode;
    efs_ino_t ino;
    int error;

    lock_kernel();

    error = -ENOENT;
    ino = efs_find_entry(child->d_inode, "..", 2);
    if (!ino)
        goto fail;

    error = -EACCES;
    inode = iget(child->d_inode->i_sb, ino);
    if (!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);
}
Beispiel #2
0
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);
}
Beispiel #3
0
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;
}
Beispiel #4
0
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);
}
Beispiel #5
0
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;
}
Beispiel #6
0
struct dentry *efs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) {
    efs_ino_t inodenum;
    struct inode * inode = NULL;

    lock_kernel();
    inodenum = efs_find_entry(dir, dentry->d_name.name, dentry->d_name.len);
    if (inodenum) {
        if (!(inode = iget(dir->i_sb, inodenum))) {
            unlock_kernel();
            return ERR_PTR(-EACCES);
        }
    }
    unlock_kernel();

    d_add(dentry, inode);
    return NULL;
}