From ad64902b70282cc0d3453237b39a1d1388906509 Mon Sep 17 00:00:00 2001 From: Aditya Kali Date: Fri, 13 Jul 2012 15:25:07 -0700 Subject: [PATCH] libquota: fix quota_inode_truncate() We failed to clear EXT2_FLAG_SUPER_ONLY after deleting the quota inode and so, the updated block bitmap was not written back. This caused fsck to complain after running 'tune2fs -O ^quota '. Clear this flag so that updated block bitmap gets written. Also, avoid truncating the quota inode if it is not hidden. Signed-off-by: Aditya Kali Signed-off-by: Theodore Ts'o --- lib/quota/quotaio.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/quota/quotaio.c b/lib/quota/quotaio.c index c0ebaa1..7cdd653 100644 --- a/lib/quota/quotaio.c +++ b/lib/quota/quotaio.c @@ -133,14 +133,18 @@ errcode_t quota_inode_truncate(ext2_filsys fs, ext2_ino_t ino) if ((err = ext2fs_read_inode(fs, ino, &inode))) return err; - inode.i_dtime = fs->now ? fs->now : time(0); - if (!ext2fs_inode_has_valid_blocks2(fs, &inode)) - return 0; - - ext2fs_block_iterate3(fs, ino, BLOCK_FLAG_READ_ONLY, NULL, - release_blocks_proc, NULL); - - memset(&inode, 0, sizeof(struct ext2_inode)); + if ((ino == EXT4_USR_QUOTA_INO) || (ino == EXT4_GRP_QUOTA_INO)) { + inode.i_dtime = fs->now ? fs->now : time(0); + if (!ext2fs_inode_has_valid_blocks2(fs, &inode)) + return 0; + + ext2fs_block_iterate3(fs, ino, BLOCK_FLAG_READ_ONLY, NULL, + release_blocks_proc, NULL); + fs->flags &= ~EXT2_FLAG_SUPER_ONLY; + memset(&inode, 0, sizeof(struct ext2_inode)); + } else { + inode.i_flags &= ~EXT2_IMMUTABLE_FL; + } err = ext2fs_write_inode(fs, ino, &inode); return err; } -- 1.8.3.1