提交 c1f1f91d 编写于 作者: A Artem Bityutskiy

UBIFS: fix inode size debugging check failure

This patch fixes a problem with the following symptoms:

UBIFS: deferred recovery completed
UBIFS error (pid 15676): dbg_check_synced_i_size: ui_size is 11481088, synced_i_size is 11459081, but inode is clean
UBIFS error (pid 15676): dbg_check_synced_i_size: i_ino 128, i_mode 0x81a4, i_size 11481088

It happens when additional debugging checks are enabled and we are recovering
from a power cut. When we fixup corrupted inode size during recovery, we change
them in-place and we change ui_size as well, but not synced_i_size, which
causes this failure. This patch makes sure we change both fields and fixes the
issue.
Signed-off-by: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
上级 45cd5cdd
...@@ -1490,18 +1490,22 @@ int ubifs_recover_size(struct ubifs_info *c) ...@@ -1490,18 +1490,22 @@ int ubifs_recover_size(struct ubifs_info *c)
if (c->ro_mount) { if (c->ro_mount) {
/* Fix the inode size and pin it in memory */ /* Fix the inode size and pin it in memory */
struct inode *inode; struct inode *inode;
struct ubifs_inode *ui;
ubifs_assert(!e->inode); ubifs_assert(!e->inode);
inode = ubifs_iget(c->vfs_sb, e->inum); inode = ubifs_iget(c->vfs_sb, e->inum);
if (IS_ERR(inode)) if (IS_ERR(inode))
return PTR_ERR(inode); return PTR_ERR(inode);
ui = ubifs_inode(inode);
if (inode->i_size < e->d_size) { if (inode->i_size < e->d_size) {
dbg_rcvry("ino %lu size %lld -> %lld", dbg_rcvry("ino %lu size %lld -> %lld",
(unsigned long)e->inum, (unsigned long)e->inum,
inode->i_size, e->d_size); inode->i_size, e->d_size);
inode->i_size = e->d_size; inode->i_size = e->d_size;
ubifs_inode(inode)->ui_size = e->d_size; ui->ui_size = e->d_size;
ui->synced_i_size = e->d_size;
e->inode = inode; e->inode = inode;
this = rb_next(this); this = rb_next(this);
continue; continue;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册