Skip to content

Commit

Permalink
jffs2: Fix NFS race by using insert_inode_locked()
Browse files Browse the repository at this point in the history
New inodes need to be locked as we're creating them, so they don't get used
by other things (like NFSd) before they're ready.

Pointed out by Al Viro.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
  • Loading branch information
David Woodhouse authored and David Woodhouse committed Jun 3, 2010
1 parent f324e4c commit e72e649
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 3 deletions.
12 changes: 10 additions & 2 deletions fs/jffs2/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,15 +222,18 @@ static int jffs2_create(struct inode *dir_i, struct dentry *dentry, int mode,
dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));

jffs2_free_raw_inode(ri);
d_instantiate(dentry, inode);

D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
inode->i_ino, inode->i_mode, inode->i_nlink,
f->inocache->pino_nlink, inode->i_mapping->nrpages));

d_instantiate(dentry, inode);
unlock_new_inode(inode);
return 0;

fail:
make_bad_inode(inode);
unlock_new_inode(inode);
iput(inode);
jffs2_free_raw_inode(ri);
return ret;
Expand Down Expand Up @@ -447,10 +450,12 @@ static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char
jffs2_complete_reservation(c);

d_instantiate(dentry, inode);
unlock_new_inode(inode);
return 0;

fail:
make_bad_inode(inode);
unlock_new_inode(inode);
iput(inode);
return ret;
}
Expand Down Expand Up @@ -592,10 +597,12 @@ static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
jffs2_complete_reservation(c);

d_instantiate(dentry, inode);
unlock_new_inode(inode);
return 0;

fail:
make_bad_inode(inode);
unlock_new_inode(inode);
iput(inode);
return ret;
}
Expand Down Expand Up @@ -767,11 +774,12 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de
jffs2_complete_reservation(c);

d_instantiate(dentry, inode);

unlock_new_inode(inode);
return 0;

fail:
make_bad_inode(inode);
unlock_new_inode(inode);
iput(inode);
return ret;
}
Expand Down
7 changes: 6 additions & 1 deletion fs/jffs2/fs.c
Original file line number Diff line number Diff line change
Expand Up @@ -465,7 +465,12 @@ struct inode *jffs2_new_inode (struct inode *dir_i, int mode, struct jffs2_raw_i
inode->i_blocks = 0;
inode->i_size = 0;

insert_inode_hash(inode);
if (insert_inode_locked(inode) < 0) {
make_bad_inode(inode);
unlock_new_inode(inode);
iput(inode);
return ERR_PTR(-EINVAL);
}

return inode;
}
Expand Down

0 comments on commit e72e649

Please sign in to comment.