/* * Copyright 2000-2004 by Hans Reiser, licensing governed by * reiserfsprogs/README */ #ifdef HAVE_CONFIG_H # include #endif #include "reiserfs/libreiserfs.h" int reiserfs_super_35_magic (reiserfs_sb_t * rs) { return (!strncmp (rs->s_v1.s_magic, REISERFS_3_5_SUPER_MAGIC_STRING, strlen ( REISERFS_3_5_SUPER_MAGIC_STRING))); } int reiserfs_super_36_magic (reiserfs_sb_t * rs) { return (!strncmp (rs->s_v1.s_magic, REISERFS_3_6_SUPER_MAGIC_STRING, strlen ( REISERFS_3_6_SUPER_MAGIC_STRING))); } int reiserfs_super_jr_magic (reiserfs_sb_t * rs) { return (!strncmp (rs->s_v1.s_magic, REISERFS_JR_SUPER_MAGIC_STRING, strlen ( REISERFS_JR_SUPER_MAGIC_STRING))); } int reiserfs_super_magic (reiserfs_sb_t * rs) { if (reiserfs_super_35_magic (rs) || reiserfs_super_36_magic (rs) || reiserfs_super_jr_magic (rs)) return 1; return 0; } int reiserfs_super_format (reiserfs_sb_t * sb) { /* after conversion to 3.6 format we change magic correctly, but do not change sb_format. When we create non-standard journal field format in sb get adjusted correctly. Thereby, for standard journal we should rely on magic and for non-standard - on format */ if (reiserfs_super_35_magic (sb) || (reiserfs_super_jr_magic (sb) && reiserfs_sb_get_version (sb) == REISERFS_FORMAT_3_5)) return REISERFS_FORMAT_3_5; if (reiserfs_super_36_magic (sb) || (reiserfs_super_jr_magic (sb) && reiserfs_sb_get_version (sb) == REISERFS_FORMAT_3_6)) return REISERFS_FORMAT_3_6; return REISERFS_FORMAT_UNKNOWN; } int reiserfs_super_size (reiserfs_sb_t * sb) { switch (reiserfs_super_format (sb)) { case REISERFS_FORMAT_3_5: return REISERFS_SB_SIZE_V1; case REISERFS_FORMAT_3_6: return REISERFS_SB_SIZE; } reiserfs_panic ("Unknown format found"); return 0; } /* this one had signature in different place of the super_block structure */ int reiserfs_super_prejournaled (reiserfs_sb_t * rs) { return (!strncmp((char*)rs + REISERFS_SUPER_MAGIC_STRING_OFFSET_NJ, REISERFS_3_5_SUPER_MAGIC_STRING, strlen(REISERFS_3_5_SUPER_MAGIC_STRING))); } int reiserfs_super_valid(reiserfs_bh_t *bh) { reiserfs_sb_t *sb; sb = (reiserfs_sb_t *)bh->b_data; if (!reiserfs_super_magic (sb)) return 0; if (!reiserfs_fs_blksize_check(reiserfs_sb_get_blksize (sb))) return 0; return 1; } /* return 1 if this is not super block */ int reiserfs_super_print (FILE * fp, reiserfs_filsys_t * fs, char * file_name, reiserfs_bh_t * bh, int short_print) { reiserfs_sb_t * sb = (reiserfs_sb_t *)(bh->b_data); int format = 0; __u16 state; if (!reiserfs_super_valid(bh)) return 1; /* Print volume label if it is non-empty. */ if (sb->s_label[0]) reiserfs_warning (fp, "%s: ", sb->s_label); else reiserfs_warning (fp, "%s: ", fs->fs_file_name); reiserfs_warning (fp, "Reiserfs super block in block %lu on %s of ", bh->b_blocknr, fs->fs_file_name); switch (reiserfs_super_format (sb)) { case REISERFS_FORMAT_3_5: reiserfs_warning (fp, "format 3.5 with "); format = 1; break; case REISERFS_FORMAT_3_6: reiserfs_warning (fp, "format 3.6 with "); format = 2; break; default: reiserfs_warning (fp, "unknown format with "); break; } if (reiserfs_super_jr_magic (sb)) reiserfs_warning (fp, "non-"); reiserfs_warning (fp, "standard journal\n"); if (short_print) { reiserfs_warning (fp, "Blocks (total/free): %u/%u by %d bytes\n", reiserfs_sb_get_blocks (sb), reiserfs_sb_get_free (sb), reiserfs_sb_get_blksize (sb)); } else { reiserfs_warning (fp, "Count of blocks on the device: %u\n", reiserfs_sb_get_blocks (sb)); reiserfs_warning (fp, "Number of bitmaps: %u\n", reiserfs_sb_get_bmaps (sb)); reiserfs_warning (fp, "Blocksize: %d\n", reiserfs_sb_get_blksize (sb)); reiserfs_warning (fp, "Free blocks (count of blocks - used [journal, " "bitmaps, data, reserved] blocks): %u\n", reiserfs_sb_get_free (sb)); reiserfs_warning (fp, "Root block: %u\n", reiserfs_sb_get_root (sb)); } reiserfs_warning (fp, "Filesystem is %sclean\n", (reiserfs_sb_get_umount (sb) == FS_CLEANLY_UMOUNTED) ? "" : "NOT "); if (short_print) return 0; reiserfs_warning (fp, "Tree height: %d\n", reiserfs_sb_get_height (sb)); reiserfs_warning (fp, "Hash function used to sort names: %s\n", reiserfs_hash_name (reiserfs_sb_get_hash (sb))); reiserfs_warning (fp, "Objectid map size %d, max %d\n", reiserfs_sb_get_mapcur (sb), reiserfs_sb_get_mapmax (sb)); reiserfs_warning (fp, "Journal parameters:\n"); reiserfs_journal_print_params (fp, reiserfs_sb_jp (sb)); reiserfs_warning (fp, "Blocks reserved by journal: %u\n", reiserfs_sb_get_reserved (sb)); state = reiserfs_sb_get_state (sb); reiserfs_warning (fp, "Fs state field: 0x%x:\n", state); if ((state & FS_FATAL) == FS_FATAL) reiserfs_warning (fp, "\tFATAL corruptions exist.\n"); if ((state & FS_ERROR) == FS_ERROR) reiserfs_warning (fp, "\t some corruptions exist.\n"); if ((state & IO_ERROR) == IO_ERROR) reiserfs_warning (fp, "\tI/O corruptions exist.\n"); reiserfs_warning (fp, "sb_version: %u\n", reiserfs_sb_get_version (sb)); if (format == 2) { reiserfs_warning (fp, "inode generation number: %u\n", reiserfs_sb_get_gen (sb)); reiserfs_warning (fp, "UUID: %U\n", sb->s_uuid); reiserfs_warning (fp, "LABEL: %.16s\n", sb->s_label); reiserfs_warning (fp, "Set flags in SB:\n"); if ((reiserfs_sb_isflag (sb, reiserfs_attrs_cleared))) reiserfs_warning (fp, "\tATTRIBUTES CLEAN\n"); } return 0; } void reiserfs_super_print_state (FILE * fp, reiserfs_filsys_t * fs) { reiserfs_warning (fp, "\nFilesystem state: "); if (reiserfs_sb_state_ok (fs)) reiserfs_warning (fp, "consistent\n\n"); else reiserfs_warning (fp, "consistency is not checked after last mounting\n\n"); }