From: Jan Kara <jack@suse.cz>
To: Ted Ts'o <tytso@mit.edu>
Cc: Jan Kara <jack@suse.cz>, Yongqiang Yang <xiaoqiangnk@gmail.com>,
Allison Henderson <achender@linux.vnet.ibm.com>,
Ext4 Developers List <linux-ext4@vger.kernel.org>
Subject: Re: [PATCH 1/1] Null Pointer when make_indexed_dir returns -ENOSPC
Date: Mon, 9 May 2011 16:42:01 +0200 [thread overview]
Message-ID: <20110509144201.GP4122@quack.suse.cz> (raw)
In-Reply-To: <20110509142237.GA19811@thunk.org>
[-- Attachment #1: Type: text/plain, Size: 1018 bytes --]
On Mon 09-05-11 10:22:37, Ted Tso wrote:
> On Mon, May 09, 2011 at 04:05:37PM +0200, Jan Kara wrote:
> > Yes. ext4_append() can return ENOSPC and passed bh will get set to NULL
> > without being marked dirty.
>
> Ah, so the right fix then is to add to make the cleanup code like this:
>
> ext4_mark_inode_dirty(handle, dir);
> ext4_handle_dirty_metadata(handle, dir, frame->bh);
> + ext4_handle_dirty_metadata(handle, dir, bh2);
> + if (bh)
> + ext4_handle_dirty_metadata(handle, dir, bh);
> dx_release(frames);
> return retval;
>
> Agreed?
Not quite. make_indexed_dir() does frame->bh = bh and bh = bh2 before
calling do_split(). So bh2 is not really carrying a valid buffer reference
at this point - even more so because do_split() does brelse() on the passed
bh so it need not be around when are at this point. The code is a real
mess. But for example attached patch will work because both callers of
do_split() do brelse() anyway.
Honza
--
Jan Kara <jack@suse.cz>
SUSE Labs, CR
[-- Attachment #2: 0001-ext4-Stop-releasing-passed-bh-in-do_split.patch --]
[-- Type: text/x-patch, Size: 1170 bytes --]
>From 59729e0ab18a763ba36616a1025ce606a8721f1c Mon Sep 17 00:00:00 2001
From: Jan Kara <jack@suse.cz>
Date: Mon, 9 May 2011 16:39:34 +0200
Subject: [PATCH] ext4: Stop releasing passed bh in do_split()
make_indexed_dir() needs to do error recovery on the passed bh when do_split()
fails. So do not release it early in do_split().
Signed-off-by: Jan Kara <jack@suse.cz>
---
fs/ext4/namei.c | 7 +------
1 files changed, 1 insertions(+), 6 deletions(-)
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index 3c7a06e..1cddab9 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -1165,11 +1165,8 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
int err = 0, i;
bh2 = ext4_append (handle, dir, &newblock, &err);
- if (!(bh2)) {
- brelse(*bh);
- *bh = NULL;
+ if (!bh2)
goto errout;
- }
BUFFER_TRACE(*bh, "get_write_access");
err = ext4_journal_get_write_access(handle, *bh);
@@ -1235,9 +1232,7 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
return de;
journal_error:
- brelse(*bh);
brelse(bh2);
- *bh = NULL;
ext4_std_error(dir->i_sb, err);
errout:
*error = err;
--
1.7.1
next prev parent reply other threads:[~2011-05-09 14:42 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-07 23:54 [PATCH 1/1] Null Pointer when make_indexed_dir returns -ENOSPC Allison Henderson
2011-05-09 0:38 ` Ted Ts'o
2011-05-09 11:03 ` Jan Kara
2011-05-09 11:18 ` Yongqiang Yang
2011-05-09 11:20 ` Yongqiang Yang
2011-05-09 11:21 ` Yongqiang Yang
2011-05-09 11:30 ` Jan Kara
2011-05-09 11:33 ` Yongqiang Yang
2011-05-09 11:36 ` Jan Kara
2011-05-09 13:55 ` Ted Ts'o
2011-05-09 14:05 ` Jan Kara
2011-05-09 14:22 ` Ted Ts'o
2011-05-09 14:27 ` [PATCH -v2] ext4: don't dereference null pointer when make_indexed_dir() fails Theodore Ts'o
2011-05-09 14:56 ` Eric Sandeen
2011-05-09 14:42 ` Jan Kara [this message]
2011-05-09 20:39 ` [PATCH 1/1] Null Pointer when make_indexed_dir returns -ENOSPC Allison Henderson
2011-05-10 13:34 ` Jan Kara
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=20110509144201.GP4122@quack.suse.cz \
--to=jack@suse.cz \
--cc=achender@linux.vnet.ibm.com \
--cc=linux-ext4@vger.kernel.org \
--cc=tytso@mit.edu \
--cc=xiaoqiangnk@gmail.com \
/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;
as well as URLs for NNTP newsgroup(s).