diff options
Diffstat (limited to 'sys/gnu/fs/reiserfs/reiserfs_prints.c')
-rw-r--r-- | sys/gnu/fs/reiserfs/reiserfs_prints.c | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/sys/gnu/fs/reiserfs/reiserfs_prints.c b/sys/gnu/fs/reiserfs/reiserfs_prints.c new file mode 100644 index 0000000..a3c872d --- /dev/null +++ b/sys/gnu/fs/reiserfs/reiserfs_prints.c @@ -0,0 +1,307 @@ +/*- + * Copyright 2000 Hans Reiser + * See README for licensing and copyright details + * + * Ported to FreeBSD by Jean-Sébastien Pédron <jspedron@club-internet.fr> + * + * $FreeBSD$ + */ + +#include <gnu/fs/reiserfs/reiserfs_fs.h> + +#if 0 +static char error_buf[1024]; +static char fmt_buf[1024]; +static char off_buf[80]; + +static char * +reiserfs_cpu_offset(struct cpu_key *key) +{ + + if (cpu_key_k_type(key) == TYPE_DIRENTRY) + sprintf(off_buf, "%Lu(%Lu)", + (unsigned long long)GET_HASH_VALUE(cpu_key_k_offset(key)), + (unsigned long long)GET_GENERATION_NUMBER( + cpu_key_k_offset(key))); + else + sprintf(off_buf, "0x%Lx", + (unsigned long long)cpu_key_k_offset(key)); + + return (off_buf); +} + +static char * +le_offset(struct key *key) +{ + int version; + + version = le_key_version(key); + if (le_key_k_type(version, key) == TYPE_DIRENTRY) + sprintf(off_buf, "%Lu(%Lu)", + (unsigned long long)GET_HASH_VALUE( + le_key_k_offset(version, key)), + (unsigned long long)GET_GENERATION_NUMBER( + le_key_k_offset(version, key))); + else + sprintf(off_buf, "0x%Lx", + (unsigned long long)le_key_k_offset(version, key)); + + return (off_buf); +} + +static char * +cpu_type(struct cpu_key *key) +{ + + if (cpu_key_k_type(key) == TYPE_STAT_DATA) + return ("SD"); + if (cpu_key_k_type(key) == TYPE_DIRENTRY) + return ("DIR"); + if (cpu_key_k_type(key) == TYPE_DIRECT) + return ("DIRECT"); + if (cpu_key_k_type(key) == TYPE_INDIRECT) + return ("IND"); + + return ("UNKNOWN"); +} + +static char * +le_type(struct key *key) +{ + int version; + + version = le_key_version(key); + + if (le_key_k_type(version, key) == TYPE_STAT_DATA) + return ("SD"); + if (le_key_k_type(version, key) == TYPE_DIRENTRY) + return ("DIR"); + if (le_key_k_type(version, key) == TYPE_DIRECT) + return ("DIRECT"); + if (le_key_k_type(version, key) == TYPE_INDIRECT) + return ("IND"); + + return ("UNKNOWN"); +} + +/* %k */ +static void +sprintf_le_key(char *buf, struct key *key) +{ + + if (key) + sprintf(buf, "[%d %d %s %s]", le32toh(key->k_dir_id), + le32toh(key->k_objectid), le_offset(key), le_type(key)); + else + sprintf(buf, "[NULL]"); +} + +/* %K */ +static void +sprintf_cpu_key(char *buf, struct cpu_key *key) +{ + + if (key) + sprintf(buf, "[%d %d %s %s]", key->on_disk_key.k_dir_id, + key->on_disk_key.k_objectid, reiserfs_cpu_offset (key), + cpu_type (key)); + else + sprintf(buf, "[NULL]"); +} + +static void sprintf_de_head(char *buf, struct reiserfs_de_head *deh) +{ + + if (deh) + sprintf(buf, + "[offset=%d dir_id=%d objectid=%d location=%d state=%04x]", + deh_offset(deh), deh_dir_id(deh), + deh_objectid(deh), deh_location(deh), deh_state(deh)); + else + sprintf(buf, "[NULL]"); +} + +static void +sprintf_item_head(char *buf, struct item_head *ih) +{ + + if (ih) { + strcpy(buf, (ih_version(ih) == KEY_FORMAT_3_6) ? + "*3.6* " : "*3.5*"); + sprintf_le_key(buf + strlen(buf), &(ih->ih_key)); + sprintf(buf + strlen(buf), ", item_len %d, item_location %d, " + "free_space(entry_count) %d", + ih_item_len(ih), ih_location(ih), ih_free_space(ih)); + } else + sprintf(buf, "[NULL]"); +} + +static void +sprintf_direntry(char *buf, struct reiserfs_dir_entry *de) +{ + char name[20]; + + memcpy(name, de->de_name, de->de_namelen > 19 ? 19 : de->de_namelen); + name [de->de_namelen > 19 ? 19 : de->de_namelen] = 0; + sprintf(buf, "\"%s\" ==> [%d %d]", + name, de->de_dir_id, de->de_objectid); +} + +static void +sprintf_block_head(char *buf, struct buf *bp) +{ + + sprintf(buf, "level=%d, nr_items=%d, free_space=%d rdkey ", + B_LEVEL(bp), B_NR_ITEMS(bp), B_FREE_SPACE(bp)); +} + +static void +sprintf_disk_child(char *buf, struct disk_child *dc) +{ + + sprintf (buf, "[dc_number=%d, dc_size=%u]", + dc_block_number(dc), dc_size(dc)); +} + +static char * +is_there_reiserfs_struct (char *fmt, int *what, int *skip) +{ + char *k; + + k = fmt; + *skip = 0; + + while ((k = strchr(k, '%')) != NULL) { + if (k[1] == 'k' || k[1] == 'K' || k[1] == 'h' || k[1] == 't' || + k[1] == 'z' || k[1] == 'b' || k[1] == 'y' || k[1] == 'a' ) { + *what = k[1]; + break; + } + (*skip)++; + k++; + } + + return (k); +} + +static void +prepare_error_buf(const char *fmt, va_list args) +{ + char *fmt1, *k, *p; + int i, j, what, skip; + + fmt1 = fmt_buf; + p = error_buf; + strcpy (fmt1, fmt); + + while ((k = is_there_reiserfs_struct(fmt1, &what, &skip)) != NULL) { + *k = 0; + + p += vsprintf (p, fmt1, args); + + for (i = 0; i < skip; i ++) + j = va_arg(args, int); + + switch (what) { + case 'k': + sprintf_le_key(p, va_arg(args, struct key *)); + break; + case 'K': + sprintf_cpu_key(p, va_arg(args, struct cpu_key *)); + break; + case 'h': + sprintf_item_head(p, va_arg(args, struct item_head *)); + break; + case 't': + sprintf_direntry(p, + va_arg(args, struct reiserfs_dir_entry *)); + break; + case 'y': + sprintf_disk_child(p, + va_arg(args, struct disk_child *)); + break; + case 'z': + sprintf_block_head(p, + va_arg(args, struct buffer_head *)); + break; + case 'a': + sprintf_de_head(p, + va_arg(args, struct reiserfs_de_head *)); + break; + } + + p += strlen(p); + fmt1 = k + 2; + } + + vsprintf(p, fmt1, args); +} + +/* + * In addition to usual conversion specifiers this accepts reiserfs + * specific conversion specifiers: + * %k to print little endian key, + * %K to print cpu key, + * %h to print item_head, + * %t to print directory entry, + * %z to print block head (arg must be struct buf *) + */ + +#define do_reiserfs_warning(fmt) \ +{ \ + va_list args; \ + va_start(args, fmt); \ + prepare_error_buf(fmt, args); \ + va_end(args); \ +} + +void +__reiserfs_log(int level, const char * fmt, ...) +{ + + do_reiserfs_warning(fmt); + log(level, "ReiserFS/%s: %s\n", __FUNCTION__, error_buf); +} + +#endif + +char * +reiserfs_hashname(int code) +{ + + if (code == YURA_HASH) + return ("rupasov"); + if (code == TEA_HASH) + return ("tea"); + if (code == R5_HASH) + return ("r5"); + + return ("unknown"); +} + +void +reiserfs_dump_buffer(caddr_t buf, off_t len) +{ + int i, j; + + log(LOG_DEBUG, "reiserfs: dumping a buffer of %jd bytes\n", + (intmax_t)len); + for (i = 0; i < len; i += 16) { + log(LOG_DEBUG, "%08x: ", i); + for (j = 0; j < 16; j += 2) { + if (i + j >= len) + log(LOG_DEBUG, " "); + else + log(LOG_DEBUG, "%02x%02x ", + buf[i + j] & 0xff, + buf[i + j + 1] & 0xff); + } + for (j = 0; j < 16; ++j) { + if (i + j >= len) + break; + log(LOG_DEBUG, "%c", + isprint(buf[i + j]) ? buf[i + j] : '.'); + } + log(LOG_DEBUG, "\n"); + } +} |