193 lines
5.9 KiB
C
193 lines
5.9 KiB
C
/*
|
|
* Copyright 2000-2004 by Hans Reiser, licensing governed by
|
|
* reiserfsprogs/README
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include <config.h>
|
|
#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");
|
|
}
|
|
|
|
|