diff options
Diffstat (limited to 'fs/sysv/inode.c')
-rw-r--r-- | fs/sysv/inode.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/fs/sysv/inode.c b/fs/sysv/inode.c index 81ec6c548c07..c5d60de0658f 100644 --- a/fs/sysv/inode.c +++ b/fs/sysv/inode.c | |||
@@ -169,20 +169,27 @@ void sysv_set_inode(struct inode *inode, dev_t rdev) | |||
169 | init_special_inode(inode, inode->i_mode, rdev); | 169 | init_special_inode(inode, inode->i_mode, rdev); |
170 | } | 170 | } |
171 | 171 | ||
172 | static void sysv_read_inode(struct inode *inode) | 172 | struct inode *sysv_iget(struct super_block *sb, unsigned int ino) |
173 | { | 173 | { |
174 | struct super_block * sb = inode->i_sb; | ||
175 | struct sysv_sb_info * sbi = SYSV_SB(sb); | 174 | struct sysv_sb_info * sbi = SYSV_SB(sb); |
176 | struct buffer_head * bh; | 175 | struct buffer_head * bh; |
177 | struct sysv_inode * raw_inode; | 176 | struct sysv_inode * raw_inode; |
178 | struct sysv_inode_info * si; | 177 | struct sysv_inode_info * si; |
179 | unsigned int block, ino = inode->i_ino; | 178 | struct inode *inode; |
179 | unsigned int block; | ||
180 | 180 | ||
181 | if (!ino || ino > sbi->s_ninodes) { | 181 | if (!ino || ino > sbi->s_ninodes) { |
182 | printk("Bad inode number on dev %s: %d is out of range\n", | 182 | printk("Bad inode number on dev %s: %d is out of range\n", |
183 | inode->i_sb->s_id, ino); | 183 | sb->s_id, ino); |
184 | goto bad_inode; | 184 | return ERR_PTR(-EIO); |
185 | } | 185 | } |
186 | |||
187 | inode = iget_locked(sb, ino); | ||
188 | if (!inode) | ||
189 | return ERR_PTR(-ENOMEM); | ||
190 | if (!(inode->i_state & I_NEW)) | ||
191 | return inode; | ||
192 | |||
186 | raw_inode = sysv_raw_inode(sb, ino, &bh); | 193 | raw_inode = sysv_raw_inode(sb, ino, &bh); |
187 | if (!raw_inode) { | 194 | if (!raw_inode) { |
188 | printk("Major problem: unable to read inode from dev %s\n", | 195 | printk("Major problem: unable to read inode from dev %s\n", |
@@ -214,11 +221,12 @@ static void sysv_read_inode(struct inode *inode) | |||
214 | old_decode_dev(fs32_to_cpu(sbi, si->i_data[0]))); | 221 | old_decode_dev(fs32_to_cpu(sbi, si->i_data[0]))); |
215 | else | 222 | else |
216 | sysv_set_inode(inode, 0); | 223 | sysv_set_inode(inode, 0); |
217 | return; | 224 | unlock_new_inode(inode); |
225 | return inode; | ||
218 | 226 | ||
219 | bad_inode: | 227 | bad_inode: |
220 | make_bad_inode(inode); | 228 | iget_failed(inode); |
221 | return; | 229 | return ERR_PTR(-EIO); |
222 | } | 230 | } |
223 | 231 | ||
224 | static struct buffer_head * sysv_update_inode(struct inode * inode) | 232 | static struct buffer_head * sysv_update_inode(struct inode * inode) |
@@ -328,7 +336,6 @@ static void init_once(struct kmem_cache *cachep, void *p) | |||
328 | const struct super_operations sysv_sops = { | 336 | const struct super_operations sysv_sops = { |
329 | .alloc_inode = sysv_alloc_inode, | 337 | .alloc_inode = sysv_alloc_inode, |
330 | .destroy_inode = sysv_destroy_inode, | 338 | .destroy_inode = sysv_destroy_inode, |
331 | .read_inode = sysv_read_inode, | ||
332 | .write_inode = sysv_write_inode, | 339 | .write_inode = sysv_write_inode, |
333 | .delete_inode = sysv_delete_inode, | 340 | .delete_inode = sysv_delete_inode, |
334 | .put_super = sysv_put_super, | 341 | .put_super = sysv_put_super, |