All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@digeo.com>
To: Jordan Breeding <jordan.breeding@attbi.com>
Cc: linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: buffer layer error at fs/buffer.c:1166
Date: Tue, 05 Nov 2002 20:33:23 -0800	[thread overview]
Message-ID: <3DC89B93.3CBED2E1@digeo.com> (raw)
In-Reply-To: 3DC891E2.3020006@attbi.com

Jordan Breeding wrote:
> 
> Hello,
> 
>    I get these errors while using 2.5.46-bk:
> 
> VFS: brelse: Trying to free free buffer
> buffer layer error at fs/buffer.c:1166
> Pass this trace through ksymoops for reporting
> Call Trace:
>   [<c01585b6>] __brelse+0x36/0x40
>   [<c01587d7>] bh_lru_install+0xc7/0x100
>   [<c0158875>] __find_get_block+0x65/0x70
>   [<c0158443>] __getblk_slow+0x23/0x110
>   [<c01588db>] __getblk+0x5b/0x70
>   [<c01943a8>] ext3_getblk+0xa8/0x300
>   [<c0194633>] ext3_bread+0x33/0xb0
>   [<c0197c5f>] dx_probe+0x4f/0x310
>   [<c0194633>] ext3_bread+0x33/0xb0
>   [<c01980fd>] ext3_htree_fill_tree+0x9d/0x1d0

There is a refcounting problem somewhere in htree.  Chris came uo
with the below patch.  Does it fix it for you?


 fs/ext3/namei.c |   50 ++++++++++++++++++++++++++++----------------------
 1 files changed, 28 insertions(+), 22 deletions(-)

--- 25/fs/ext3/namei.c~htree-fix	Tue Nov  5 18:48:52 2002
+++ 25-akpm/fs/ext3/namei.c	Tue Nov  5 18:48:52 2002
@@ -880,18 +880,18 @@ static struct buffer_head * ext3_dx_find
 		top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize -
 				       EXT3_DIR_REC_LEN(0));
 		for (; de < top; de = ext3_next_entry(de))
-		if (ext3_match (namelen, name, de)) {
-			if (!ext3_check_dir_entry("ext3_find_entry",
-						  dir, de, bh,
-				  (block<<EXT3_BLOCK_SIZE_BITS(sb))
-					  +((char *)de - bh->b_data))) {
-				brelse (bh);
-				goto errout;
+			if (ext3_match (namelen, name, de)) {
+				if (!ext3_check_dir_entry("ext3_find_entry",
+							  dir, de, bh,
+					  (block<<EXT3_BLOCK_SIZE_BITS(sb))
+						  +((char *)de - bh->b_data))) {
+					brelse (bh);
+					goto errout;
+				}
+				*res_dir = de;
+				dx_release (frames);
+				return bh;
 			}
-			*res_dir = de;
-			dx_release (frames);
-			return bh;
-		}
 		brelse (bh);
 		/* Check to see if we should continue to search */
 		retval = ext3_htree_next_block(dir, hash, frame,
@@ -1129,7 +1129,7 @@ errout:
  */
 static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry,
 			     struct inode *inode, struct ext3_dir_entry_2 *de,
-			     struct buffer_head * bh)
+			     struct buffer_head * bh, int *buffull)
 {
 	struct inode	*dir = dentry->d_parent->d_inode;
 	const char	*name = dentry->d_name.name;
@@ -1160,8 +1160,11 @@ static int add_dirent_to_buf(handle_t *h
 			de = (struct ext3_dir_entry_2 *)((char *)de + rlen);
 			offset += rlen;
 		}
-		if ((char *) de > top)
+		if ((char *) de > top) {
+			assert(buffull);
+			*buffull = 1;
 			return -ENOSPC;
+		}
 	}
 	BUFFER_TRACE(bh, "get_write_access");
 	err = ext3_journal_get_write_access(handle, bh);
@@ -1286,7 +1289,7 @@ static int make_indexed_dir(handle_t *ha
 	if (!(de))
 		return retval;
 
-	return add_dirent_to_buf(handle, dentry, inode, de, bh);
+	return add_dirent_to_buf(handle, dentry, inode, de, bh, NULL);
 }
 #endif
 
@@ -1308,7 +1311,7 @@ static int ext3_add_entry (handle_t *han
 	struct buffer_head * bh;
 	struct ext3_dir_entry_2 *de;
 	struct super_block * sb;
-	int	retval;
+	int	retval,buffull;
 #ifdef CONFIG_EXT3_INDEX
 	int	dx_fallback=0;
 #endif
@@ -1335,8 +1338,10 @@ static int ext3_add_entry (handle_t *han
 		bh = ext3_bread(handle, dir, block, 0, &retval);
 		if(!bh)
 			return retval;
-		retval = add_dirent_to_buf(handle, dentry, inode, 0, bh);
-		if (retval != -ENOSPC)
+		buffull = 0;
+		retval = add_dirent_to_buf(handle, dentry, inode, 0, bh,
+					   &buffull);
+		if (!buffull)
 			return retval;
 
 #ifdef CONFIG_EXT3_INDEX
@@ -1353,7 +1358,7 @@ static int ext3_add_entry (handle_t *han
 	de->inode = 0;
 	de->rec_len = cpu_to_le16(rlen = blocksize);
 	nlen = 0;
-	return add_dirent_to_buf(handle, dentry, inode, de, bh);
+	return add_dirent_to_buf(handle, dentry, inode, de, bh, NULL);
 }
 
 #ifdef CONFIG_EXT3_INDEX
@@ -1370,7 +1375,7 @@ static int ext3_dx_add_entry(handle_t *h
 	struct inode *dir = dentry->d_parent->d_inode;
 	struct super_block * sb = dir->i_sb;
 	struct ext3_dir_entry_2 *de;
-	int err;
+	int err,buffull;
 
 	frame = dx_probe(dentry, 0, &hinfo, frames, &err);
 	if (!frame)
@@ -1386,8 +1391,9 @@ static int ext3_dx_add_entry(handle_t *h
 	if (err)
 		goto journal_error;
 
-	err = add_dirent_to_buf(handle, dentry, inode, 0, bh);
-	if (err != -ENOSPC) {
+	buffull = 0;
+	err = add_dirent_to_buf(handle, dentry, inode, 0, bh, &buffull);
+	if (!buffull) {
 		bh = 0;
 		goto cleanup;
 	}
@@ -1479,7 +1485,7 @@ static int ext3_dx_add_entry(handle_t *h
 	de = do_split(handle, dir, &bh, frame, &hinfo, &err);
 	if (!de)
 		goto cleanup;
-	err = add_dirent_to_buf(handle, dentry, inode, de, bh);
+	err = add_dirent_to_buf(handle, dentry, inode, de, bh, NULL);
 	bh = 0;
 	goto cleanup;
 	

_

      reply	other threads:[~2002-11-06  4:27 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-11-06  3:52 buffer layer error at fs/buffer.c:1166 Jordan Breeding
2002-11-06  4:33 ` Andrew Morton [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3DC89B93.3CBED2E1@digeo.com \
    --to=akpm@digeo.com \
    --cc=jordan.breeding@attbi.com \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.