@@ -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