@@ -230,16 +230,23 @@ void jffs2_clear_inode (struct inode *inode)
230230 jffs2_do_clear_inode (c , f );
231231}
232232
233- void jffs2_read_inode (struct inode * inode )
233+ struct inode * jffs2_iget (struct super_block * sb , unsigned long ino )
234234{
235235 struct jffs2_inode_info * f ;
236236 struct jffs2_sb_info * c ;
237237 struct jffs2_raw_inode latest_node ;
238238 union jffs2_device_node jdev ;
239+ struct inode * inode ;
239240 dev_t rdev = 0 ;
240241 int ret ;
241242
242- D1 (printk (KERN_DEBUG "jffs2_read_inode(): inode->i_ino == %lu\n" , inode -> i_ino ));
243+ D1 (printk (KERN_DEBUG "jffs2_iget(): ino == %lu\n" , ino ));
244+
245+ inode = iget_locked (sb , ino );
246+ if (!inode )
247+ return ERR_PTR (- ENOMEM );
248+ if (!(inode -> i_state & I_NEW ))
249+ return inode ;
243250
244251 f = JFFS2_INODE_INFO (inode );
245252 c = JFFS2_SB_INFO (inode -> i_sb );
@@ -250,9 +257,9 @@ void jffs2_read_inode (struct inode *inode)
250257 ret = jffs2_do_read_inode (c , f , inode -> i_ino , & latest_node );
251258
252259 if (ret ) {
253- make_bad_inode (inode );
254260 up (& f -> sem );
255- return ;
261+ iget_failed (inode );
262+ return ERR_PTR (ret );
256263 }
257264 inode -> i_mode = jemode_to_cpu (latest_node .mode );
258265 inode -> i_uid = je16_to_cpu (latest_node .uid );
@@ -303,19 +310,14 @@ void jffs2_read_inode (struct inode *inode)
303310 if (f -> metadata -> size != sizeof (jdev .old ) &&
304311 f -> metadata -> size != sizeof (jdev .new )) {
305312 printk (KERN_NOTICE "Device node has strange size %d\n" , f -> metadata -> size );
306- up (& f -> sem );
307- jffs2_do_clear_inode (c , f );
308- make_bad_inode (inode );
309- return ;
313+ goto error_io ;
310314 }
311315 D1 (printk (KERN_DEBUG "Reading device numbers from flash\n" ));
312- if (jffs2_read_dnode (c , f , f -> metadata , (char * )& jdev , 0 , f -> metadata -> size ) < 0 ) {
316+ ret = jffs2_read_dnode (c , f , f -> metadata , (char * )& jdev , 0 , f -> metadata -> size );
317+ if (ret < 0 ) {
313318 /* Eep */
314319 printk (KERN_NOTICE "Read device numbers for inode %lu failed\n" , (unsigned long )inode -> i_ino );
315- up (& f -> sem );
316- jffs2_do_clear_inode (c , f );
317- make_bad_inode (inode );
318- return ;
320+ goto error ;
319321 }
320322 if (f -> metadata -> size == sizeof (jdev .old ))
321323 rdev = old_decode_dev (je16_to_cpu (jdev .old ));
@@ -335,6 +337,16 @@ void jffs2_read_inode (struct inode *inode)
335337 up (& f -> sem );
336338
337339 D1 (printk (KERN_DEBUG "jffs2_read_inode() returning\n" ));
340+ unlock_new_inode (inode );
341+ return inode ;
342+
343+ error_io :
344+ ret = - EIO ;
345+ error :
346+ up (& f -> sem );
347+ jffs2_do_clear_inode (c , f );
348+ iget_failed (inode );
349+ return ERR_PTR (ret );
338350}
339351
340352void jffs2_dirty_inode (struct inode * inode )
@@ -522,15 +534,16 @@ int jffs2_do_fill_super(struct super_block *sb, void *data, int silent)
522534 if ((ret = jffs2_do_mount_fs (c )))
523535 goto out_inohash ;
524536
525- ret = - EINVAL ;
526-
527537 D1 (printk (KERN_DEBUG "jffs2_do_fill_super(): Getting root inode\n" ));
528- root_i = iget (sb , 1 );
529- if (is_bad_inode (root_i )) {
538+ root_i = jffs2_iget (sb , 1 );
539+ if (IS_ERR (root_i )) {
530540 D1 (printk (KERN_WARNING "get root inode failed\n" ));
531- goto out_root_i ;
541+ ret = PTR_ERR (root_i );
542+ goto out_root ;
532543 }
533544
545+ ret = - ENOMEM ;
546+
534547 D1 (printk (KERN_DEBUG "jffs2_do_fill_super(): d_alloc_root()\n" ));
535548 sb -> s_root = d_alloc_root (root_i );
536549 if (!sb -> s_root )
@@ -546,6 +559,7 @@ int jffs2_do_fill_super(struct super_block *sb, void *data, int silent)
546559
547560 out_root_i :
548561 iput (root_i );
562+ out_root :
549563 jffs2_free_ino_caches (c );
550564 jffs2_free_raw_node_refs (c );
551565 if (jffs2_blocks_use_vmalloc (c ))
@@ -615,9 +629,9 @@ struct jffs2_inode_info *jffs2_gc_fetch_inode(struct jffs2_sb_info *c,
615629 jffs2_do_unlink() would need the alloc_sem and we have it.
616630 Just iget() it, and if read_inode() is necessary that's OK.
617631 */
618- inode = iget (OFNI_BS_2SFFJ (c ), inum );
619- if (! inode )
620- return ERR_PTR ( - ENOMEM );
632+ inode = jffs2_iget (OFNI_BS_2SFFJ (c ), inum );
633+ if (IS_ERR ( inode ) )
634+ return ERR_CAST ( inode );
621635 }
622636 if (is_bad_inode (inode )) {
623637 printk (KERN_NOTICE "Eep. read_inode() failed for ino #%u. nlink %d\n" ,
0 commit comments