[Ocfs2-tools-commits] zab commits r302 - trunk/fsck.ocfs2

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Thu Sep 30 17:00:53 CDT 2004


Author: zab
Date: 2004-09-30 17:00:51 -0500 (Thu, 30 Sep 2004)
New Revision: 302

Modified:
   trunk/fsck.ocfs2/pass2.c
Log:
o make sure a directory entry's file type jives with its inode 


Modified: trunk/fsck.ocfs2/pass2.c
===================================================================
--- trunk/fsck.ocfs2/pass2.c	2004-09-30 20:53:28 UTC (rev 301)
+++ trunk/fsck.ocfs2/pass2.c	2004-09-30 22:00:51 UTC (rev 302)
@@ -215,6 +215,80 @@
 	return ret_flags;
 }
 
+#define type_entry(type) [type] = #type
+static char *file_types[] = {
+	type_entry(OCFS2_FT_UNKNOWN),
+	type_entry(OCFS2_FT_REG_FILE),
+	type_entry(OCFS2_FT_DIR),
+	type_entry(OCFS2_FT_CHRDEV),
+	type_entry(OCFS2_FT_BLKDEV),
+	type_entry(OCFS2_FT_FIFO),
+	type_entry(OCFS2_FT_SOCK),
+	type_entry(OCFS2_FT_SYMLINK),
+};
+#undef type_entry
+
+static char *file_type_string(uint8_t type)
+{
+	if (type >= OCFS2_FT_MAX)
+		return "(unknown)";
+
+	return file_types[type];
+}
+
+static int fix_dirent_filetype(o2fsck_state *ost, o2fsck_dirblock_entry *dbe,
+				struct ocfs2_dir_entry *dirent, int offset)
+{
+	ocfs2_dinode dinode;
+	uint8_t expected_type;
+	errcode_t err;
+	int was_set;
+
+	/* XXX Do I care about possible bitmap_test errors here? */
+
+	ocfs2_bitmap_test(ost->ost_dir_inodes, dirent->inode, &was_set);
+	if (was_set) {
+		expected_type = OCFS2_FT_DIR;
+		goto check;
+	}
+
+	ocfs2_bitmap_test(ost->ost_reg_inodes, dirent->inode, &was_set);
+	if (was_set) {
+		expected_type = OCFS2_FT_REG_FILE;
+		goto check;
+	}
+
+	ocfs2_bitmap_test(ost->ost_bad_inodes, dirent->inode, &was_set);
+	if (was_set) {
+		expected_type = OCFS2_FT_UNKNOWN;
+		goto check;
+	}
+
+	err = ocfs2_read_inode(ost->ost_fs, dirent->inode, (char *)&dinode);
+	if (err)
+		fatal_error(err, "reading inode %"PRIu64" when verifying "
+			"an entry's file type", dirent->inode);
+
+	expected_type = ocfs_type_by_mode[(dinode.i_mode & S_IFMT)>>S_SHIFT];
+
+check:
+	/* XXX do we care to have expected 0 -> lead to "set" rather than
+	 * "fix" language? */
+	if ((dirent->file_type != expected_type) &&
+	    should_fix(ost, FIX_DEFYES, "entry %*s contains file type %s (%u) "
+		"but its inode %"PRIu64" leads to type %s (%u)",
+		dirent->name_len, dirent->name, 
+		file_type_string(dirent->file_type), dirent->file_type,
+		dirent->inode,
+		file_type_string(expected_type), expected_type)) {
+
+		dirent->file_type = expected_type;
+		return OCFS2_DIRENT_CHANGED;
+	}
+
+	return 0;
+}
+
 static int fix_dirent_linkage(o2fsck_state *ost, o2fsck_dirblock_entry *dbe,
 			      struct ocfs2_dir_entry *dirent, int offset)
 {
@@ -314,6 +388,8 @@
 
 		ret_flags |= fix_dirent_name(dd->ost, dbe, dirent, offset);
 
+		ret_flags |= fix_dirent_filetype(dd->ost, dbe, dirent, offset);
+
 		ret_flags |= fix_dirent_linkage(dd->ost, dbe, dirent, offset);
 
 		offset += dirent->rec_len;



More information about the Ocfs2-tools-commits mailing list