]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] ext2/ext3 Orlov directory accounting fix
authorAndrew Morton <akpm@digeo.com>
Fri, 22 Nov 2002 03:31:43 +0000 (19:31 -0800)
committerLinus Torvalds <torvalds@penguin.transmeta.com>
Fri, 22 Nov 2002 03:31:43 +0000 (19:31 -0800)
Patch from Stephen Tweedie

"In looking at the fix for the ext3 Orlov double-accounting bug, I
 noticed a change to the sb->s_dir_count accounting, restoring a
 missing s_dir_count++ when we allocate a new directory.

 However, I can't find anywhere in the code where we decrement this
 again on directory deletion, neither in ext2 nor in ext3, in 2.4 nor
 in 2.5."

Locking is via lock_super().

fs/ext2/ialloc.c
fs/ext3/ialloc.c

index 470f3252b2cbc4ef5a404687b9745548d7c9e84e..27e7584c90f308cd663d27d93f26da324ca91df3 100644 (file)
@@ -134,9 +134,11 @@ void ext2_free_inode (struct inode * inode)
                if (desc) {
                        desc->bg_free_inodes_count =
                                cpu_to_le16(le16_to_cpu(desc->bg_free_inodes_count) + 1);
-                       if (is_directory)
+                       if (is_directory) {
                                desc->bg_used_dirs_count =
                                        cpu_to_le16(le16_to_cpu(desc->bg_used_dirs_count) - 1);
+                               EXT2_SB(sb)->s_dir_count--;
+                       }
                }
                mark_buffer_dirty(bh2);
                es->s_free_inodes_count =
index de8c64403b2f95f654b25ec452b8bf6224d7381d..4f2919804b9bc459e908c7fc18fa5f152b39ba00 100644 (file)
@@ -167,9 +167,11 @@ void ext3_free_inode (handle_t *handle, struct inode * inode)
                if (gdp) {
                        gdp->bg_free_inodes_count = cpu_to_le16(
                                le16_to_cpu(gdp->bg_free_inodes_count) + 1);
-                       if (is_directory)
+                       if (is_directory) {
                                gdp->bg_used_dirs_count = cpu_to_le16(
                                  le16_to_cpu(gdp->bg_used_dirs_count) - 1);
+                               EXT3_SB(sb)->s_dir_count--;
+                       }
                }
                BUFFER_TRACE(bh2, "call ext3_journal_dirty_metadata");
                err = ext3_journal_dirty_metadata(handle, bh2);