[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