Thread (4 messages) 4 messages, 2 authors, 2008-07-25

Re: [patch 069/283] ext3: handle corrupted orphan list at mount

From: Mike Snitzer <hidden>
Date: 2008-07-25 18:41:36

On Fri, Jul 25, 2008 at 2:33 PM, Mike Snitzer [off-list ref] wrote:
On Fri, Jul 25, 2008 at 3:02 AM,  [off-list ref] wrote:
quoted
From: "Duane Griffin" <redacted>

If the orphan node list includes valid, untruncatable nodes with nlink > 0
the ext3_orphan_cleanup loop which attempts to delete them will not do so,
causing it to loop forever. Fix by checking for such nodes in the
ext3_orphan_get function.

This patch fixes the second case (image hdb.20000009.softlockup.gz)
reported in http://bugzilla.kernel.org/show_bug.cgi?id=10882.

[akpm@linux-foundation.org: coding-style fixes]
[akpm@linux-foundation.org: printk warning fix]
Signed-off-by: Duane Griffin <redacted>
Cc: <redacted>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
quoted
diff -puN fs/ext3/inode.c~ext3-handle-corrupted-orphan-list-at-mount fs/ext3/inode.c
--- a/fs/ext3/inode.c~ext3-handle-corrupted-orphan-list-at-mount
+++ a/fs/ext3/inode.c
@@ -2253,6 +2253,19 @@ static void ext3_free_branches(handle_t
       }
 }

+int ext3_can_truncate(struct inode *inode)
+{
+       if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
+               return 0;
+       if (S_ISREG(inode->i_mode))
+               return 1;
+       if (S_ISDIR(inode->i_mode))
+               return 1;
+       if (S_ISLNK(inode->i_mode))
+               return !ext3_inode_is_fast_symlink(inode);
+       return 0;
+}
+
 /*
 * ext3_truncate()
 *
@@ -2297,12 +2310,7 @@ void ext3_truncate(struct inode *inode)
       unsigned blocksize = inode->i_sb->s_blocksize;
       struct page *page;

-       if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
-           S_ISLNK(inode->i_mode)))
-               return;
-       if (ext3_inode_is_fast_symlink(inode))
-               return;
-       if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
+       if (!ext3_can_truncate(inode))
               return;
I may be missing something here but doesn't the above change the logic
that was used in ext3_truncate for the S_ISDIR and S_ISLNK cases?

Before ext3_truncate would be short-circuited if S_ISDIR or S_ISLNK,
now it won't... is that intended?
Gah, I mistakenly read it as only being !S_ISDIR (I missed the fact
that it was !S_ISREG, !S_ISDIR, or !S_ISLNK). And after Duane's change
that logic is maintained... and more readable!

Sorry for the noise.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help