Commit cdbf6dba authored by Eric Sandeen's avatar Eric Sandeen Committed by Linus Torvalds

ext3: avoid printk floods in the face of directory corruption

A very large directory with many read failures (either due to storage
problems, or due to invalid size & blocks from corruption) will generate a
printk storm as the filesystem continues to try to read all the blocks.
This flood of messages can tie up the box until it is complete - which may
be a very long time, especially for very large corrupted values.

This is fixed by only reporting the corruption once each time we try to
read the directory.
Signed-off-by: default avatarEric Sandeen <sandeen@redhat.com>
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
Cc: Eugene Teo <eugeneteo@kernel.sg>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 5ec8b75e
...@@ -102,6 +102,7 @@ static int ext3_readdir(struct file * filp, ...@@ -102,6 +102,7 @@ static int ext3_readdir(struct file * filp,
int err; int err;
struct inode *inode = filp->f_path.dentry->d_inode; struct inode *inode = filp->f_path.dentry->d_inode;
int ret = 0; int ret = 0;
int dir_has_error = 0;
sb = inode->i_sb; sb = inode->i_sb;
...@@ -148,9 +149,12 @@ static int ext3_readdir(struct file * filp, ...@@ -148,9 +149,12 @@ static int ext3_readdir(struct file * filp,
* of recovering data when there's a bad sector * of recovering data when there's a bad sector
*/ */
if (!bh) { if (!bh) {
ext3_error (sb, "ext3_readdir", if (!dir_has_error) {
"directory #%lu contains a hole at offset %lu", ext3_error(sb, __func__, "directory #%lu "
inode->i_ino, (unsigned long)filp->f_pos); "contains a hole at offset %lld",
inode->i_ino, filp->f_pos);
dir_has_error = 1;
}
/* corrupt size? Maybe no more blocks to read */ /* corrupt size? Maybe no more blocks to read */
if (filp->f_pos > inode->i_blocks << 9) if (filp->f_pos > inode->i_blocks << 9)
break; break;
......
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