public inbox for linux-kernel@vger.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox