changeset 1890:8ebde8529dc7

* src/fs-ecos.c * src/dir-ecos.c: Fixed the sign of the return codes in various places. iput the inode only after we have finished with it etc.
author asl
date Tue, 08 Feb 2005 19:31:39 +0000
parents a06d718514f8
children 314ff4b264b6
files packages/fs/jffs2/current/ChangeLog packages/fs/jffs2/current/src/dir-ecos.c packages/fs/jffs2/current/src/fs-ecos.c
diffstat 3 files changed, 34 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/packages/fs/jffs2/current/ChangeLog
+++ b/packages/fs/jffs2/current/ChangeLog
@@ -1,3 +1,10 @@
+2005-02-08  Estelle HAMMACHE <estelle.hammache@st.com>
+
+	* src/fs-ecos.c 
+	* src/dir-ecos.c: Fixed the sign of the return codes in various
+	places. iput the inode only after we have finished with
+	it etc.
+	
 2005-01-22  Andrew Lunn  <andrew.lunn@ascom.ch>
 
 	* Merge from public MTD.
--- a/packages/fs/jffs2/current/src/dir-ecos.c
+++ b/packages/fs/jffs2/current/src/dir-ecos.c
@@ -48,9 +48,9 @@ struct _inode *jffs2_lookup(struct _inod
 	up(&dir_f->sem);
 	if (ino) {
 		inode = jffs2_iget(dir_i->i_sb, ino);
-		if (!inode) {
+		if (IS_ERR(inode)) {
 			printk("jffs2_iget() failed for ino #%u\n", ino);
-			return (ERR_PTR(-EIO));
+			return inode;
 		}
 	}
 
--- a/packages/fs/jffs2/current/src/fs-ecos.c
+++ b/packages/fs/jffs2/current/src/fs-ecos.c
@@ -709,7 +709,7 @@ static int jffs2_open(cyg_mtab_entry * m
 			if (err != 0) {
                                 //Possible orphaned inode on the flash - but will be gc'd
                           	jffs2_iput(ds.dir);
-                                return err;
+                                return -err;
 			}
 
 			err = ENOERR;
@@ -825,9 +825,10 @@ static int jffs2_ops_mkdir(cyg_mtab_entr
 	} else {
 		// If there we no error, something already exists with that
 		// name, so we cannot create another one.
-		jffs2_iput(ds.node);
-		if (err == ENOERR)
-			err = EEXIST;
+               if (err == ENOERR) {
+            		jffs2_iput(ds.node);
+                        err = EEXIST;
+               }
 	}
 	jffs2_iput(ds.dir);
 	return err;
@@ -946,7 +947,6 @@ static int jffs2_ops_rename(cyg_mtab_ent
 		    ds2.dir->i_ctime = ds2.dir->i_mtime = cyg_timestamp();
  out:
 	jffs2_iput(ds1.dir);
-	jffs2_iput(ds1.node);
 	if (S_ISDIR(ds1.node->i_mode)) {
 		/* Renamed a directory to elsewhere... so fix up its
 		   i_parent pointer and the i_counts of its old and
@@ -957,10 +957,11 @@ static int jffs2_ops_rename(cyg_mtab_ent
 	} else {
 		jffs2_iput(ds2.dir); /* ... doing this */
 	}
+	jffs2_iput(ds1.node);
 	if (ds2.node)
 		jffs2_iput(ds2.node);
  
-	return -err;
+	return err;
 }
 
 // -------------------------------------------------------------------------
@@ -1095,9 +1096,11 @@ static int jffs2_chdir(cyg_mtab_entry * 
 			return err;
 
 		// check it is a directory
-		if (!S_ISDIR(ds.node->i_mode))
+		if (!S_ISDIR(ds.node->i_mode)) {
+                        jffs2_iput(ds.node);
 			return ENOTDIR;
-
+                }
+                
 		// Pass it out
 		*dir_out = (cyg_dir) ds.node;
 	} else {
@@ -1363,7 +1366,7 @@ static int jffs2_fo_write(struct CYG_FIL
 		int err;
 
 		D2(printf("jffs2_fo_write page_start_pos %d\n", pos));
-		D2(printf("jffs2_fo_write transfer size %d\n", l));
+		D2(printf("jffs2_fo_write transfer size %d\n", len));
 
 		err = jffs2_write_inode_range(c, f, &ri, buf,
 					      pos, len, &writtenlen);
@@ -1421,8 +1424,6 @@ static int jffs2_fo_lseek(struct CYG_FIL
 		return EINVAL;
 	}
 
-        // Check that pos is still within current file size, or at the
-        // very end.
         if (pos < 0 )
                 return EINVAL;
 
@@ -1752,13 +1753,14 @@ struct _inode *jffs2_iget(struct super_b
 	// Not cached, so malloc it
 	inode = new_inode(sb);
 	if (inode == NULL)
-		return 0;
+		return ERR_PTR(-ENOMEM);
 
 	inode->i_ino = ino;
 
 	err = jffs2_read_inode(inode);
 	if (err) {
 		printf("jffs2_read_inode() failed\n");
+                inode->i_nlink = 0; // free _this_ bad inode right now
 		jffs2_iput(inode);
 		inode = NULL;
 		return ERR_PTR(err);
@@ -1869,8 +1871,17 @@ struct _inode *jffs2_new_inode (struct _
 	ri->mode =  cpu_to_jemode(mode);
 	ret = jffs2_do_new_inode (c, f, mode, ri);
 	if (ret) {
-		jffs2_iput(inode);
-		return ERR_PTR(ret);
+                // forceful evict: f->sem is locked already, and the
+                // inode is bad.
+                if (inode->i_cache_prev)
+                       inode->i_cache_prev->i_cache_next = inode->i_cache_next;
+                if (inode->i_cache_next)
+                       inode->i_cache_next->i_cache_prev = inode->i_cache_prev; 
+                up(&(f->sem));
+                jffs2_clear_inode(inode);
+                memset(inode, 0x6a, sizeof(*inode));
+                free(inode);
+                return ERR_PTR(ret);
 	}
 	inode->i_nlink = 1;
 	inode->i_ino = je32_to_cpu(ri->ino);