projects
/
GitHub
/
moto-9609
/
android_kernel_motorola_exynos9610.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
38f91ca
)
f2fs: fix to update dirty page count correctly
author
Chao Yu
<yuchao0@huawei.com>
Fri, 20 May 2016 16:11:09 +0000
(
00:11
+0800)
committer
Jaegeuk Kim
<jaegeuk@kernel.org>
Fri, 20 May 2016 21:55:41 +0000
(14:55 -0700)
Once we failed to merge inline data into inode page during flushing inline
inode, we will skip invoking inode_dec_dirty_pages, which makes dirty page
count incorrect, result in panic in ->evict_inode, Fix it.
------------[ cut here ]------------
kernel BUG at /home/yuchao/git/devf2fs/inode.c:336!
invalid opcode: 0000 [#1] PREEMPT SMP
CPU: 3 PID: 10004 Comm: umount Tainted: G O 4.6.0-rc5+ #17
Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
task:
f0c33000
ti:
c5212000
task.ti:
c5212000
EIP: 0060:[<
f89aacb5
>] EFLAGS:
00010202
CPU: 3
EIP is at f2fs_evict_inode+0x85/0x490 [f2fs]
EAX:
00000001
EBX:
c4529ea0
ECX:
00000001
EDX:
00000000
ESI:
c0131000
EDI:
f89dd0a0
EBP:
c5213e9c
ESP:
c5213e78
DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
CR0:
80050033
CR2:
b75878c0
CR3:
1a36a700
CR4:
000406f0
Stack:
c4529ea0
c4529ef4
c5213e8c
c176d45c
c4529ef4
00000000
c4529ea0
c4529fac
f89dd0a0
c5213eb0
c1204a68
c5213ed8
c452a2b4
c6680930
c5213ec0
c1204b64
c6680d44
c6680620
c5213eec
c120588d
ee84b000
ee84b5c0
c5214000
ee84b5e0
Call Trace:
[<
c176d45c
>] ? _raw_spin_unlock+0x2c/0x50
[<
c1204a68
>] evict+0xa8/0x170
[<
c1204b64
>] dispose_list+0x34/0x50
[<
c120588d
>] evict_inodes+0x10d/0x130
[<
c11ea941
>] generic_shutdown_super+0x41/0xe0
[<
c1185190
>] ? unregister_shrinker+0x40/0x50
[<
c1185190
>] ? unregister_shrinker+0x40/0x50
[<
c11eac52
>] kill_block_super+0x22/0x70
[<
f89af23e
>] kill_f2fs_super+0x1e/0x20 [f2fs]
[<
c11eae1d
>] deactivate_locked_super+0x3d/0x70
[<
c11eb383
>] deactivate_super+0x43/0x60
[<
c1208ec9
>] cleanup_mnt+0x39/0x80
[<
c1208f50
>] __cleanup_mnt+0x10/0x20
[<
c107d091
>] task_work_run+0x71/0x90
[<
c105725a
>] exit_to_usermode_loop+0x72/0x9e
[<
c1001c7c
>] do_fast_syscall_32+0x19c/0x1c0
[<
c176dd48
>] sysenter_past_esp+0x45/0x74
EIP: [<
f89aacb5
>] f2fs_evict_inode+0x85/0x490 [f2fs] SS:ESP 0068:
c5213e78
---[ end trace
d30536330b7fdc58
]---
Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/node.c
patch
|
blob
|
blame
|
history
diff --git
a/fs/f2fs/node.c
b/fs/f2fs/node.c
index cda7c7ccd4c852367bb7b4e8d39817b60b666acb..1f21aae80c4015ac4f96be6d268a0613ee3405e0 100644
(file)
--- a/
fs/f2fs/node.c
+++ b/
fs/f2fs/node.c
@@
-1197,6
+1197,7
@@
static void flush_inline_data(struct f2fs_sb_info *sbi, nid_t ino)
{
struct inode *inode;
struct page *page;
+ int ret;
/* should flush inline_data before evict_inode */
inode = ilookup(sbi->sb, ino);
@@
-1216,9
+1217,9
@@
static void flush_inline_data(struct f2fs_sb_info *sbi, nid_t ino)
if (!clear_page_dirty_for_io(page))
goto page_out;
- if (!f2fs_write_inline_data(inode, page))
-
inode_dec_dirty_pages(inode);
- else
+ ret = f2fs_write_inline_data(inode, page);
+ inode_dec_dirty_pages(inode);
+ if (ret)
set_page_dirty(page);
page_out:
f2fs_put_page(page, 1);