Messages in this thread | | | Date | Mon, 7 Nov 2022 22:51:28 +0800 | Subject | Re: [PATCH] f2fs: fix atgc bug on issue in 32bits platform | From | Chao Yu <> |
| |
On 2022/11/7 13:04, Zhiguo Niu wrote: > Dear Chao > > Chao Yu <chao@kernel.org <mailto:chao@kernel.org>> 于2022年11月7日周一 09:25写道: > > On 2022/11/4 15:40, zhiguo.niu wrote: > > From: Zhiguo Niu <zhiguo.niu@unisoc.com <mailto:zhiguo.niu@unisoc.com>> > > > > There is bug on issue after atgc feature is enabled in > > 32bits platform as the following log: > > > > F2FS-fs (dm-x): inconsistent rbtree, cur(3470333575168) next(3320009719808) > > ------------[ cut here ]------------ > > kernel BUG at fs/f2fs/gc.c:602! > > Internal error: Oops - BUG: 0 [#1] PREEMPT SMP ARM > > PC is at get_victim_by_default+0x13c0/0x1498 > > LR is at f2fs_check_rb_tree_consistence+0xc4/0xd4 > > .... > > [<c04d98b0>] (get_victim_by_default) from [<c04d4f44>] (f2fs_gc+0x220/0x6cc) > > [<c04d4f44>] (f2fs_gc) from [<c04d4780>] (gc_thread_func+0x2ac/0x708) > > [<c04d4780>] (gc_thread_func) from [<c015c774>] (kthread+0x1a8/0x1b4) > > [<c015c774>] (kthread) from [<c01010b4>] (ret_from_fork+0x14/0x20) > > > > The reason is the 64bits key in struct rb_entry has __packed attibute > > but has not in struct victim_entry, so the wrong key value got by > > in f2fs_check_rb_tree_consistence, the following are the memory layouts > > of struct rb_entry and struct victim_entry in 32bits platform: > > > > struct rb_entry { > > [0] struct rb_node rb_node; > > union { > > struct {...}; > > [12] unsigned long long key; > > }; > > } > > struct victim_entry { > > [0] struct rb_node rb_node; > > union { > > struct {...}; > > [16] struct victim_info vi; > > }; > > [32] struct list_head list; > > } > > Shouldn't we add __packed for struct victim_entry? > > I try to keep it consistent with struct rb_entry (__packed is only added to union for 64bits key), > victim_entry.vi.mtime is used to store the key, and rb_entry.key is used to verify the key, > so make sure that the memory offsets of the 64 bits key in these two structures are the same. > Other members of victim_entry, such as list, i think there is no problem because of it storaged and loaded > are both based on struct victim_entry
I'm not sure, there will be any further update in struct rb_node and struct list_head later, so, IMO, it will be more safe to add __packed to align all fields in structure to byte.
Thanks,
> > > > > This patch fix this inconsistence layout of 64bits key between > > struct rb_entry and struct victim_entry. > > > > Fixes: 093749e296e2 ("f2fs: support age threshold based garbage collection") > > > Signed-off-by: Zhiguo Niu <zhiguo.niu@unisoc.com <mailto:zhiguo.niu@unisoc.com>> >
| |