tune2fs.c (update_feature_set, remove_journal_inode): If

removing an in-filesystem journal, clear out the journal
	inode and update the filesystem accounting structures so
	we don't have to run e2fsck to clean up after ourselves
This commit is contained in:
Theodore Ts'o 2001-07-31 12:03:23 -04:00
parent de49f015a4
commit 194686bbae
2 changed files with 69 additions and 22 deletions

View File

@ -1,3 +1,10 @@
2001-07-31 Theodore Tso <tytso@valinux.com>
* tune2fs.c (update_feature_set, remove_journal_inode): If
removing an in-filesystem journal, clear out the journal
inode and update the filesystem accounting structures so
we don't have to run e2fsck to clean up after ourselves
2001-07-30 Theodore Tso <tytso@valinux.com>
* tune2fs.c (update_feature_set): Don't require a forced fsck if

View File

@ -175,6 +175,66 @@ no_valid_journal:
printf(_("Journal removed\n"));
}
/* Helper function for remove_journal_inode */
static int release_blocks_proc(ext2_filsys fs, blk_t *blocknr,
int blockcnt, void *private)
{
blk_t block;
int group;
block = *blocknr;
ext2fs_unmark_block_bitmap(fs->block_map,block);
group = ext2fs_group_of_blk(fs, block);
fs->group_desc[group].bg_free_blocks_count++;
fs->super->s_free_blocks_count++;
return 0;
}
/*
* Remove the journal inode from the filesystem
*/
static void remove_journal_inode(ext2_filsys fs)
{
struct ext2_inode inode;
errcode_t retval;
ino_t ino = fs->super->s_journal_inum;
int group;
retval = ext2fs_read_inode(fs, ino, &inode);
if (retval) {
com_err(program_name, retval,
_("while reading journal inode"));
exit(1);
}
if (ino == EXT2_JOURNAL_INO) {
retval = ext2fs_read_bitmaps(fs);
if (retval) {
com_err(program_name, retval,
_("while reading bitmaps"));
exit(1);
}
retval = ext2fs_block_iterate(fs, ino, 0, NULL,
release_blocks_proc, NULL);
if (retval) {
com_err(program_name, retval,
_("while clearing journal inode"));
exit(1);
}
memset(&inode, 0, sizeof(inode));
ext2fs_mark_bb_dirty(fs);
group = ext2fs_group_of_ino(fs, ino);
fs->flags &= ~EXT2_FLAG_SUPER_ONLY;
} else
inode.i_flags &= ~EXT2_IMMUTABLE_FL;
retval = ext2fs_write_inode(fs, ino, &inode);
if (retval) {
com_err(program_name, retval,
_("while writing journal inode"));
exit(1);
}
fs->super->s_journal_inum = 0;
ext2fs_mark_super_dirty(fs);
}
/*
* Update the feature set as provided by the user.
@ -223,29 +283,11 @@ static void update_feature_set(ext2_filsys fs, char *features)
"the has_journal flag.\n"));
exit(1);
}
/*
* Remove the immutable flag on the journal inode
*/
if (sb->s_journal_inum) {
retval = ext2fs_read_inode(fs, sb->s_journal_inum,
&inode);
if (retval) {
com_err(program_name, retval,
"while reading journal inode");
exit(1);
}
inode.i_flags &= ~EXT2_IMMUTABLE_FL;
retval = ext2fs_write_inode(fs, sb->s_journal_inum,
&inode);
if (retval) {
com_err(program_name, retval,
"while writing journal inode");
exit(1);
}
remove_journal_inode(fs);
}
if (sb->s_journal_dev) {
remove_journal_device(fs);
journal = old_journal;
}
}
if (journal && !old_journal) {
@ -258,7 +300,6 @@ static void update_feature_set(ext2_filsys fs, char *features)
if (!journal_size)
journal_size = -1;
sb->s_feature_compat &= ~EXT3_FEATURE_COMPAT_HAS_JOURNAL;
journal = old_journal;
}
if (sb->s_rev_level == EXT2_GOOD_OLD_REV &&
@ -266,8 +307,7 @@ static void update_feature_set(ext2_filsys fs, char *features)
sb->s_feature_incompat))
ext2fs_update_dynamic_rev(fs);
if ((sparse != old_sparse) ||
(filetype != old_filetype) ||
(journal != old_journal)) {
(filetype != old_filetype)) {
sb->s_state &= ~EXT2_VALID_FS;
printf("\n%s\n", _(please_fsck));
}