linux-f2fs-devel.lists.sourceforge.net archive mirror
 help / color / mirror / Atom feed
From: Ritesh Harjani <riteshh@codeaurora.org>
To: Jaegeuk Kim <jaegeuk@kernel.org>
Cc: linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [PATCH 1/2] f2fs: remove stale inode entry before eviction from gdirty_list
Date: Tue, 20 Nov 2018 16:03:33 +0530	[thread overview]
Message-ID: <182b74e8-4148-4180-763c-a79b10bd0612@codeaurora.org> (raw)
In-Reply-To: <20181119210340.GA33805@jaegeuk-macbookpro.roam.corp.google.com>


On 11/20/2018 2:33 AM, Jaegeuk Kim wrote:
> On 11/19, Ritesh Harjani wrote:
>> Hi Chao,
>>
>> On 11/19/2018 12:09 PM, Chao Yu wrote:
>>> Hi Ritesh,
>>>
>>> On 2018/11/19 14:02, Ritesh Harjani wrote:
>>>> This is seen when CP_ERROR_FLAG is not set & FS may be corrupted.
>>>> There is a case observed where dirty stale inode pointer data is still
>>>> present in the gdirty_list causing panic on access while doing
>>>> checkpoint operation.
>>>>
>>>> WARNING: CPU: 3 PID: 1827 at
>>>> kernel/msm-4.14/fs/f2fs/inode.c:567
>>>> f2fs_evict_inode+0x364/0x37c
>>>> <...>
>>>> [42246.776289] BUG: spinlock bad magic on CPU#4, 1245
>>>> [42246.782674] Unable to handle kernel paging request at virtual address 6b6b6b6b6b713b
>>>> <...>
>>>> [42246.896370] task: ffffffc0f0434080 task.stack: ffffff8023ea0000
>>>> [42246.902465] pc : spin_bug+0x80/0xb8
>>>> [42246.906055] lr : spin_bug+0x64/0xb8
>>>> <...>
>>>> [42247.122346] Call trace:
>>>> [42247.124876]  spin_bug+0x80/0xb8
>>>> [42247.128110]  do_raw_spin_lock+0xe8/0x118
>>>> [42247.132144]  _raw_spin_lock+0x24/0x30
>>>> [42247.135916]  igrab+0x20/0x6c
>>>> [42247.138894]  f2fs_sync_inode_meta+0x58/0xc0
>>>> [42247.143199]  write_checkpoint+0x1c4/0xecc
>>>> [42247.147322]  f2fs_sync_fs+0x118/0x170
>>>> [42247.151096]  f2fs_do_sync_file+0x4f0/0x798
>>>> [42247.155311]  f2fs_sync_file+0x54/0x6c
>>>> [42247.159087]  vfs_fsync_range+0x90/0xac
>>>> [42247.162950]  vfs_fsync+0x2c/0x38
>>>> [42247.166278]  do_fsync+0x3c/0x78
>>>> [42247.169515]  SyS_fdatasync+0x20/0x30
>>>>
>>>> Signed-off-by: Ritesh Harjani <riteshh@codeaurora.org>
>>>> ---
>>>>    fs/f2fs/inode.c | 10 ++++++----
>>>>    1 file changed, 6 insertions(+), 4 deletions(-)
>>>>
>>>> diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
>>>> index 91ceee0..c57f636 100644
>>>> --- a/fs/f2fs/inode.c
>>>> +++ b/fs/f2fs/inode.c
>>>> @@ -702,11 +702,13 @@ void f2fs_evict_inode(struct inode *inode)
>>>>    	stat_dec_inline_dir(inode);
>>>>    	stat_dec_inline_inode(inode);
>>>> -	if (likely(!is_set_ckpt_flags(sbi, CP_ERROR_FLAG) &&
>>>> -				!is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
>>>> -		f2fs_bug_on(sbi, is_inode_flag_set(inode, FI_DIRTY_INODE));
>>>> -	else
>>>> +	if (unlikely(is_inode_flag_set(inode, FI_DIRTY_INODE))) {
>>>>    		f2fs_inode_synced(inode);
>>>> +		f2fs_msg(sbi->sb, KERN_WARNING,
>>>> +			 "inconsistent dirty inode:%u entry found during eviction\n",
>>>> +			 inode->i_ino);
>>>> +		f2fs_bug_on(sbi, 1);
>>> IIRC, Jaegeuk added below condition to avoid f2fs_bug_on during doing test
>>> w/ checkpoint error injection, if we remove this, we may still encounter
>>> such problem.
>>>
>>> if (likely(!is_set_ckpt_flags(sbi, CP_ERROR_FLAG)))
>> Ok, agreed. Does below sounds good then?
>> The idea is to go ahead and call f2fs_inode_synced(inode) when the inode
>> FI_DIRTY_INODE flag is set irrespective of CP_ERROR_FLAG set or not. Because
>> otherwise there is a stale inode entry which will
>> remain in gdirty_list => causing kernel panic in checkpoint path.
>>
>> diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
>> index 91ceee0..00915c2 100644
>> --- a/fs/f2fs/inode.c
>> +++ b/fs/f2fs/inode.c
>> @@ -702,11 +702,15 @@ void f2fs_evict_inode(struct inode *inode)
>>          stat_dec_inline_dir(inode);
>>          stat_dec_inline_inode(inode);
>>
>> -       if (likely(!is_set_ckpt_flags(sbi, CP_ERROR_FLAG) &&
>> -                               !is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
>> -               f2fs_bug_on(sbi, is_inode_flag_set(inode, FI_DIRTY_INODE));
>> -       else
>> +       if (unlikely(is_inode_flag_set(inode, FI_DIRTY_INODE))) {
>>                  f2fs_inode_synced(inode);
>> +               f2fs_msg(sbi->sb, KERN_WARNING,
>> +                        "inconsistent dirty inode:%u entry found during
>> eviction\n",
>> +                        inode->i_ino);
>> +               if ((!is_set_ckpt_flags(sbi, CP_ERROR_FLAG) &&
>> +                               !is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
>> +                       f2fs_bug_on(sbi, 1);
>> +       }
>>
>>> So I'd like to know what kind of case can make dirty inode during evict(),
>>> can you explain more?
>> Yes, we also could not get exact path about when this can happen. But below
>> are the parallel ongoing contexts when the issue is seen:-
>> We do suspect that there is something already wrong in the FS even before
>> when this issue occurred (due to "inconsistent node block" logs). This could
>> be due to some other underlying storage driver issue.
>> Not sure though.
>>
>> 1. unlinkat operation causing f2fs_evict_inode causing a warning (as
>> mentioned in the commit text).
>> 2. echo 3 > /proc/sys/vm/drop_caches.
>> 3. Rename operation on some file.
>> 4. vfs_fsync -> doing checkpointing => this causes a kernel panic since
>> stale inode entry is still present which got freed from f2fs_evict_inode
>> path.
>>
>> Some error logs which were seen long before this issue occurred.
>> [42219.089810] F2FS-fs (mmcblk0p75): inconsistent node block, nid:50018, node_footer[nid:50327,ino:50327,ofs:0,cpver:12146505996282773182,blkaddr:515484]
>> [42219.104281] F2FS-fs (mmcblk0p75): inconsistent node block, nid:49836, node_footer[nid:50228,ino:50228,ofs:0,cpver:10230247294256961017,blkaddr:1496346]
>> [42219.118723] F2FS-fs (mmcblk0p75): inconsistent node block, nid:50327, node_footer[nid:0,ino:0,ofs:0,cpver:0,blkaddr:0]
>> [42219.130782] F2FS-fs (mmcblk0p75): inconsistent node block, nid:50228, node_footer[nid:0,ino:0,ofs:0,cpver:0,blkaddr:0]
> I've concerned that this patch hides the bug and makes the partition being more
> corrupted. We have to figure out where such the node block were generated.
This issue seems to be mostly due to problem from underlying storage 
driver. As of now the suspect
is not from f2fs since we don't see this issue on a different 
configuration of storage driver.
The above patch is mainly to fix a kernel crash when the system/FS has 
actually gone bad due to some other subsystem causing corruption.
We thought it is a good fix to have because anyways if there is a dirty 
inode found during eviction,
then we should remove any stale entries of it from RAM data structures, 
before freeing the inode (with a warning msg).

> How many patches have you cherry-picked? Which kernel version are you using?
kernel 4.14. Yes we do have all the patches pulled from android aosp.
> Have you enabled ICE?
Yes. ICE is enabled.


Thanks
Ritesh

>
> Thanks,
>
>
>> Thanks,
>>
>>> Thanks,
>>>
>>>> +	}
>>>>    	/* ino == 0, if f2fs_new_inode() was failed t*/
>>>>    	if (inode->i_ino)
>>>>



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

  reply	other threads:[~2018-11-20 10:33 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-19  6:02 [PATCH 1/2] f2fs: remove stale inode entry before eviction from gdirty_list Ritesh Harjani
2018-11-19  6:02 ` [PATCH 2/2] f2fs: Set CP_ERROR_FLAG in case of inconsistent node page entries Ritesh Harjani
2018-11-19  7:15   ` Chao Yu
2018-11-19  6:39 ` [PATCH 1/2] f2fs: remove stale inode entry before eviction from gdirty_list Chao Yu
     [not found]   ` <c5387fdb-6b20-ed3d-e9a5-ae55b5dbdd37@codeaurora.org>
2018-11-19 21:03     ` Jaegeuk Kim
2018-11-20 10:33       ` Ritesh Harjani [this message]
2018-11-21  3:30         ` Chao Yu
2018-11-23 11:07           ` Ritesh Harjani
2018-11-24  9:55             ` Chao Yu
2019-08-07  2:28         ` [f2fs-dev] " Jaegeuk Kim

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=182b74e8-4148-4180-763c-a79b10bd0612@codeaurora.org \
    --to=riteshh@codeaurora.org \
    --cc=jaegeuk@kernel.org \
    --cc=linux-f2fs-devel@lists.sourceforge.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 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).