[6/7] UBIFS: fix inode size debugging check failure

Message ID 1304691317-32214-6-git-send-email-dedekind1@gmail.com
State Accepted
Commit c1f1f91d2183b91c684900b529b6c336ad3dd27c
Headers show

Commit Message

Artem Bityutskiy May 6, 2011, 2:15 p.m.
From: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>

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

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
 fs/ubifs/recovery.c |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)


diff --git a/fs/ubifs/recovery.c b/fs/ubifs/recovery.c
index d6c8ce3..3f41a0c 100644
--- a/fs/ubifs/recovery.c
+++ b/fs/ubifs/recovery.c
@@ -1490,18 +1490,22 @@  int ubifs_recover_size(struct ubifs_info *c)
 			if (c->ro_mount) {
 				/* Fix the inode size and pin it in memory */
 				struct inode *inode;
+				struct ubifs_inode *ui;
 				inode = ubifs_iget(c->vfs_sb, e->inum);
 				if (IS_ERR(inode))
 					return PTR_ERR(inode);
+				ui = ubifs_inode(inode);
 				if (inode->i_size < e->d_size) {
 					dbg_rcvry("ino %lu size %lld -> %lld",
 						  (unsigned long)e->inum,
 						  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;
 					this = rb_next(this);