mirror of https://github.com/vitalif/e2fsprogs
Add support for the hash_seed and s_def_hash_ver fields in the
superblock. Dumpe2fs can now print out these fields, and they can be modified using debugfs's set_super_value command. Also added to debugfs was the ability to set s_uuid and s_journal_uuid features as well.bitmap-optimize
parent
a3da9d1df7
commit
f61fc0b5d9
|
@ -1,3 +1,9 @@
|
||||||
|
2002-08-23 Theodore Ts'o <tytso@mit.edu>
|
||||||
|
|
||||||
|
* setsuper.c: Add support for the fields s_uuid, s_journal_uuid,
|
||||||
|
s_hash_seed, s_def_hash_version. Add routines for parsing
|
||||||
|
UUID's and hash algorithm identifiers.
|
||||||
|
|
||||||
2002-08-16 Theodore Ts'o <tytso@mit.edu>
|
2002-08-16 Theodore Ts'o <tytso@mit.edu>
|
||||||
|
|
||||||
* icheck.c (do_icheck): Check to see if the block is listed as
|
* icheck.c (do_icheck): Check to see if the block is listed as
|
||||||
|
|
|
@ -30,6 +30,8 @@ struct super_set_info {
|
||||||
static errcode_t parse_uint(struct super_set_info *info, char *arg);
|
static errcode_t parse_uint(struct super_set_info *info, char *arg);
|
||||||
static errcode_t parse_int(struct super_set_info *info, char *arg);
|
static errcode_t parse_int(struct super_set_info *info, char *arg);
|
||||||
static errcode_t parse_string(struct super_set_info *info, char *arg);
|
static errcode_t parse_string(struct super_set_info *info, char *arg);
|
||||||
|
static errcode_t parse_uuid(struct super_set_info *info, char *arg);
|
||||||
|
static errcode_t parse_hashalg(struct super_set_info *info, char *arg);
|
||||||
|
|
||||||
static struct super_set_info super_fields[] = {
|
static struct super_set_info super_fields[] = {
|
||||||
{ "inodes_count", &set_sb.s_inodes_count, 4, parse_uint },
|
{ "inodes_count", &set_sb.s_inodes_count, 4, parse_uint },
|
||||||
|
@ -63,7 +65,7 @@ static struct super_set_info super_fields[] = {
|
||||||
{ "feature_compat", &set_sb.s_feature_compat, 4, parse_uint },
|
{ "feature_compat", &set_sb.s_feature_compat, 4, parse_uint },
|
||||||
{ "feature_incompat", &set_sb.s_feature_incompat, 4, parse_uint },
|
{ "feature_incompat", &set_sb.s_feature_incompat, 4, parse_uint },
|
||||||
{ "feature_ro_compat", &set_sb.s_feature_ro_compat, 4, parse_uint },
|
{ "feature_ro_compat", &set_sb.s_feature_ro_compat, 4, parse_uint },
|
||||||
/* __u8 s_uuid[16]; */
|
{ "uuid", &set_sb.s_uuid, 16, parse_uuid },
|
||||||
{ "volume_name", &set_sb.s_volume_name, 16, parse_string },
|
{ "volume_name", &set_sb.s_volume_name, 16, parse_string },
|
||||||
{ "last_mounted", &set_sb.s_last_mounted, 64, parse_string },
|
{ "last_mounted", &set_sb.s_last_mounted, 64, parse_string },
|
||||||
{ "lastcheck", &set_sb.s_lastcheck, 4, parse_uint },
|
{ "lastcheck", &set_sb.s_lastcheck, 4, parse_uint },
|
||||||
|
@ -73,11 +75,12 @@ static struct super_set_info super_fields[] = {
|
||||||
{ "prealloc_dir_blocks", &set_sb.s_prealloc_dir_blocks, 1,
|
{ "prealloc_dir_blocks", &set_sb.s_prealloc_dir_blocks, 1,
|
||||||
parse_uint },
|
parse_uint },
|
||||||
/* s_padding1 */
|
/* s_padding1 */
|
||||||
/* s_journal_uuid */
|
{ "journal_uuid", &set_sb.s_journal_uuid, 16, parse_uuid },
|
||||||
{ "journal_inum", &set_sb.s_journal_inum, 4, parse_uint },
|
{ "journal_inum", &set_sb.s_journal_inum, 4, parse_uint },
|
||||||
{ "journal_dev", &set_sb.s_journal_dev, 4, parse_uint },
|
{ "journal_dev", &set_sb.s_journal_dev, 4, parse_uint },
|
||||||
{ "last_orphan", &set_sb.s_last_orphan, 4, parse_uint },
|
{ "last_orphan", &set_sb.s_last_orphan, 4, parse_uint },
|
||||||
|
{ "hash_seed", &set_sb.s_hash_seed, 16, parse_uuid },
|
||||||
|
{ "def_hash_version", &set_sb.s_def_hash_version, 1, parse_hashalg },
|
||||||
{ 0, 0, 0, 0 }
|
{ 0, 0, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -169,6 +172,39 @@ static errcode_t parse_string(struct super_set_info *info, char *arg)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static errcode_t parse_uuid(struct super_set_info *info, char *arg)
|
||||||
|
{
|
||||||
|
char * p = (char *) info->ptr;
|
||||||
|
|
||||||
|
if ((strcasecmp(arg, "null") == 0) ||
|
||||||
|
(strcasecmp(arg, "clear") == 0)) {
|
||||||
|
uuid_clear(p);
|
||||||
|
} else if (strcasecmp(arg, "time") == 0) {
|
||||||
|
uuid_generate_time(p);
|
||||||
|
} else if (strcasecmp(arg, "random") == 0) {
|
||||||
|
uuid_generate(p);
|
||||||
|
} else if (uuid_parse(arg, p)) {
|
||||||
|
fprintf(stderr, "Invalid UUID format: %s\n", arg);
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static errcode_t parse_hashalg(struct super_set_info *info, char *arg)
|
||||||
|
{
|
||||||
|
int hashv;
|
||||||
|
unsigned char *p = (unsigned char *) info->ptr;
|
||||||
|
|
||||||
|
hashv = e2p_string2hash(arg);
|
||||||
|
if (hashv < 0) {
|
||||||
|
fprintf(stderr, "Invalid hash algorithm: %s\n", arg);
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
*p = hashv;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void print_possible_fields(void)
|
static void print_possible_fields(void)
|
||||||
{
|
{
|
||||||
struct super_set_info *ss;
|
struct super_set_info *ss;
|
||||||
|
@ -183,6 +219,10 @@ static void print_possible_fields(void)
|
||||||
type = "integer";
|
type = "integer";
|
||||||
else if (ss->func == parse_uint)
|
else if (ss->func == parse_uint)
|
||||||
type = "unsigned integer";
|
type = "unsigned integer";
|
||||||
|
else if (ss->func == parse_uuid)
|
||||||
|
type = "UUID";
|
||||||
|
else if (ss->func == parse_hashalg)
|
||||||
|
type = "hash algorithm";
|
||||||
printf("\t%-20s\t%s\n", ss->name, type);
|
printf("\t%-20s\t%s\n", ss->name, type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
2002-08-23 Theodore Ts'o <tytso@mit.edu>
|
||||||
|
|
||||||
|
* ls.c (list_super2): Print the default hash version and the hash
|
||||||
|
seed for the directory indexing. Use the new e2p_uuid2str
|
||||||
|
function to factor out common code.
|
||||||
|
|
||||||
|
* uuid.c (e2p_uuid2str), e2p.h: New utility function which factors
|
||||||
|
out some common code.
|
||||||
|
|
||||||
|
* hashstr.c (e2p_hash2string, e2p_string2hash): New functions
|
||||||
|
which convert the hash algorithm name to and from a string.
|
||||||
|
|
||||||
2002-08-17 Theodore Ts'o <tytso@mit.edu>
|
2002-08-17 Theodore Ts'o <tytso@mit.edu>
|
||||||
|
|
||||||
* fsetflags.c (fsetflags), fgetflags.c (fgetflags.c), setflags.c
|
* fsetflags.c (fsetflags), fgetflags.c (fgetflags.c), setflags.c
|
||||||
|
|
|
@ -17,14 +17,14 @@ INSTALL = @INSTALL@
|
||||||
all::
|
all::
|
||||||
|
|
||||||
OBJS= feature.o fgetflags.o fsetflags.o fgetversion.o fsetversion.o \
|
OBJS= feature.o fgetflags.o fsetflags.o fgetversion.o fsetversion.o \
|
||||||
getflags.o getversion.o iod.o ls.o pe.o pf.o ps.o \
|
getflags.o getversion.o hashstr.o iod.o ls.o pe.o pf.o ps.o \
|
||||||
setflags.o setversion.o uuid.o
|
setflags.o setversion.o uuid.o
|
||||||
|
|
||||||
SRCS= $(srcdir)/feature.c $(srcdir)/fgetflags.c \
|
SRCS= $(srcdir)/feature.c $(srcdir)/fgetflags.c \
|
||||||
$(srcdir)/fsetflags.c $(srcdir)/fgetversion.c \
|
$(srcdir)/fsetflags.c $(srcdir)/fgetversion.c \
|
||||||
$(srcdir)/fsetversion.c $(srcdir)/getflags.c \
|
$(srcdir)/fsetversion.c $(srcdir)/getflags.c \
|
||||||
$(srcdir)/getversion.c $(srcdir)/iod.c $(srcdir)/ls.c \
|
$(srcdir)/getversion.c $(srcdir)/hashstr.o $(srcdir)/iod.c \
|
||||||
$(srcdir)/pe.c $(srcdir)/pf.c $(srcdir)/ps.c \
|
$(srcdir)/ls.c $(srcdir)/pe.c $(srcdir)/pf.c $(srcdir)/ps.c \
|
||||||
$(srcdir)/setflags.c $(srcdir)/setversion.c \
|
$(srcdir)/setflags.c $(srcdir)/setversion.c \
|
||||||
$(srcdir)/uuid.c
|
$(srcdir)/uuid.c
|
||||||
|
|
||||||
|
|
|
@ -37,3 +37,7 @@ int e2p_edit_feature(const char *str, __u32 *compat_array, __u32 *ok_array);
|
||||||
|
|
||||||
int e2p_is_null_uuid(void *uu);
|
int e2p_is_null_uuid(void *uu);
|
||||||
void e2p_uuid_to_str(void *uu, char *out);
|
void e2p_uuid_to_str(void *uu, char *out);
|
||||||
|
const char *e2p_uuid2str(void *uu);
|
||||||
|
|
||||||
|
const char *e2p_hash2string(int num);
|
||||||
|
int e2p_string2hash(char *string);
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
* feature.c --- convert between features and strings
|
||||||
|
*
|
||||||
|
* Copyright (C) 1999 Theodore Ts'o <tytso@mit.edu>
|
||||||
|
*
|
||||||
|
* This file can be redistributed under the terms of the GNU Library General
|
||||||
|
* Public License
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "e2p.h"
|
||||||
|
|
||||||
|
struct hash {
|
||||||
|
int num;
|
||||||
|
const char *string;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct hash hash_list[] = {
|
||||||
|
{ EXT2_HASH_LEGACY, "legacy" },
|
||||||
|
{ EXT2_HASH_HALF_MD4, "half_md4" },
|
||||||
|
{ EXT2_HASH_TEA, "tea" },
|
||||||
|
{ 0, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
const char *e2p_hash2string(int num)
|
||||||
|
{
|
||||||
|
struct hash *p;
|
||||||
|
static char buf[20];
|
||||||
|
char fchar;
|
||||||
|
int fnum;
|
||||||
|
|
||||||
|
for (p = hash_list; p->string; p++) {
|
||||||
|
if (num == p->num)
|
||||||
|
return p->string;
|
||||||
|
}
|
||||||
|
sprintf(buf, "HASHALG_%d", num);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns the hash algorithm, or -1 on error
|
||||||
|
*/
|
||||||
|
int e2p_string2hash(char *string)
|
||||||
|
{
|
||||||
|
struct hash *p;
|
||||||
|
char *eptr;
|
||||||
|
int num;
|
||||||
|
|
||||||
|
for (p = hash_list; p->string; p++) {
|
||||||
|
if (!strcasecmp(string, p->string)) {
|
||||||
|
return p->num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (strncasecmp(string, "HASHALG_", 8))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (string[8] == 0)
|
||||||
|
return -1;
|
||||||
|
num = strtol(string+8, &eptr, 10);
|
||||||
|
if (num > 255 || num < 0)
|
||||||
|
return -1;
|
||||||
|
if (*eptr)
|
||||||
|
return -1;
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
|
19
lib/e2p/ls.c
19
lib/e2p/ls.c
|
@ -145,11 +145,7 @@ void list_super2(struct ext2_super_block * sb, FILE *f)
|
||||||
} else
|
} else
|
||||||
strcpy(buf, "<not available>");
|
strcpy(buf, "<not available>");
|
||||||
fprintf(f, "Last mounted on: %s\n", buf);
|
fprintf(f, "Last mounted on: %s\n", buf);
|
||||||
if (!e2p_is_null_uuid(sb->s_uuid)) {
|
fprintf(f, "Filesystem UUID: %s\n", e2p_uuid2str(sb->s_uuid));
|
||||||
e2p_uuid_to_str(sb->s_uuid, buf);
|
|
||||||
} else
|
|
||||||
strcpy(buf, "<none>");
|
|
||||||
fprintf(f, "Filesystem UUID: %s\n", buf);
|
|
||||||
fprintf(f, "Filesystem magic number: 0x%04X\n", sb->s_magic);
|
fprintf(f, "Filesystem magic number: 0x%04X\n", sb->s_magic);
|
||||||
fprintf(f, "Filesystem revision #: %d", sb->s_rev_level);
|
fprintf(f, "Filesystem revision #: %d", sb->s_rev_level);
|
||||||
if (sb->s_rev_level == EXT2_GOOD_OLD_REV) {
|
if (sb->s_rev_level == EXT2_GOOD_OLD_REV) {
|
||||||
|
@ -212,15 +208,18 @@ void list_super2(struct ext2_super_block * sb, FILE *f)
|
||||||
fprintf(f, "Inode size: %d\n", sb->s_inode_size);
|
fprintf(f, "Inode size: %d\n", sb->s_inode_size);
|
||||||
}
|
}
|
||||||
if (sb->s_feature_compat & EXT3_FEATURE_COMPAT_HAS_JOURNAL) {
|
if (sb->s_feature_compat & EXT3_FEATURE_COMPAT_HAS_JOURNAL) {
|
||||||
if (e2p_is_null_uuid(sb->s_journal_uuid)) {
|
fprintf(f, "Journal UUID: %s\n",
|
||||||
strcpy(buf, "<none>");
|
e2p_uuid2str(sb->s_journal_uuid));
|
||||||
} else
|
|
||||||
e2p_uuid_to_str(sb->s_journal_uuid, buf);
|
|
||||||
fprintf(f, "Journal UUID: %s\n", buf);
|
|
||||||
fprintf(f, "Journal inode: %u\n", sb->s_journal_inum);
|
fprintf(f, "Journal inode: %u\n", sb->s_journal_inum);
|
||||||
fprintf(f, "Journal device: 0x%04x\n", sb->s_journal_dev);
|
fprintf(f, "Journal device: 0x%04x\n", sb->s_journal_dev);
|
||||||
fprintf(f, "First orphan inode: %u\n", sb->s_last_orphan);
|
fprintf(f, "First orphan inode: %u\n", sb->s_last_orphan);
|
||||||
}
|
}
|
||||||
|
if (sb->s_feature_compat & EXT2_FEATURE_COMPAT_DIR_INDEX) {
|
||||||
|
fprintf(f, "Default directory hash: %s\n",
|
||||||
|
e2p_hash2string(sb->s_def_hash_version));
|
||||||
|
fprintf(f, "Directory Hash Seed: %s\n",
|
||||||
|
e2p_uuid2str(sb->s_hash_seed));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void list_super (struct ext2_super_block * s)
|
void list_super (struct ext2_super_block * s)
|
||||||
|
|
|
@ -66,3 +66,14 @@ void e2p_uuid_to_str(void *uu, char *out)
|
||||||
uuid.node[0], uuid.node[1], uuid.node[2],
|
uuid.node[0], uuid.node[1], uuid.node[2],
|
||||||
uuid.node[3], uuid.node[4], uuid.node[5]);
|
uuid.node[3], uuid.node[4], uuid.node[5]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *e2p_uuid2str(void *uu)
|
||||||
|
{
|
||||||
|
static char buf[80];
|
||||||
|
|
||||||
|
if (e2p_is_null_uuid(uu))
|
||||||
|
return "<none>";
|
||||||
|
e2p_uuid_to_str(uu, buf);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue