mirror of
https://github.com/armbian/build.git
synced 2025-09-15 18:51:27 +02:00
115 lines
3.5 KiB
Diff
115 lines
3.5 KiB
Diff
From 5f823df27a9709a1ec50e6c54f1257af12b19d53 Mon Sep 17 00:00:00 2001
|
|
From: Chao Yu <chao@kernel.org>
|
|
Date: Tue, 7 Mar 2023 23:14:08 +0800
|
|
Subject: [PATCH 188/406] f2fs: fix unaligned field offset in 32-bits platform
|
|
|
|
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 there is __packed attribute in struct rb_entry, but there
|
|
is no __packed attribute in struct victim_entry, so wrong offset of key
|
|
field will be parsed in struct rb_entry in f2fs_check_rb_tree_consistence,
|
|
it describes memory layouts of struct rb_entry and struct victim_entry in
|
|
32-bits platform as below:
|
|
|
|
struct rb_entry {
|
|
[0] struct rb_node rb_node;
|
|
union {
|
|
struct {...};
|
|
[12] unsigned long long key;
|
|
} __packed;
|
|
}
|
|
size of struct rb_entry: 20
|
|
|
|
struct victim_entry {
|
|
[0] struct rb_node rb_node;
|
|
union {
|
|
struct {...};
|
|
[16] struct victim_info vi;
|
|
};
|
|
[32] struct list_head list;
|
|
}
|
|
size of struct victim_entry: 40
|
|
|
|
This patch tries to add __packed attribute in below structure:
|
|
- discard_info, discard_cmd
|
|
- extent_info, extent_node
|
|
- victim_info, victim_entry
|
|
in order to fix this unaligned field offset issue in 32-bits platform.
|
|
|
|
Fixes: 004b68621897 ("f2fs: use rb-tree to track pending discard commands")
|
|
Fixes: 13054c548a1c ("f2fs: introduce infra macro and data structure of rb-tree extent cache")
|
|
Fixes: 093749e296e2 ("f2fs: support age threshold based garbage collection")
|
|
Signed-off-by: Zhiguo Niu <zhiguo.niu@unisoc.com>
|
|
Signed-off-by: Chao Yu <chao@kernel.org>
|
|
---
|
|
fs/f2fs/f2fs.h | 6 +++---
|
|
fs/f2fs/gc.h | 4 ++--
|
|
2 files changed, 5 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
|
|
index b0ab2062038a..17fa7572ceed 100644
|
|
--- a/fs/f2fs/f2fs.h
|
|
+++ b/fs/f2fs/f2fs.h
|
|
@@ -349,7 +349,7 @@ struct discard_info {
|
|
block_t lstart; /* logical start address */
|
|
block_t len; /* length */
|
|
block_t start; /* actual start address in dev */
|
|
-};
|
|
+} __packed;
|
|
|
|
struct discard_cmd {
|
|
struct rb_node rb_node; /* rb node located in rb-tree */
|
|
@@ -361,7 +361,7 @@ struct discard_cmd {
|
|
};
|
|
struct discard_info di; /* discard info */
|
|
|
|
- };
|
|
+ } __packed;
|
|
struct list_head list; /* command list */
|
|
struct completion wait; /* compleation */
|
|
struct block_device *bdev; /* bdev */
|
|
@@ -660,7 +660,7 @@ struct extent_info {
|
|
unsigned long long last_blocks;
|
|
};
|
|
};
|
|
-};
|
|
+} __packed;
|
|
|
|
struct extent_node {
|
|
struct rb_node rb_node; /* rb node located in rb-tree */
|
|
diff --git a/fs/f2fs/gc.h b/fs/f2fs/gc.h
|
|
index 15bd1d680f67..304937d9a084 100644
|
|
--- a/fs/f2fs/gc.h
|
|
+++ b/fs/f2fs/gc.h
|
|
@@ -58,7 +58,7 @@ struct gc_inode_list {
|
|
struct victim_info {
|
|
unsigned long long mtime; /* mtime of section */
|
|
unsigned int segno; /* section No. */
|
|
-};
|
|
+} __packed;
|
|
|
|
struct victim_entry {
|
|
struct rb_node rb_node; /* rb node located in rb-tree */
|
|
@@ -68,7 +68,7 @@ struct victim_entry {
|
|
unsigned int segno; /* segment No. */
|
|
};
|
|
struct victim_info vi; /* victim info */
|
|
- };
|
|
+ } __packed;
|
|
struct list_head list;
|
|
};
|
|
|
|
--
|
|
2.34.1
|
|
|