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;
_
prev parent 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.