* [PATCH] f2fs: fix a infinite loop in gc_node_segment
@ 2017-03-31 10:53 Yunlei He
2017-04-03 17:39 ` Jaegeuk Kim
0 siblings, 1 reply; 5+ messages in thread
From: Yunlei He @ 2017-03-31 10:53 UTC (permalink / raw)
To: jaegeuk, yuchao0, linux-f2fs-devel
Similar as this problem:
f2fs: relax node version check for victim data in gc
But this patch fix wrong SSA nid.
Signed-off-by: Yunlei He <heyunlei@huawei.com>
---
fs/f2fs/gc.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
index c52656c..1d0fd04 100644
--- a/fs/f2fs/gc.c
+++ b/fs/f2fs/gc.c
@@ -499,6 +499,25 @@ static void gc_node_segment(struct f2fs_sb_info *sbi,
get_node_info(sbi, nid, &ni);
if (ni.blk_addr != start_addr + off) {
f2fs_put_page(node_page, 1);
+ node_page = pagecache_get_page(META_MAPPING(sbi), start_addr + off,
+ FGP_LOCK | FGP_CREAT, GFP_NOFS);
+ if (!node_page)
+ continue;
+
+ lock_page(node_page);
+ if (unlikely(node_page->mapping != META_MAPPING(sbi))
+ || unlikely(!PageUptodate(node_page))) {
+ f2fs_put_page(node_page, 1);
+ continue;
+ }
+
+ get_node_info(sbi, nid_of_node(node_page), &ni);
+ if (ni.blk_addr == start_addr + off) {
+ entry->nid = cpu_to_le32(ni.nid);
+ else
+ f2fs_bug_on(sbi, 1);
+
+ f2fs_put_page(node_page, 1);
continue;
}
--
2.10.1
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] f2fs: fix a infinite loop in gc_node_segment
2017-03-31 10:53 [PATCH] f2fs: fix a infinite loop in gc_node_segment Yunlei He
@ 2017-04-03 17:39 ` Jaegeuk Kim
2017-04-05 2:09 ` heyunlei
0 siblings, 1 reply; 5+ messages in thread
From: Jaegeuk Kim @ 2017-04-03 17:39 UTC (permalink / raw)
To: Yunlei He; +Cc: linux-f2fs-devel
Hi Yunlei,
On 03/31, Yunlei He wrote:
> Similar as this problem:
> f2fs: relax node version check for victim data in gc
>
> But this patch fix wrong SSA nid.
What was the problem and how does this fix it?
>
> Signed-off-by: Yunlei He <heyunlei@huawei.com>
> ---
> fs/f2fs/gc.c | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
> index c52656c..1d0fd04 100644
> --- a/fs/f2fs/gc.c
> +++ b/fs/f2fs/gc.c
> @@ -499,6 +499,25 @@ static void gc_node_segment(struct f2fs_sb_info *sbi,
> get_node_info(sbi, nid, &ni);
> if (ni.blk_addr != start_addr + off) {
> f2fs_put_page(node_page, 1);
> + node_page = pagecache_get_page(META_MAPPING(sbi), start_addr + off,
> + FGP_LOCK | FGP_CREAT, GFP_NOFS);
Why do you think node_page can be cached in meta_inode?
> + if (!node_page)
> + continue;
> +
> + lock_page(node_page);
Locking the page again? Since FGP_LOCK gave a locked page.
Thanks,
> + if (unlikely(node_page->mapping != META_MAPPING(sbi))
> + || unlikely(!PageUptodate(node_page))) {
> + f2fs_put_page(node_page, 1);
> + continue;
> + }
> +
> + get_node_info(sbi, nid_of_node(node_page), &ni);
> + if (ni.blk_addr == start_addr + off) {
> + entry->nid = cpu_to_le32(ni.nid);
> + else
> + f2fs_bug_on(sbi, 1);
> +
> + f2fs_put_page(node_page, 1);
> continue;
> }
>
> --
> 2.10.1
>
>
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> Linux-f2fs-devel mailing list
> Linux-f2fs-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] f2fs: fix a infinite loop in gc_node_segment
2017-04-03 17:39 ` Jaegeuk Kim
@ 2017-04-05 2:09 ` heyunlei
2017-04-05 18:22 ` Jaegeuk Kim
0 siblings, 1 reply; 5+ messages in thread
From: heyunlei @ 2017-04-05 2:09 UTC (permalink / raw)
To: Jaegeuk Kim; +Cc: linux-f2fs-devel
Hi Jaegeuk,
On 2017/4/4 1:39, Jaegeuk Kim wrote:
> Hi Yunlei,
>
> On 03/31, Yunlei He wrote:
>> Similar as this problem:
>> f2fs: relax node version check for victim data in gc
>>
>> But this patch fix wrong SSA nid.
>
> What was the problem and how does this fix it?
- has_not_enough_free_secs
- f2fs_gc
- get_victim_by_default
- do_garbage_collect
- gc_node_segment
- ni.blk_addr != start_addr + off
blk_addr = 2668744, node_footer->nid = 10659, sum_entry->nid = 5431
- gc_more select same section
Here, something wrong with sum_entry of this block. Can we fix this error online, or just
adding a bug_on here?
>
>>
>> Signed-off-by: Yunlei He <heyunlei@huawei.com>
>> ---
>> fs/f2fs/gc.c | 19 +++++++++++++++++++
>> 1 file changed, 19 insertions(+)
>>
>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
>> index c52656c..1d0fd04 100644
>> --- a/fs/f2fs/gc.c
>> +++ b/fs/f2fs/gc.c
>> @@ -499,6 +499,25 @@ static void gc_node_segment(struct f2fs_sb_info *sbi,
>> get_node_info(sbi, nid, &ni);
>> if (ni.blk_addr != start_addr + off) {
>> f2fs_put_page(node_page, 1);
>> + node_page = pagecache_get_page(META_MAPPING(sbi), start_addr + off,
>> + FGP_LOCK | FGP_CREAT, GFP_NOFS);
>
> Why do you think node_page can be cached in meta_inode?
>
>> + if (!node_page)
>> + continue;
>> +
>> + lock_page(node_page);
>
> Locking the page again? Since FGP_LOCK gave a locked page.
>
> Thanks,
>
>> + if (unlikely(node_page->mapping != META_MAPPING(sbi))
>> + || unlikely(!PageUptodate(node_page))) {
>> + f2fs_put_page(node_page, 1);
>> + continue;
>> + }
>> +
>> + get_node_info(sbi, nid_of_node(node_page), &ni);
>> + if (ni.blk_addr == start_addr + off) {
>> + entry->nid = cpu_to_le32(ni.nid);
>> + else
>> + f2fs_bug_on(sbi, 1);
>> +
>> + f2fs_put_page(node_page, 1);
>> continue;
>> }
>>
>> --
>> 2.10.1
>>
>>
>> ------------------------------------------------------------------------------
>> Check out the vibrant tech community on one of the world's most
>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>> _______________________________________________
>> Linux-f2fs-devel mailing list
>> Linux-f2fs-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
>
> .
>
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] f2fs: fix a infinite loop in gc_node_segment
2017-04-05 2:09 ` heyunlei
@ 2017-04-05 18:22 ` Jaegeuk Kim
2017-04-06 1:30 ` heyunlei
0 siblings, 1 reply; 5+ messages in thread
From: Jaegeuk Kim @ 2017-04-05 18:22 UTC (permalink / raw)
To: heyunlei; +Cc: linux-f2fs-devel
On 04/05, heyunlei wrote:
> Hi Jaegeuk,
>
> On 2017/4/4 1:39, Jaegeuk Kim wrote:
> > Hi Yunlei,
> >
> > On 03/31, Yunlei He wrote:
> > > Similar as this problem:
> > > f2fs: relax node version check for victim data in gc
> > >
> > > But this patch fix wrong SSA nid.
> >
> > What was the problem and how does this fix it?
>
> - has_not_enough_free_secs
> - f2fs_gc
> - get_victim_by_default
> - do_garbage_collect
> - gc_node_segment
> - ni.blk_addr != start_addr + off
> blk_addr = 2668744, node_footer->nid = 10659, sum_entry->nid = 5431
Can you check the node block written in 2668744?
Does the problem come from wrong sum_entry only?
Thanks,
> - gc_more select same section
>
> Here, something wrong with sum_entry of this block. Can we fix this error online, or just
> adding a bug_on here?
>
> >
> > >
> > > Signed-off-by: Yunlei He <heyunlei@huawei.com>
> > > ---
> > > fs/f2fs/gc.c | 19 +++++++++++++++++++
> > > 1 file changed, 19 insertions(+)
> > >
> > > diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
> > > index c52656c..1d0fd04 100644
> > > --- a/fs/f2fs/gc.c
> > > +++ b/fs/f2fs/gc.c
> > > @@ -499,6 +499,25 @@ static void gc_node_segment(struct f2fs_sb_info *sbi,
> > > get_node_info(sbi, nid, &ni);
> > > if (ni.blk_addr != start_addr + off) {
> > > f2fs_put_page(node_page, 1);
> > > + node_page = pagecache_get_page(META_MAPPING(sbi), start_addr + off,
> > > + FGP_LOCK | FGP_CREAT, GFP_NOFS);
> >
> > Why do you think node_page can be cached in meta_inode?
> >
> > > + if (!node_page)
> > > + continue;
> > > +
> > > + lock_page(node_page);
> >
> > Locking the page again? Since FGP_LOCK gave a locked page.
> >
> > Thanks,
> >
> > > + if (unlikely(node_page->mapping != META_MAPPING(sbi))
> > > + || unlikely(!PageUptodate(node_page))) {
> > > + f2fs_put_page(node_page, 1);
> > > + continue;
> > > + }
> > > +
> > > + get_node_info(sbi, nid_of_node(node_page), &ni);
> > > + if (ni.blk_addr == start_addr + off) {
> > > + entry->nid = cpu_to_le32(ni.nid);
> > > + else
> > > + f2fs_bug_on(sbi, 1);
> > > +
> > > + f2fs_put_page(node_page, 1);
> > > continue;
> > > }
> > >
> > > --
> > > 2.10.1
> > >
> > >
> > > ------------------------------------------------------------------------------
> > > Check out the vibrant tech community on one of the world's most
> > > engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> > > _______________________________________________
> > > Linux-f2fs-devel mailing list
> > > Linux-f2fs-devel@lists.sourceforge.net
> > > https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
> >
> > .
> >
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] f2fs: fix a infinite loop in gc_node_segment
2017-04-05 18:22 ` Jaegeuk Kim
@ 2017-04-06 1:30 ` heyunlei
0 siblings, 0 replies; 5+ messages in thread
From: heyunlei @ 2017-04-06 1:30 UTC (permalink / raw)
To: Jaegeuk Kim; +Cc: linux-f2fs-devel
Hi Jaegeuk,
On 2017/4/6 2:22, Jaegeuk Kim wrote:
> On 04/05, heyunlei wrote:
>> Hi Jaegeuk,
>>
>> On 2017/4/4 1:39, Jaegeuk Kim wrote:
>>> Hi Yunlei,
>>>
>>> On 03/31, Yunlei He wrote:
>>>> Similar as this problem:
>>>> f2fs: relax node version check for victim data in gc
>>>>
>>>> But this patch fix wrong SSA nid.
>>>
>>> What was the problem and how does this fix it?
>>
>> - has_not_enough_free_secs
>> - f2fs_gc
>> - get_victim_by_default
>> - do_garbage_collect
>> - gc_node_segment
>> - ni.blk_addr != start_addr + off
>> blk_addr = 2668744, node_footer->nid = 10659, sum_entry->nid = 5431
>
> Can you check the node block written in 2668744?
> Does the problem come from wrong sum_entry only?
Yeso<\f
node_footer->nid = 10659, block addr in nat_entry 10659 is 2668744,
fsck just fix the wrong sum_entry nid.
Thanks,
>
> Thanks,
>
>> - gc_more select same section
>>
>> Here, something wrong with sum_entry of this block. Can we fix this error online, or just
>> adding a bug_on here?
>>
>>>
>>>>
>>>> Signed-off-by: Yunlei He <heyunlei@huawei.com>
>>>> ---
>>>> fs/f2fs/gc.c | 19 +++++++++++++++++++
>>>> 1 file changed, 19 insertions(+)
>>>>
>>>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
>>>> index c52656c..1d0fd04 100644
>>>> --- a/fs/f2fs/gc.c
>>>> +++ b/fs/f2fs/gc.c
>>>> @@ -499,6 +499,25 @@ static void gc_node_segment(struct f2fs_sb_info *sbi,
>>>> get_node_info(sbi, nid, &ni);
>>>> if (ni.blk_addr != start_addr + off) {
>>>> f2fs_put_page(node_page, 1);
>>>> + node_page = pagecache_get_page(META_MAPPING(sbi), start_addr + off,
>>>> + FGP_LOCK | FGP_CREAT, GFP_NOFS);
>>>
>>> Why do you think node_page can be cached in meta_inode?
>>>
>>>> + if (!node_page)
>>>> + continue;
>>>> +
>>>> + lock_page(node_page);
>>>
>>> Locking the page again? Since FGP_LOCK gave a locked page.
>>>
>>> Thanks,
>>>
>>>> + if (unlikely(node_page->mapping != META_MAPPING(sbi))
>>>> + || unlikely(!PageUptodate(node_page))) {
>>>> + f2fs_put_page(node_page, 1);
>>>> + continue;
>>>> + }
>>>> +
>>>> + get_node_info(sbi, nid_of_node(node_page), &ni);
>>>> + if (ni.blk_addr == start_addr + off) {
>>>> + entry->nid = cpu_to_le32(ni.nid);
>>>> + else
>>>> + f2fs_bug_on(sbi, 1);
>>>> +
>>>> + f2fs_put_page(node_page, 1);
>>>> continue;
>>>> }
>>>>
>>>> --
>>>> 2.10.1
>>>>
>>>>
>>>> ------------------------------------------------------------------------------
>>>> Check out the vibrant tech community on one of the world's most
>>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>> _______________________________________________
>>>> Linux-f2fs-devel mailing list
>>>> Linux-f2fs-devel@lists.sourceforge.net
>>>> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
>>>
>>> .
>>>
>
> .
>
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2017-04-06 1:31 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-31 10:53 [PATCH] f2fs: fix a infinite loop in gc_node_segment Yunlei He
2017-04-03 17:39 ` Jaegeuk Kim
2017-04-05 2:09 ` heyunlei
2017-04-05 18:22 ` Jaegeuk Kim
2017-04-06 1:30 ` heyunlei
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.