diff options
Diffstat (limited to 'fs/efs/namei.c')
-rw-r--r-- | fs/efs/namei.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/fs/efs/namei.c b/fs/efs/namei.c index ed4a207fe22a..5276b19423c1 100644 --- a/fs/efs/namei.c +++ b/fs/efs/namei.c | |||
@@ -75,6 +75,38 @@ struct dentry *efs_lookup(struct inode *dir, struct dentry *dentry, struct namei | |||
75 | return NULL; | 75 | return NULL; |
76 | } | 76 | } |
77 | 77 | ||
78 | struct dentry *efs_get_dentry(struct super_block *sb, void *vobjp) | ||
79 | { | ||
80 | __u32 *objp = vobjp; | ||
81 | unsigned long ino = objp[0]; | ||
82 | __u32 generation = objp[1]; | ||
83 | struct inode *inode; | ||
84 | struct dentry *result; | ||
85 | |||
86 | if (ino == 0) | ||
87 | return ERR_PTR(-ESTALE); | ||
88 | inode = iget(sb, ino); | ||
89 | if (inode == NULL) | ||
90 | return ERR_PTR(-ENOMEM); | ||
91 | |||
92 | if (is_bad_inode(inode) || | ||
93 | (generation && inode->i_generation != generation)) { | ||
94 | result = ERR_PTR(-ESTALE); | ||
95 | goto out_iput; | ||
96 | } | ||
97 | |||
98 | result = d_alloc_anon(inode); | ||
99 | if (!result) { | ||
100 | result = ERR_PTR(-ENOMEM); | ||
101 | goto out_iput; | ||
102 | } | ||
103 | return result; | ||
104 | |||
105 | out_iput: | ||
106 | iput(inode); | ||
107 | return result; | ||
108 | } | ||
109 | |||
78 | struct dentry *efs_get_parent(struct dentry *child) | 110 | struct dentry *efs_get_parent(struct dentry *child) |
79 | { | 111 | { |
80 | struct dentry *parent; | 112 | struct dentry *parent; |