All of lore.kernel.org
 help / color / mirror / Atom feed
From: Liu Bo <liubo2009@cn.fujitsu.com>
To: Arne Jansen <sensille@gmx.net>
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH] Btrfs: fix an oops of log replay
Date: Wed, 31 Aug 2011 16:36:04 +0800	[thread overview]
Message-ID: <4E5DF274.1010805@cn.fujitsu.com> (raw)
In-Reply-To: <4E5DEDFF.9080909@gmx.net>

On 08/31/2011 04:17 PM, Arne Jansen wrote:
> On 06.08.2011 10:35, Liu Bo wrote:
>> When btrfs recovers from a crash, it may hit the oops below:
>>
>> ------------[ cut here ]------------
>> kernel BUG at fs/btrfs/inode.c:4580!
>> [...]
>> RIP: 0010:[<ffffffffa03df251>]  [<ffffffffa03df251>] btrfs_add_link+0x161/0x1c0 [btrfs]
>> [...]
>> Call Trace:
>>  [<ffffffffa03e7b31>] ? btrfs_inode_ref_index+0x31/0x80 [btrfs]
>>  [<ffffffffa04054e9>] add_inode_ref+0x319/0x3f0 [btrfs]
>>  [<ffffffffa0407087>] replay_one_buffer+0x2c7/0x390 [btrfs]
>>  [<ffffffffa040444a>] walk_down_log_tree+0x32a/0x480 [btrfs]
>>  [<ffffffffa0404695>] walk_log_tree+0xf5/0x240 [btrfs]
>>  [<ffffffffa0406cc0>] btrfs_recover_log_trees+0x250/0x350 [btrfs]
>>  [<ffffffffa0406dc0>] ? btrfs_recover_log_trees+0x350/0x350 [btrfs]
>>  [<ffffffffa03d18b2>] open_ctree+0x1442/0x17d0 [btrfs]
>> [...]
>>
>> This comes from that while replaying an inode ref item, we forget to
>> check those old conflicting DIR_ITEM and DIR_INDEX items in fs/file tree,
>> then we will come to conflict corners which lead to BUG_ON().
> 
> Is this a workaround for an on-disk corruption or a bug fix for the
> log replay code? It sounds like the latter, but I ask to be sure :)
> 

The latter one, for log replay when we recover from a btrfs crash.

thanks,
liubo

> -Arne
> 
>> Signed-off-by: Liu Bo <liubo2009@cn.fujitsu.com>
>> ---
>>  fs/btrfs/tree-log.c |   28 ++++++++++++++++++++++++----
>>  1 files changed, 24 insertions(+), 4 deletions(-)
>>
>> diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
>> index babee65..786639f 100644
>> --- a/fs/btrfs/tree-log.c
>> +++ b/fs/btrfs/tree-log.c
>> @@ -799,14 +799,15 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
>>  				  struct extent_buffer *eb, int slot,
>>  				  struct btrfs_key *key)
>>  {
>> -	struct inode *dir;
>> -	int ret;
>>  	struct btrfs_inode_ref *ref;
>> +	struct btrfs_dir_item *di;
>> +	struct inode *dir;
>>  	struct inode *inode;
>> -	char *name;
>> -	int namelen;
>>  	unsigned long ref_ptr;
>>  	unsigned long ref_end;
>> +	char *name;
>> +	int namelen;
>> +	int ret;
>>  	int search_done = 0;
>>  
>>  	/*
>> @@ -909,6 +910,25 @@ again:
>>  	}
>>  	btrfs_release_path(path);
>>  
>> +	/* look for a conflicting sequence number */
>> +	di = btrfs_lookup_dir_index_item(trans, root, path, btrfs_ino(dir),
>> +					 btrfs_inode_ref_index(eb, ref),
>> +					 name, namelen, 0);
>> +	if (di && !IS_ERR(di)) {
>> +		ret = drop_one_dir_item(trans, root, path, dir, di);
>> +		BUG_ON(ret);
>> +	}
>> +	btrfs_release_path(path);
>> +
>> +	/* look for a conflicing name */
>> +	di = btrfs_lookup_dir_item(trans, root, path, btrfs_ino(dir),
>> +				   name, namelen, 0);
>> +	if (di && !IS_ERR(di)) {
>> +		ret = drop_one_dir_item(trans, root, path, dir, di);
>> +		BUG_ON(ret);
>> +	}
>> +	btrfs_release_path(path);
>> +
>>  insert:
>>  	/* insert our name */
>>  	ret = btrfs_add_link(trans, dir, inode, name, namelen, 0,
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


      reply	other threads:[~2011-08-31  8:36 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-06  8:35 [PATCH] Btrfs: fix an oops of log replay Liu Bo
2011-08-08 15:13 ` Andy Lutomirski
2011-08-16 11:53   ` liubo
2011-08-31  8:17 ` Arne Jansen
2011-08-31  8:36   ` Liu Bo [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=4E5DF274.1010805@cn.fujitsu.com \
    --to=liubo2009@cn.fujitsu.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=sensille@gmx.net \
    /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.