[JFFS2] Fix inode allocation race
Signed-off-by: David Woodhouse <dwmw2@infradead.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
0a18cde60f
commit
7d200960d4
|
@ -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
|
JFFS2 LOCKING DOCUMENTATION
|
||||||
---------------------------
|
---------------------------
|
||||||
|
@ -108,6 +108,10 @@ in-core jffs2_inode_cache objects (each inode in JFFS2 has the
|
||||||
correspondent jffs2_inode_cache object). So, the inocache_lock
|
correspondent jffs2_inode_cache object). So, the inocache_lock
|
||||||
has to be locked while walking the c->inocache_list hash buckets.
|
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
|
Note, the f->sem guarantees that the correspondent jffs2_inode_cache
|
||||||
will not be removed. So, it is allowed to access it without locking
|
will not be removed. So, it is allowed to access it without locking
|
||||||
the inocache_lock spinlock.
|
the inocache_lock spinlock.
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*
|
*
|
||||||
* For licensing information, see the file 'LICENCE' in this directory.
|
* 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_sb_info *c, struct jffs2_inode_cache *new
|
||||||
struct jffs2_inode_cache **prev;
|
struct jffs2_inode_cache **prev;
|
||||||
D2(printk(KERN_DEBUG "jffs2_add_ino_cache: Add %p (ino #%u)\n", new, new->ino));
|
D2(printk(KERN_DEBUG "jffs2_add_ino_cache: Add %p (ino #%u)\n", new, new->ino));
|
||||||
spin_lock(&c->inocache_lock);
|
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];
|
prev = &c->inocache_list[new->ino % INOCACHE_HASHSIZE];
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*
|
*
|
||||||
* For licensing information, see the file 'LICENCE' in this directory.
|
* 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_info *c, struct jffs2_inode_info *f, uint
|
||||||
f->inocache = ic;
|
f->inocache = ic;
|
||||||
f->inocache->nlink = 1;
|
f->inocache->nlink = 1;
|
||||||
f->inocache->nodes = (struct jffs2_raw_node_ref *)f->inocache;
|
f->inocache->nodes = (struct jffs2_raw_node_ref *)f->inocache;
|
||||||
f->inocache->ino = ++c->highest_ino;
|
|
||||||
f->inocache->state = INO_STATE_PRESENT;
|
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);
|
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->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
|
||||||
ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
|
ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
|
||||||
|
|
Loading…
Reference in New Issue