aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhihao Cheng <chengzhihao1@huawei.com>2024-11-11 17:08:03 +0800
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2024-11-11 10:32:46 +0100
commite708c6f33e51d9cd5565e16c76af2c4180341499 (patch)
tree842195b1840ccfc5213314f4063029ed2048db22
parente8ca613778e7e5449a038c5ea04b17977de97d74 (diff)
fsck.ubifs: Update files' size for check mode
This is the 7/18 step of fsck. Update files' size according to size tree for check mode, now all files are updated after replaying journal. Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com> Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
-rw-r--r--ubifs-utils/fsck.ubifs/check_files.c45
-rw-r--r--ubifs-utils/fsck.ubifs/fsck.ubifs.c3
-rw-r--r--ubifs-utils/fsck.ubifs/fsck.ubifs.h1
-rw-r--r--ubifs-utils/libubifs/recovery.c16
-rw-r--r--ubifs-utils/libubifs/ubifs.h16
5 files changed, 65 insertions, 16 deletions
diff --git a/ubifs-utils/fsck.ubifs/check_files.c b/ubifs-utils/fsck.ubifs/check_files.c
index 29848c4..0fd6b32 100644
--- a/ubifs-utils/fsck.ubifs/check_files.c
+++ b/ubifs-utils/fsck.ubifs/check_files.c
@@ -309,3 +309,48 @@ out:
}
return err;
}
+
+/**
+ * update_files_size - Update files' size.
+ * @c: UBIFS file-system description object
+ *
+ * This function updates files' size according to @c->size_tree for check mode.
+ */
+void update_files_size(struct ubifs_info *c)
+{
+ struct rb_node *this;
+
+ if (FSCK(c)->mode != CHECK_MODE) {
+ /* Other modes(rw) have updated inode size in place. */
+ dbg_fsck("skip updating files' size%s, in %s",
+ mode_name(c), c->dev_name);
+ return;
+ }
+
+ log_out(c, "Update files' size");
+
+ this = rb_first(&c->size_tree);
+ while (this) {
+ struct size_entry *e;
+
+ e = rb_entry(this, struct size_entry, rb);
+ this = rb_next(this);
+
+ if (e->exists && e->i_size < e->d_size) {
+ struct scanned_file *file;
+
+ file = lookup_file(&FSCK(c)->scanned_files, e->inum);
+ if (file && file->ino.header.exist &&
+ file->ino.size < e->d_size) {
+ dbg_fsck("update file(%lu) size %llu->%llu, in %s",
+ e->inum, file->ino.size,
+ (unsigned long long)e->d_size,
+ c->dev_name);
+ file->ino.size = e->d_size;
+ }
+ }
+
+ rb_erase(&e->rb, &c->size_tree);
+ kfree(e);
+ }
+}
diff --git a/ubifs-utils/fsck.ubifs/fsck.ubifs.c b/ubifs-utils/fsck.ubifs/fsck.ubifs.c
index c0b1bf6..ec42fa7 100644
--- a/ubifs-utils/fsck.ubifs/fsck.ubifs.c
+++ b/ubifs-utils/fsck.ubifs/fsck.ubifs.c
@@ -443,6 +443,8 @@ static int do_fsck(void)
return err;
}
+ update_files_size(c);
+
kfree(FSCK(c)->used_lebs);
destroy_file_tree(c, &FSCK(c)->scanned_files);
return err;
@@ -481,6 +483,7 @@ int main(int argc, char *argv[])
/*
* Step 6: Traverse tnc and construct files
+ * Step 7: Update files' size
*/
err = do_fsck();
if (err && FSCK(c)->try_rebuild) {
diff --git a/ubifs-utils/fsck.ubifs/fsck.ubifs.h b/ubifs-utils/fsck.ubifs/fsck.ubifs.h
index c917a0e..4be38b4 100644
--- a/ubifs-utils/fsck.ubifs/fsck.ubifs.h
+++ b/ubifs-utils/fsck.ubifs/fsck.ubifs.h
@@ -297,5 +297,6 @@ int ubifs_rebuild_filesystem(struct ubifs_info *c);
/* check_files.c */
int traverse_tnc_and_construct_files(struct ubifs_info *c);
+void update_files_size(struct ubifs_info *c);
#endif
diff --git a/ubifs-utils/libubifs/recovery.c b/ubifs-utils/libubifs/recovery.c
index a5133a0..905e164 100644
--- a/ubifs-utils/libubifs/recovery.c
+++ b/ubifs-utils/libubifs/recovery.c
@@ -1082,22 +1082,6 @@ int ubifs_rcvry_gc_commit(struct ubifs_info *c)
}
/**
- * struct size_entry - inode size information for recovery.
- * @rb: link in the RB-tree of sizes
- * @inum: inode number
- * @i_size: size on inode
- * @d_size: maximum size based on data nodes
- * @exists: indicates whether the inode exists
- */
-struct size_entry {
- struct rb_node rb;
- ino_t inum;
- loff_t i_size;
- loff_t d_size;
- int exists;
-};
-
-/**
* add_ino - add an entry to the size tree.
* @c: UBIFS file-system description object
* @inum: inode number
diff --git a/ubifs-utils/libubifs/ubifs.h b/ubifs-utils/libubifs/ubifs.h
index 03150cd..72497cd 100644
--- a/ubifs-utils/libubifs/ubifs.h
+++ b/ubifs-utils/libubifs/ubifs.h
@@ -1297,6 +1297,22 @@ static inline int ubifs_authenticated(const struct ubifs_info *c)
return c->authenticated;
}
+/**
+ * struct size_entry - inode size information for recovery.
+ * @rb: link in the RB-tree of sizes
+ * @inum: inode number
+ * @i_size: size on inode
+ * @d_size: maximum size based on data nodes
+ * @exists: indicates whether the inode exists
+ */
+struct size_entry {
+ struct rb_node rb;
+ ino_t inum;
+ loff_t i_size;
+ loff_t d_size;
+ int exists;
+};
+
#ifdef WITH_CRYPTO
int ubifs_init_authentication(struct ubifs_info *c);
int ubifs_shash_init(const struct ubifs_info *c, struct shash_desc *desc);