[PATCH] ufs: directory and page cache: install aops
This series of patches finished "bugs fixing" mentioned here http://lkml.org/lkml/2006/1/31/275 . The main bugs: * for i in `seq 1 1000`; do touch $i; done - crash system * mkdir create directory without "." and ".." entries The suggested solution is work with page cache instead of straight work with blocks. Such solution has following advantages * reduce code size and its complexity * some global locks go away * fix bugs The most part of code is stolen from ext2, because of it has similar directory structure. Patches testes with UFS1 and UFS2 file systems. This patch installs i_mapping->a_ops for directory inodes and removes some duplicated code. Signed-off-by: Evgeniy Dushistov <dushistov@mail.ru> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
6ef4d6bf86
commit
826843a347
|
@ -552,6 +552,28 @@ struct address_space_operations ufs_aops = {
|
||||||
.bmap = ufs_bmap
|
.bmap = ufs_bmap
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void ufs_set_inode_ops(struct inode *inode)
|
||||||
|
{
|
||||||
|
if (S_ISREG(inode->i_mode)) {
|
||||||
|
inode->i_op = &ufs_file_inode_operations;
|
||||||
|
inode->i_fop = &ufs_file_operations;
|
||||||
|
inode->i_mapping->a_ops = &ufs_aops;
|
||||||
|
} else if (S_ISDIR(inode->i_mode)) {
|
||||||
|
inode->i_op = &ufs_dir_inode_operations;
|
||||||
|
inode->i_fop = &ufs_dir_operations;
|
||||||
|
inode->i_mapping->a_ops = &ufs_aops;
|
||||||
|
} else if (S_ISLNK(inode->i_mode)) {
|
||||||
|
if (!inode->i_blocks)
|
||||||
|
inode->i_op = &ufs_fast_symlink_inode_operations;
|
||||||
|
else {
|
||||||
|
inode->i_op = &page_symlink_inode_operations;
|
||||||
|
inode->i_mapping->a_ops = &ufs_aops;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
init_special_inode(inode, inode->i_mode,
|
||||||
|
ufs_get_inode_dev(inode->i_sb, UFS_I(inode)));
|
||||||
|
}
|
||||||
|
|
||||||
void ufs_read_inode (struct inode * inode)
|
void ufs_read_inode (struct inode * inode)
|
||||||
{
|
{
|
||||||
struct ufs_inode_info *ufsi = UFS_I(inode);
|
struct ufs_inode_info *ufsi = UFS_I(inode);
|
||||||
|
@ -626,23 +648,7 @@ void ufs_read_inode (struct inode * inode)
|
||||||
}
|
}
|
||||||
ufsi->i_osync = 0;
|
ufsi->i_osync = 0;
|
||||||
|
|
||||||
if (S_ISREG(inode->i_mode)) {
|
ufs_set_inode_ops(inode);
|
||||||
inode->i_op = &ufs_file_inode_operations;
|
|
||||||
inode->i_fop = &ufs_file_operations;
|
|
||||||
inode->i_mapping->a_ops = &ufs_aops;
|
|
||||||
} else if (S_ISDIR(inode->i_mode)) {
|
|
||||||
inode->i_op = &ufs_dir_inode_operations;
|
|
||||||
inode->i_fop = &ufs_dir_operations;
|
|
||||||
} else if (S_ISLNK(inode->i_mode)) {
|
|
||||||
if (!inode->i_blocks)
|
|
||||||
inode->i_op = &ufs_fast_symlink_inode_operations;
|
|
||||||
else {
|
|
||||||
inode->i_op = &page_symlink_inode_operations;
|
|
||||||
inode->i_mapping->a_ops = &ufs_aops;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
init_special_inode(inode, inode->i_mode,
|
|
||||||
ufs_get_inode_dev(sb, ufsi));
|
|
||||||
|
|
||||||
brelse (bh);
|
brelse (bh);
|
||||||
|
|
||||||
|
@ -702,23 +708,7 @@ ufs2_inode :
|
||||||
}
|
}
|
||||||
ufsi->i_osync = 0;
|
ufsi->i_osync = 0;
|
||||||
|
|
||||||
if (S_ISREG(inode->i_mode)) {
|
ufs_set_inode_ops(inode);
|
||||||
inode->i_op = &ufs_file_inode_operations;
|
|
||||||
inode->i_fop = &ufs_file_operations;
|
|
||||||
inode->i_mapping->a_ops = &ufs_aops;
|
|
||||||
} else if (S_ISDIR(inode->i_mode)) {
|
|
||||||
inode->i_op = &ufs_dir_inode_operations;
|
|
||||||
inode->i_fop = &ufs_dir_operations;
|
|
||||||
} else if (S_ISLNK(inode->i_mode)) {
|
|
||||||
if (!inode->i_blocks)
|
|
||||||
inode->i_op = &ufs_fast_symlink_inode_operations;
|
|
||||||
else {
|
|
||||||
inode->i_op = &page_symlink_inode_operations;
|
|
||||||
inode->i_mapping->a_ops = &ufs_aops;
|
|
||||||
}
|
|
||||||
} else /* TODO : here ...*/
|
|
||||||
init_special_inode(inode, inode->i_mode,
|
|
||||||
ufs_get_inode_dev(sb, ufsi));
|
|
||||||
|
|
||||||
brelse(bh);
|
brelse(bh);
|
||||||
|
|
||||||
|
|
|
@ -205,6 +205,7 @@ static int ufs_mkdir(struct inode * dir, struct dentry * dentry, int mode)
|
||||||
|
|
||||||
inode->i_op = &ufs_dir_inode_operations;
|
inode->i_op = &ufs_dir_inode_operations;
|
||||||
inode->i_fop = &ufs_dir_operations;
|
inode->i_fop = &ufs_dir_operations;
|
||||||
|
inode->i_mapping->a_ops = &ufs_aops;
|
||||||
|
|
||||||
inode_inc_link_count(inode);
|
inode_inc_link_count(inode);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue