Commit dac80052 authored by Andrew Morton's avatar Andrew Morton Committed by David S. Miller

[PATCH] ext2: clear ext3 htree flag on directories

Forward port of a change which Ted made to 2.4's ext2.

HTREE backwards compatibility patch.

"I thought (and assumed) this patch had been applied to both the ext2 and
 ext3 filesystems in the 2.4 kernel.  It turns out it had only made it into
 the ext3 filesystem code.  This means that if an HTREE-enabled filesystem is
 mounted using ext2, it will corrupt the filesystem as far as e2fsck and an
 ext3 htree-enabled kernel is concerned.  (The corruption won't cause any
 data loss, but it will cause e2fsck and an ext3-htree kernel to omit a lot
 of warning messages.)"
parent 37c8cc30
...@@ -420,6 +420,7 @@ void ext2_set_link(struct inode *dir, struct ext2_dir_entry_2 *de, ...@@ -420,6 +420,7 @@ void ext2_set_link(struct inode *dir, struct ext2_dir_entry_2 *de,
err = ext2_commit_chunk(page, from, to); err = ext2_commit_chunk(page, from, to);
ext2_put_page(page); ext2_put_page(page);
dir->i_mtime = dir->i_ctime = CURRENT_TIME; dir->i_mtime = dir->i_ctime = CURRENT_TIME;
EXT2_I(dir)->i_flags &= ~EXT2_BTREE_FL;
mark_inode_dirty(dir); mark_inode_dirty(dir);
} }
...@@ -509,6 +510,7 @@ int ext2_add_link (struct dentry *dentry, struct inode *inode) ...@@ -509,6 +510,7 @@ int ext2_add_link (struct dentry *dentry, struct inode *inode)
ext2_set_de_type (de, inode); ext2_set_de_type (de, inode);
err = ext2_commit_chunk(page, from, to); err = ext2_commit_chunk(page, from, to);
dir->i_mtime = dir->i_ctime = CURRENT_TIME; dir->i_mtime = dir->i_ctime = CURRENT_TIME;
EXT2_I(dir)->i_flags &= ~EXT2_BTREE_FL;
mark_inode_dirty(dir); mark_inode_dirty(dir);
/* OFFSET_CACHE */ /* OFFSET_CACHE */
out_put: out_put:
...@@ -556,6 +558,7 @@ int ext2_delete_entry (struct ext2_dir_entry_2 * dir, struct page * page ) ...@@ -556,6 +558,7 @@ int ext2_delete_entry (struct ext2_dir_entry_2 * dir, struct page * page )
dir->inode = 0; dir->inode = 0;
err = ext2_commit_chunk(page, from, to); err = ext2_commit_chunk(page, from, to);
inode->i_ctime = inode->i_mtime = CURRENT_TIME; inode->i_ctime = inode->i_mtime = CURRENT_TIME;
EXT2_I(inode)->i_flags &= ~EXT2_BTREE_FL;
mark_inode_dirty(inode); mark_inode_dirty(inode);
out: out:
ext2_put_page(page); ext2_put_page(page);
......
...@@ -526,7 +526,7 @@ struct inode * ext2_new_inode(struct inode * dir, int mode) ...@@ -526,7 +526,7 @@ struct inode * ext2_new_inode(struct inode * dir, int mode)
inode->i_blocks = 0; inode->i_blocks = 0;
inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
memset(ei->i_data, 0, sizeof(ei->i_data)); memset(ei->i_data, 0, sizeof(ei->i_data));
ei->i_flags = EXT2_I(dir)->i_flags; ei->i_flags = EXT2_I(dir)->i_flags & ~EXT2_BTREE_FL;
if (S_ISLNK(mode)) if (S_ISLNK(mode))
ei->i_flags &= ~(EXT2_IMMUTABLE_FL|EXT2_APPEND_FL); ei->i_flags &= ~(EXT2_IMMUTABLE_FL|EXT2_APPEND_FL);
/* dirsync is only applied to directories */ /* dirsync is only applied to directories */
......
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