Commit 1f3403fa authored by Dave Kleikamp's avatar Dave Kleikamp Committed by Al Viro

nfsd race fixes: jfs

jfs version of Al Viro's nfsd race patches
Signed-off-by: default avatarDave Kleikamp <shaggy@linux.vnet.ibm.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent c1eaa26b
...@@ -79,7 +79,8 @@ struct inode *ialloc(struct inode *parent, umode_t mode) ...@@ -79,7 +79,8 @@ struct inode *ialloc(struct inode *parent, umode_t mode)
inode = new_inode(sb); inode = new_inode(sb);
if (!inode) { if (!inode) {
jfs_warn("ialloc: new_inode returned NULL!"); jfs_warn("ialloc: new_inode returned NULL!");
return ERR_PTR(-ENOMEM); rc = -ENOMEM;
goto fail;
} }
jfs_inode = JFS_IP(inode); jfs_inode = JFS_IP(inode);
...@@ -89,8 +90,12 @@ struct inode *ialloc(struct inode *parent, umode_t mode) ...@@ -89,8 +90,12 @@ struct inode *ialloc(struct inode *parent, umode_t mode)
jfs_warn("ialloc: diAlloc returned %d!", rc); jfs_warn("ialloc: diAlloc returned %d!", rc);
if (rc == -EIO) if (rc == -EIO)
make_bad_inode(inode); make_bad_inode(inode);
iput(inode); goto fail_put;
return ERR_PTR(rc); }
if (insert_inode_locked(inode) < 0) {
rc = -EINVAL;
goto fail_unlock;
} }
inode->i_uid = current_fsuid(); inode->i_uid = current_fsuid();
...@@ -112,11 +117,8 @@ struct inode *ialloc(struct inode *parent, umode_t mode) ...@@ -112,11 +117,8 @@ struct inode *ialloc(struct inode *parent, umode_t mode)
* Allocate inode to quota. * Allocate inode to quota.
*/ */
if (DQUOT_ALLOC_INODE(inode)) { if (DQUOT_ALLOC_INODE(inode)) {
DQUOT_DROP(inode); rc = -EDQUOT;
inode->i_flags |= S_NOQUOTA; goto fail_drop;
inode->i_nlink = 0;
iput(inode);
return ERR_PTR(-EDQUOT);
} }
inode->i_mode = mode; inode->i_mode = mode;
...@@ -158,4 +160,15 @@ struct inode *ialloc(struct inode *parent, umode_t mode) ...@@ -158,4 +160,15 @@ struct inode *ialloc(struct inode *parent, umode_t mode)
jfs_info("ialloc returns inode = 0x%p\n", inode); jfs_info("ialloc returns inode = 0x%p\n", inode);
return inode; return inode;
fail_drop:
DQUOT_DROP(inode);
inode->i_flags |= S_NOQUOTA;
fail_unlock:
inode->i_nlink = 0;
unlock_new_inode(inode);
fail_put:
iput(inode);
fail:
return ERR_PTR(rc);
} }
...@@ -155,7 +155,6 @@ static int jfs_create(struct inode *dip, struct dentry *dentry, int mode, ...@@ -155,7 +155,6 @@ static int jfs_create(struct inode *dip, struct dentry *dentry, int mode,
ip->i_fop = &jfs_file_operations; ip->i_fop = &jfs_file_operations;
ip->i_mapping->a_ops = &jfs_aops; ip->i_mapping->a_ops = &jfs_aops;
insert_inode_hash(ip);
mark_inode_dirty(ip); mark_inode_dirty(ip);
dip->i_ctime = dip->i_mtime = CURRENT_TIME; dip->i_ctime = dip->i_mtime = CURRENT_TIME;
...@@ -171,9 +170,12 @@ static int jfs_create(struct inode *dip, struct dentry *dentry, int mode, ...@@ -171,9 +170,12 @@ static int jfs_create(struct inode *dip, struct dentry *dentry, int mode,
if (rc) { if (rc) {
free_ea_wmap(ip); free_ea_wmap(ip);
ip->i_nlink = 0; ip->i_nlink = 0;
unlock_new_inode(ip);
iput(ip); iput(ip);
} else } else {
d_instantiate(dentry, ip); d_instantiate(dentry, ip);
unlock_new_inode(ip);
}
out2: out2:
free_UCSname(&dname); free_UCSname(&dname);
...@@ -289,7 +291,6 @@ static int jfs_mkdir(struct inode *dip, struct dentry *dentry, int mode) ...@@ -289,7 +291,6 @@ static int jfs_mkdir(struct inode *dip, struct dentry *dentry, int mode)
ip->i_op = &jfs_dir_inode_operations; ip->i_op = &jfs_dir_inode_operations;
ip->i_fop = &jfs_dir_operations; ip->i_fop = &jfs_dir_operations;
insert_inode_hash(ip);
mark_inode_dirty(ip); mark_inode_dirty(ip);
/* update parent directory inode */ /* update parent directory inode */
...@@ -306,9 +307,12 @@ static int jfs_mkdir(struct inode *dip, struct dentry *dentry, int mode) ...@@ -306,9 +307,12 @@ static int jfs_mkdir(struct inode *dip, struct dentry *dentry, int mode)
if (rc) { if (rc) {
free_ea_wmap(ip); free_ea_wmap(ip);
ip->i_nlink = 0; ip->i_nlink = 0;
unlock_new_inode(ip);
iput(ip); iput(ip);
} else } else {
d_instantiate(dentry, ip); d_instantiate(dentry, ip);
unlock_new_inode(ip);
}
out2: out2:
free_UCSname(&dname); free_UCSname(&dname);
...@@ -1019,7 +1023,6 @@ static int jfs_symlink(struct inode *dip, struct dentry *dentry, ...@@ -1019,7 +1023,6 @@ static int jfs_symlink(struct inode *dip, struct dentry *dentry,
goto out3; goto out3;
} }
insert_inode_hash(ip);
mark_inode_dirty(ip); mark_inode_dirty(ip);
dip->i_ctime = dip->i_mtime = CURRENT_TIME; dip->i_ctime = dip->i_mtime = CURRENT_TIME;
...@@ -1039,9 +1042,12 @@ static int jfs_symlink(struct inode *dip, struct dentry *dentry, ...@@ -1039,9 +1042,12 @@ static int jfs_symlink(struct inode *dip, struct dentry *dentry,
if (rc) { if (rc) {
free_ea_wmap(ip); free_ea_wmap(ip);
ip->i_nlink = 0; ip->i_nlink = 0;
unlock_new_inode(ip);
iput(ip); iput(ip);
} else } else {
d_instantiate(dentry, ip); d_instantiate(dentry, ip);
unlock_new_inode(ip);
}
out2: out2:
free_UCSname(&dname); free_UCSname(&dname);
...@@ -1399,7 +1405,6 @@ static int jfs_mknod(struct inode *dir, struct dentry *dentry, ...@@ -1399,7 +1405,6 @@ static int jfs_mknod(struct inode *dir, struct dentry *dentry,
jfs_ip->dev = new_encode_dev(rdev); jfs_ip->dev = new_encode_dev(rdev);
init_special_inode(ip, ip->i_mode, rdev); init_special_inode(ip, ip->i_mode, rdev);
insert_inode_hash(ip);
mark_inode_dirty(ip); mark_inode_dirty(ip);
dir->i_ctime = dir->i_mtime = CURRENT_TIME; dir->i_ctime = dir->i_mtime = CURRENT_TIME;
...@@ -1417,9 +1422,12 @@ static int jfs_mknod(struct inode *dir, struct dentry *dentry, ...@@ -1417,9 +1422,12 @@ static int jfs_mknod(struct inode *dir, struct dentry *dentry,
if (rc) { if (rc) {
free_ea_wmap(ip); free_ea_wmap(ip);
ip->i_nlink = 0; ip->i_nlink = 0;
unlock_new_inode(ip);
iput(ip); iput(ip);
} else } else {
d_instantiate(dentry, ip); d_instantiate(dentry, ip);
unlock_new_inode(ip);
}
out1: out1:
free_UCSname(&dname); free_UCSname(&dname);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment