Merge branch 'work.mkdir' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs icache updates from Al Viro: - NFS mkdir/open_by_handle race fix - analogous solution for FUSE, replacing the one currently in mainline - new primitive to be used when discarding halfway set up inodes on failed object creation; gives sane warranties re icache lookups not returning such doomed by still not freed inodes. A bunch of filesystems switched to that animal. - Miklos' fix for last cycle regression in iget5_locked(); -stable will need a slightly different variant, unfortunately. - misc bits and pieces around things icache-related (in adfs and jfs). * 'work.mkdir' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: jfs: don't bother with make_bad_inode() in ialloc() adfs: don't put inodes into icache new helper: inode_fake_hash() vfs: don't evict uninitialized inode jfs: switch to discard_new_inode() ext2: make sure that partially set up inodes won't be returned by ext2_iget() udf: switch to discard_new_inode() ufs: switch to discard_new_inode() btrfs: switch to discard_new_inode() new primitive: discard_new_inode() kill d_instantiate_no_diralias() nfs_instantiate(): prevent multiple aliases for directory inode
This commit is contained in:
@@ -491,13 +491,7 @@ struct inode *diReadSpecial(struct super_block *sb, ino_t inum, int secondary)
|
||||
/* release the page */
|
||||
release_metapage(mp);
|
||||
|
||||
/*
|
||||
* __mark_inode_dirty expects inodes to be hashed. Since we don't
|
||||
* want special inodes in the fileset inode space, we make them
|
||||
* appear hashed, but do not put on any lists. hlist_del()
|
||||
* will work fine and require no locking.
|
||||
*/
|
||||
hlist_add_fake(&ip->i_hash);
|
||||
inode_fake_hash(ip);
|
||||
|
||||
return (ip);
|
||||
}
|
||||
|
||||
@@ -61,8 +61,7 @@ struct inode *ialloc(struct inode *parent, umode_t mode)
|
||||
inode = new_inode(sb);
|
||||
if (!inode) {
|
||||
jfs_warn("ialloc: new_inode returned NULL!");
|
||||
rc = -ENOMEM;
|
||||
goto fail;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
jfs_inode = JFS_IP(inode);
|
||||
@@ -70,8 +69,6 @@ struct inode *ialloc(struct inode *parent, umode_t mode)
|
||||
rc = diAlloc(parent, S_ISDIR(mode), inode);
|
||||
if (rc) {
|
||||
jfs_warn("ialloc: diAlloc returned %d!", rc);
|
||||
if (rc == -EIO)
|
||||
make_bad_inode(inode);
|
||||
goto fail_put;
|
||||
}
|
||||
|
||||
@@ -141,9 +138,10 @@ fail_drop:
|
||||
dquot_drop(inode);
|
||||
inode->i_flags |= S_NOQUOTA;
|
||||
clear_nlink(inode);
|
||||
unlock_new_inode(inode);
|
||||
discard_new_inode(inode);
|
||||
return ERR_PTR(rc);
|
||||
|
||||
fail_put:
|
||||
iput(inode);
|
||||
fail:
|
||||
return ERR_PTR(rc);
|
||||
}
|
||||
|
||||
@@ -175,8 +175,7 @@ static int jfs_create(struct inode *dip, struct dentry *dentry, umode_t mode,
|
||||
if (rc) {
|
||||
free_ea_wmap(ip);
|
||||
clear_nlink(ip);
|
||||
unlock_new_inode(ip);
|
||||
iput(ip);
|
||||
discard_new_inode(ip);
|
||||
} else {
|
||||
d_instantiate_new(dentry, ip);
|
||||
}
|
||||
@@ -309,8 +308,7 @@ static int jfs_mkdir(struct inode *dip, struct dentry *dentry, umode_t mode)
|
||||
if (rc) {
|
||||
free_ea_wmap(ip);
|
||||
clear_nlink(ip);
|
||||
unlock_new_inode(ip);
|
||||
iput(ip);
|
||||
discard_new_inode(ip);
|
||||
} else {
|
||||
d_instantiate_new(dentry, ip);
|
||||
}
|
||||
@@ -1054,8 +1052,7 @@ static int jfs_symlink(struct inode *dip, struct dentry *dentry,
|
||||
if (rc) {
|
||||
free_ea_wmap(ip);
|
||||
clear_nlink(ip);
|
||||
unlock_new_inode(ip);
|
||||
iput(ip);
|
||||
discard_new_inode(ip);
|
||||
} else {
|
||||
d_instantiate_new(dentry, ip);
|
||||
}
|
||||
@@ -1441,8 +1438,7 @@ static int jfs_mknod(struct inode *dir, struct dentry *dentry,
|
||||
if (rc) {
|
||||
free_ea_wmap(ip);
|
||||
clear_nlink(ip);
|
||||
unlock_new_inode(ip);
|
||||
iput(ip);
|
||||
discard_new_inode(ip);
|
||||
} else {
|
||||
d_instantiate_new(dentry, ip);
|
||||
}
|
||||
|
||||
@@ -581,7 +581,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent)
|
||||
inode->i_ino = 0;
|
||||
inode->i_size = i_size_read(sb->s_bdev->bd_inode);
|
||||
inode->i_mapping->a_ops = &jfs_metapage_aops;
|
||||
hlist_add_fake(&inode->i_hash);
|
||||
inode_fake_hash(inode);
|
||||
mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS);
|
||||
|
||||
sbi->direct_inode = inode;
|
||||
|
||||
Reference in New Issue
Block a user