All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] avoid semi-infinite loop when mounting bad ext2
@ 2004-11-03 23:27 Andries Brouwer
  2004-11-04  0:10 ` Linus Torvalds
  0 siblings, 1 reply; 2+ messages in thread
From: Andries Brouwer @ 2004-11-03 23:27 UTC (permalink / raw)
  To: torvalds, akpm; +Cc: linux-kernel

The routine ext2_readdir() will, when reading a directory page
returns an error, try the next page, without reporting the
error to user space. That is bad, and the patch below changes that.

In my case the filesystem was damaged, and ext2_readdir wanted
to read 60000+ pages and wrote as many error messages to syslog
("attempt to access beyond end"), not what one wants.

Andries

[no doubt a similar patch is appropriate for ext3]


diff -uprN -X /linux/dontdiff a/fs/ext2/dir.c b/fs/ext2/dir.c
--- a/fs/ext2/dir.c	2004-10-30 21:44:02.000000000 +0200
+++ b/fs/ext2/dir.c	2004-11-04 00:14:14.000000000 +0100
@@ -275,7 +275,8 @@ ext2_readdir (struct file * filp, void *
 				   "bad page in #%lu",
 				   inode->i_ino);
 			filp->f_pos += PAGE_CACHE_SIZE - offset;
-			continue;
+			ret = -EIO;
+			goto done;
 		}
 		kaddr = page_address(page);
 		if (need_revalidate) {

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] avoid semi-infinite loop when mounting bad ext2
  2004-11-03 23:27 [PATCH] avoid semi-infinite loop when mounting bad ext2 Andries Brouwer
@ 2004-11-04  0:10 ` Linus Torvalds
  0 siblings, 0 replies; 2+ messages in thread
From: Linus Torvalds @ 2004-11-04  0:10 UTC (permalink / raw)
  To: Andries Brouwer; +Cc: akpm, linux-kernel



On Thu, 4 Nov 2004, Andries Brouwer wrote:
> 
> [no doubt a similar patch is appropriate for ext3]

ext3 is different here, and uses the old-style buffer cache rather than
page cache. It has the equivalent case for a hole and/or IO error, and 
like ext2, it just continues with the next block.

I _think_ that case should be updated to do the same thing you did for 
ext2, but I'll leave it up to Andrew, since he is the ext3 master anyway.

Andrew?

		Linus

> diff -uprN -X /linux/dontdiff a/fs/ext2/dir.c b/fs/ext2/dir.c
> --- a/fs/ext2/dir.c	2004-10-30 21:44:02.000000000 +0200
> +++ b/fs/ext2/dir.c	2004-11-04 00:14:14.000000000 +0100
> @@ -275,7 +275,8 @@ ext2_readdir (struct file * filp, void *
>  				   "bad page in #%lu",
>  				   inode->i_ino);
>  			filp->f_pos += PAGE_CACHE_SIZE - offset;
> -			continue;
> +			ret = -EIO;
> +			goto done;
>  		}
>  		kaddr = page_address(page);
>  		if (need_revalidate) {
> 

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2004-11-04  0:16 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-11-03 23:27 [PATCH] avoid semi-infinite loop when mounting bad ext2 Andries Brouwer
2004-11-04  0:10 ` Linus Torvalds

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.