tree 0faf7439968a955f55871048448abb36fa44c090
parent 0a18cde60f384d1f7aa012aba004766fb633a31d
author David Woodhouse <[EMAIL PROTECTED]> Wed, 13 Apr 2005 14:22:38 +0100
committer Thomas Gleixner <[EMAIL PROTECTED]> Mon, 23 May 2005 13:17:49 +0200

[JFFS2] Fix inode allocation race

Signed-off-by: David Woodhouse <[EMAIL PROTECTED]>
Signed-off-by: Thomas Gleixner <[EMAIL PROTECTED]>

 fs/jffs2/README.Locking |    6 +++++-
 fs/jffs2/nodelist.c     |    6 +++++-
 fs/jffs2/write.c        |    7 +++----
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/fs/jffs2/README.Locking b/fs/jffs2/README.Locking
--- a/fs/jffs2/README.Locking
+++ b/fs/jffs2/README.Locking
@@ -1,4 +1,4 @@
-       $Id: README.Locking,v 1.9 2004/11/20 10:35:40 dwmw2 Exp $
+       $Id: README.Locking,v 1.12 2005/04/13 13:22:35 dwmw2 Exp $
 
        JFFS2 LOCKING DOCUMENTATION
        ---------------------------
@@ -108,6 +108,10 @@ in-core jffs2_inode_cache objects (each 
 correspondent jffs2_inode_cache object). So, the inocache_lock
 has to be locked while walking the c->inocache_list hash buckets.
 
+This spinlock also covers allocation of new inode numbers, which is
+currently just '++->highest_ino++', but might one day get more complicated
+if we need to deal with wrapping after 4 milliard inode numbers are used.
+
 Note, the f->sem guarantees that the correspondent jffs2_inode_cache
 will not be removed. So, it is allowed to access it without locking
 the inocache_lock spinlock. 
diff --git a/fs/jffs2/nodelist.c b/fs/jffs2/nodelist.c
--- a/fs/jffs2/nodelist.c
+++ b/fs/jffs2/nodelist.c
@@ -7,7 +7,7 @@
  *
  * For licensing information, see the file 'LICENCE' in this directory.
  *
- * $Id: nodelist.c,v 1.93 2005/02/27 23:01:32 dwmw2 Exp $
+ * $Id: nodelist.c,v 1.94 2005/04/13 13:22:35 dwmw2 Exp $
  *
  */
 
@@ -491,6 +491,10 @@ void jffs2_add_ino_cache (struct jffs2_s
        struct jffs2_inode_cache **prev;
        D2(printk(KERN_DEBUG "jffs2_add_ino_cache: Add %p (ino #%u)\n", new, 
new->ino));
        spin_lock(&c->inocache_lock);
+       if (!new->ino)
+               new->ino = ++c->highest_ino;
+ 
+       D2(printk(KERN_DEBUG "jffs2_add_ino_cache: Add %p (ino #%u)\n", new, 
new->ino));
        
        prev = &c->inocache_list[new->ino % INOCACHE_HASHSIZE];
 
diff --git a/fs/jffs2/write.c b/fs/jffs2/write.c
--- a/fs/jffs2/write.c
+++ b/fs/jffs2/write.c
@@ -7,7 +7,7 @@
  *
  * For licensing information, see the file 'LICENCE' in this directory.
  *
- * $Id: write.c,v 1.91 2005/03/01 10:34:03 dedekind Exp $
+ * $Id: write.c,v 1.92 2005/04/13 13:22:35 dwmw2 Exp $
  *
  */
 
@@ -35,13 +35,12 @@ int jffs2_do_new_inode(struct jffs2_sb_i
        f->inocache = ic;
        f->inocache->nlink = 1;
        f->inocache->nodes = (struct jffs2_raw_node_ref *)f->inocache;
-       f->inocache->ino = ++c->highest_ino;
        f->inocache->state = INO_STATE_PRESENT;
 
-       ri->ino = cpu_to_je32(f->inocache->ino);
 
-       D1(printk(KERN_DEBUG "jffs2_do_new_inode(): Assigned ino# %d\n", 
f->inocache->ino));
        jffs2_add_ino_cache(c, f->inocache);
+       D1(printk(KERN_DEBUG "jffs2_do_new_inode(): Assigned ino# %d\n", 
f->inocache->ino));
+       ri->ino = cpu_to_je32(f->inocache->ino);
 
        ri->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
        ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to