diff options
Diffstat (limited to 'fs/reiserfs/prints.c')
| -rw-r--r-- | fs/reiserfs/prints.c | 1003 | 
1 files changed, 514 insertions, 489 deletions
diff --git a/fs/reiserfs/prints.c b/fs/reiserfs/prints.c index 16fdca1d4bd7..d55e164bd5c2 100644 --- a/fs/reiserfs/prints.c +++ b/fs/reiserfs/prints.c  | |||
| @@ -15,168 +15,166 @@ static char error_buf[1024]; | |||
| 15 | static char fmt_buf[1024]; | 15 | static char fmt_buf[1024]; | 
| 16 | static char off_buf[80]; | 16 | static char off_buf[80]; | 
| 17 | 17 | ||
| 18 | 18 | static char *reiserfs_cpu_offset(struct cpu_key *key) | |
| 19 | static char * reiserfs_cpu_offset (struct cpu_key * key) | ||
| 20 | { | 19 | { | 
| 21 | if (cpu_key_k_type(key) == TYPE_DIRENTRY) | 20 | if (cpu_key_k_type(key) == TYPE_DIRENTRY) | 
| 22 | sprintf (off_buf, "%Lu(%Lu)", | 21 | sprintf(off_buf, "%Lu(%Lu)", | 
| 23 | (unsigned long long)GET_HASH_VALUE (cpu_key_k_offset (key)), | 22 | (unsigned long long) | 
| 24 | (unsigned long long)GET_GENERATION_NUMBER (cpu_key_k_offset (key))); | 23 | GET_HASH_VALUE(cpu_key_k_offset(key)), | 
| 25 | else | 24 | (unsigned long long) | 
| 26 | sprintf (off_buf, "0x%Lx", (unsigned long long)cpu_key_k_offset (key)); | 25 | GET_GENERATION_NUMBER(cpu_key_k_offset(key))); | 
| 27 | return off_buf; | 26 | else | 
| 27 | sprintf(off_buf, "0x%Lx", | ||
| 28 | (unsigned long long)cpu_key_k_offset(key)); | ||
| 29 | return off_buf; | ||
| 28 | } | 30 | } | 
| 29 | 31 | ||
| 30 | 32 | static char *le_offset(struct reiserfs_key *key) | |
| 31 | static char * le_offset (struct reiserfs_key * key) | ||
| 32 | { | 33 | { | 
| 33 | int version; | 34 | int version; | 
| 34 | 35 | ||
| 35 | version = le_key_version (key); | 36 | version = le_key_version(key); | 
| 36 | if (le_key_k_type (version, key) == TYPE_DIRENTRY) | 37 | if (le_key_k_type(version, key) == TYPE_DIRENTRY) | 
| 37 | sprintf (off_buf, "%Lu(%Lu)", | 38 | sprintf(off_buf, "%Lu(%Lu)", | 
| 38 | (unsigned long long)GET_HASH_VALUE (le_key_k_offset (version, key)), | 39 | (unsigned long long) | 
| 39 | (unsigned long long)GET_GENERATION_NUMBER (le_key_k_offset (version, key))); | 40 | GET_HASH_VALUE(le_key_k_offset(version, key)), | 
| 40 | else | 41 | (unsigned long long) | 
| 41 | sprintf (off_buf, "0x%Lx", (unsigned long long)le_key_k_offset (version, key)); | 42 | GET_GENERATION_NUMBER(le_key_k_offset(version, key))); | 
| 42 | return off_buf; | 43 | else | 
| 44 | sprintf(off_buf, "0x%Lx", | ||
| 45 | (unsigned long long)le_key_k_offset(version, key)); | ||
| 46 | return off_buf; | ||
| 43 | } | 47 | } | 
| 44 | 48 | ||
| 45 | 49 | static char *cpu_type(struct cpu_key *key) | |
| 46 | static char * cpu_type (struct cpu_key * key) | ||
| 47 | { | 50 | { | 
| 48 | if (cpu_key_k_type (key) == TYPE_STAT_DATA) | 51 | if (cpu_key_k_type(key) == TYPE_STAT_DATA) | 
| 49 | return "SD"; | 52 | return "SD"; | 
| 50 | if (cpu_key_k_type (key) == TYPE_DIRENTRY) | 53 | if (cpu_key_k_type(key) == TYPE_DIRENTRY) | 
| 51 | return "DIR"; | 54 | return "DIR"; | 
| 52 | if (cpu_key_k_type (key) == TYPE_DIRECT) | 55 | if (cpu_key_k_type(key) == TYPE_DIRECT) | 
| 53 | return "DIRECT"; | 56 | return "DIRECT"; | 
| 54 | if (cpu_key_k_type (key) == TYPE_INDIRECT) | 57 | if (cpu_key_k_type(key) == TYPE_INDIRECT) | 
| 55 | return "IND"; | 58 | return "IND"; | 
| 56 | return "UNKNOWN"; | 59 | return "UNKNOWN"; | 
| 57 | } | 60 | } | 
| 58 | 61 | ||
| 59 | 62 | static char *le_type(struct reiserfs_key *key) | |
| 60 | static char * le_type (struct reiserfs_key * key) | ||
| 61 | { | 63 | { | 
| 62 | int version; | 64 | int version; | 
| 63 | |||
| 64 | version = le_key_version (key); | ||
| 65 | 65 | ||
| 66 | if (le_key_k_type (version, key) == TYPE_STAT_DATA) | 66 | version = le_key_version(key); | 
| 67 | return "SD"; | ||
| 68 | if (le_key_k_type (version, key) == TYPE_DIRENTRY) | ||
| 69 | return "DIR"; | ||
| 70 | if (le_key_k_type (version, key) == TYPE_DIRECT) | ||
| 71 | return "DIRECT"; | ||
| 72 | if (le_key_k_type (version, key) == TYPE_INDIRECT) | ||
| 73 | return "IND"; | ||
| 74 | return "UNKNOWN"; | ||
| 75 | } | ||
| 76 | 67 | ||
| 68 | if (le_key_k_type(version, key) == TYPE_STAT_DATA) | ||
| 69 | return "SD"; | ||
| 70 | if (le_key_k_type(version, key) == TYPE_DIRENTRY) | ||
| 71 | return "DIR"; | ||
| 72 | if (le_key_k_type(version, key) == TYPE_DIRECT) | ||
| 73 | return "DIRECT"; | ||
| 74 | if (le_key_k_type(version, key) == TYPE_INDIRECT) | ||
| 75 | return "IND"; | ||
| 76 | return "UNKNOWN"; | ||
| 77 | } | ||
| 77 | 78 | ||
| 78 | /* %k */ | 79 | /* %k */ | 
| 79 | static void sprintf_le_key (char * buf, struct reiserfs_key * key) | 80 | static void sprintf_le_key(char *buf, struct reiserfs_key *key) | 
| 80 | { | 81 | { | 
| 81 | if (key) | 82 | if (key) | 
| 82 | sprintf (buf, "[%d %d %s %s]", le32_to_cpu (key->k_dir_id), | 83 | sprintf(buf, "[%d %d %s %s]", le32_to_cpu(key->k_dir_id), | 
| 83 | le32_to_cpu (key->k_objectid), le_offset (key), le_type (key)); | 84 | le32_to_cpu(key->k_objectid), le_offset(key), | 
| 84 | else | 85 | le_type(key)); | 
| 85 | sprintf (buf, "[NULL]"); | 86 | else | 
| 87 | sprintf(buf, "[NULL]"); | ||
| 86 | } | 88 | } | 
| 87 | 89 | ||
| 88 | |||
| 89 | /* %K */ | 90 | /* %K */ | 
| 90 | static void sprintf_cpu_key (char * buf, struct cpu_key * key) | 91 | static void sprintf_cpu_key(char *buf, struct cpu_key *key) | 
| 91 | { | 92 | { | 
| 92 | if (key) | 93 | if (key) | 
| 93 | sprintf (buf, "[%d %d %s %s]", key->on_disk_key.k_dir_id, | 94 | sprintf(buf, "[%d %d %s %s]", key->on_disk_key.k_dir_id, | 
| 94 | key->on_disk_key.k_objectid, reiserfs_cpu_offset (key), | 95 | key->on_disk_key.k_objectid, reiserfs_cpu_offset(key), | 
| 95 | cpu_type (key)); | 96 | cpu_type(key)); | 
| 96 | else | 97 | else | 
| 97 | sprintf (buf, "[NULL]"); | 98 | sprintf(buf, "[NULL]"); | 
| 98 | } | 99 | } | 
| 99 | 100 | ||
| 100 | static void sprintf_de_head( char *buf, struct reiserfs_de_head *deh ) | 101 | static void sprintf_de_head(char *buf, struct reiserfs_de_head *deh) | 
| 101 | { | 102 | { | 
| 102 | if( deh ) | 103 | if (deh) | 
| 103 | sprintf( buf, "[offset=%d dir_id=%d objectid=%d location=%d state=%04x]", deh_offset(deh), deh_dir_id(deh), | 104 | sprintf(buf, | 
| 104 | deh_objectid(deh), deh_location(deh), deh_state(deh) ); | 105 | "[offset=%d dir_id=%d objectid=%d location=%d state=%04x]", | 
| 105 | else | 106 | deh_offset(deh), deh_dir_id(deh), deh_objectid(deh), | 
| 106 | sprintf( buf, "[NULL]" ); | 107 | deh_location(deh), deh_state(deh)); | 
| 108 | else | ||
| 109 | sprintf(buf, "[NULL]"); | ||
| 107 | 110 | ||
| 108 | } | 111 | } | 
| 109 | 112 | ||
| 110 | static void sprintf_item_head (char * buf, struct item_head * ih) | 113 | static void sprintf_item_head(char *buf, struct item_head *ih) | 
| 111 | { | 114 | { | 
| 112 | if (ih) { | 115 | if (ih) { | 
| 113 | strcpy (buf, (ih_version (ih) == KEY_FORMAT_3_6) ? "*3.6* " : "*3.5*"); | 116 | strcpy(buf, | 
| 114 | sprintf_le_key (buf + strlen (buf), &(ih->ih_key)); | 117 | (ih_version(ih) == KEY_FORMAT_3_6) ? "*3.6* " : "*3.5*"); | 
| 115 | sprintf (buf + strlen (buf), ", item_len %d, item_location %d, " | 118 | sprintf_le_key(buf + strlen(buf), &(ih->ih_key)); | 
| 116 | "free_space(entry_count) %d", | 119 | sprintf(buf + strlen(buf), ", item_len %d, item_location %d, " | 
| 117 | ih_item_len(ih), ih_location(ih), ih_free_space (ih)); | 120 | "free_space(entry_count) %d", | 
| 118 | } else | 121 | ih_item_len(ih), ih_location(ih), ih_free_space(ih)); | 
| 119 | sprintf (buf, "[NULL]"); | 122 | } else | 
| 123 | sprintf(buf, "[NULL]"); | ||
| 120 | } | 124 | } | 
| 121 | 125 | ||
| 122 | 126 | static void sprintf_direntry(char *buf, struct reiserfs_dir_entry *de) | |
| 123 | static void sprintf_direntry (char * buf, struct reiserfs_dir_entry * de) | ||
| 124 | { | 127 | { | 
| 125 | char name[20]; | 128 | char name[20]; | 
| 126 | 129 | ||
| 127 | memcpy (name, de->de_name, de->de_namelen > 19 ? 19 : de->de_namelen); | 130 | memcpy(name, de->de_name, de->de_namelen > 19 ? 19 : de->de_namelen); | 
| 128 | name [de->de_namelen > 19 ? 19 : de->de_namelen] = 0; | 131 | name[de->de_namelen > 19 ? 19 : de->de_namelen] = 0; | 
| 129 | sprintf (buf, "\"%s\"==>[%d %d]", name, de->de_dir_id, de->de_objectid); | 132 | sprintf(buf, "\"%s\"==>[%d %d]", name, de->de_dir_id, de->de_objectid); | 
| 130 | } | 133 | } | 
| 131 | 134 | ||
| 132 | 135 | static void sprintf_block_head(char *buf, struct buffer_head *bh) | |
| 133 | static void sprintf_block_head (char * buf, struct buffer_head * bh) | ||
| 134 | { | 136 | { | 
| 135 | sprintf (buf, "level=%d, nr_items=%d, free_space=%d rdkey ", | 137 | sprintf(buf, "level=%d, nr_items=%d, free_space=%d rdkey ", | 
| 136 | B_LEVEL (bh), B_NR_ITEMS (bh), B_FREE_SPACE (bh)); | 138 | B_LEVEL(bh), B_NR_ITEMS(bh), B_FREE_SPACE(bh)); | 
| 137 | } | 139 | } | 
| 138 | 140 | ||
| 139 | 141 | static void sprintf_buffer_head(char *buf, struct buffer_head *bh) | |
| 140 | static void sprintf_buffer_head (char * buf, struct buffer_head * bh) | ||
| 141 | { | 142 | { | 
| 142 | char b[BDEVNAME_SIZE]; | 143 | char b[BDEVNAME_SIZE]; | 
| 143 | 144 | ||
| 144 | sprintf (buf, "dev %s, size %d, blocknr %llu, count %d, state 0x%lx, page %p, (%s, %s, %s)", | 145 | sprintf(buf, | 
| 145 | bdevname (bh->b_bdev, b), bh->b_size, | 146 | "dev %s, size %d, blocknr %llu, count %d, state 0x%lx, page %p, (%s, %s, %s)", | 
| 146 | (unsigned long long)bh->b_blocknr, | 147 | bdevname(bh->b_bdev, b), bh->b_size, | 
| 147 | atomic_read (&(bh->b_count)), | 148 | (unsigned long long)bh->b_blocknr, atomic_read(&(bh->b_count)), | 
| 148 | bh->b_state, bh->b_page, | 149 | bh->b_state, bh->b_page, | 
| 149 | buffer_uptodate (bh) ? "UPTODATE" : "!UPTODATE", | 150 | buffer_uptodate(bh) ? "UPTODATE" : "!UPTODATE", | 
| 150 | buffer_dirty (bh) ? "DIRTY" : "CLEAN", | 151 | buffer_dirty(bh) ? "DIRTY" : "CLEAN", | 
| 151 | buffer_locked (bh) ? "LOCKED" : "UNLOCKED"); | 152 | buffer_locked(bh) ? "LOCKED" : "UNLOCKED"); | 
| 152 | } | 153 | } | 
| 153 | 154 | ||
| 154 | 155 | static void sprintf_disk_child(char *buf, struct disk_child *dc) | |
| 155 | static void sprintf_disk_child (char * buf, struct disk_child * dc) | ||
| 156 | { | 156 | { | 
| 157 | sprintf (buf, "[dc_number=%d, dc_size=%u]", dc_block_number(dc), dc_size(dc)); | 157 | sprintf(buf, "[dc_number=%d, dc_size=%u]", dc_block_number(dc), | 
| 158 | dc_size(dc)); | ||
| 158 | } | 159 | } | 
| 159 | 160 | ||
| 160 | 161 | static char *is_there_reiserfs_struct(char *fmt, int *what, int *skip) | |
| 161 | static char * is_there_reiserfs_struct (char * fmt, int * what, int * skip) | ||
| 162 | { | 162 | { | 
| 163 | char * k = fmt; | 163 | char *k = fmt; | 
| 164 | 164 | ||
| 165 | *skip = 0; | 165 | *skip = 0; | 
| 166 | |||
| 167 | while ((k = strchr (k, '%')) != NULL) | ||
| 168 | { | ||
| 169 | if (k[1] == 'k' || k[1] == 'K' || k[1] == 'h' || k[1] == 't' || | ||
| 170 | k[1] == 'z' || k[1] == 'b' || k[1] == 'y' || k[1] == 'a' ) { | ||
| 171 | *what = k[1]; | ||
| 172 | break; | ||
| 173 | } | ||
| 174 | (*skip) ++; | ||
| 175 | k ++; | ||
| 176 | } | ||
| 177 | return k; | ||
| 178 | } | ||
| 179 | 166 | ||
| 167 | while ((k = strchr(k, '%')) != NULL) { | ||
| 168 | if (k[1] == 'k' || k[1] == 'K' || k[1] == 'h' || k[1] == 't' || | ||
| 169 | k[1] == 'z' || k[1] == 'b' || k[1] == 'y' || k[1] == 'a') { | ||
| 170 | *what = k[1]; | ||
| 171 | break; | ||
| 172 | } | ||
| 173 | (*skip)++; | ||
| 174 | k++; | ||
| 175 | } | ||
| 176 | return k; | ||
| 177 | } | ||
| 180 | 178 | ||
| 181 | /* debugging reiserfs we used to print out a lot of different | 179 | /* debugging reiserfs we used to print out a lot of different | 
| 182 | variables, like keys, item headers, buffer heads etc. Values of | 180 | variables, like keys, item headers, buffer heads etc. Values of | 
| @@ -191,61 +189,64 @@ static char * is_there_reiserfs_struct (char * fmt, int * what, int * skip) | |||
| 191 | key->k_offset, key->k_uniqueness); | 189 | key->k_offset, key->k_uniqueness); | 
| 192 | */ | 190 | */ | 
| 193 | 191 | ||
| 194 | 192 | static void prepare_error_buf(const char *fmt, va_list args) | |
| 195 | static void | 193 | { | 
| 196 | prepare_error_buf( const char *fmt, va_list args ) | 194 | char *fmt1 = fmt_buf; | 
| 197 | { | 195 | char *k; | 
| 198 | char * fmt1 = fmt_buf; | 196 | char *p = error_buf; | 
| 199 | char * k; | 197 | int i, j, what, skip; | 
| 200 | char * p = error_buf; | 198 | |
| 201 | int i, j, what, skip; | 199 | strcpy(fmt1, fmt); | 
| 202 | 200 | ||
| 203 | strcpy (fmt1, fmt); | 201 | while ((k = is_there_reiserfs_struct(fmt1, &what, &skip)) != NULL) { | 
| 204 | 202 | *k = 0; | |
| 205 | while( (k = is_there_reiserfs_struct( fmt1, &what, &skip )) != NULL ) | 203 | |
| 206 | { | 204 | p += vsprintf(p, fmt1, args); | 
| 207 | *k = 0; | 205 | |
| 208 | 206 | for (i = 0; i < skip; i++) | |
| 209 | p += vsprintf (p, fmt1, args); | 207 | j = va_arg(args, int); | 
| 210 | 208 | ||
| 211 | for (i = 0; i < skip; i ++) | 209 | switch (what) { | 
| 212 | j = va_arg (args, int); | 210 | case 'k': | 
| 213 | 211 | sprintf_le_key(p, va_arg(args, struct reiserfs_key *)); | |
| 214 | switch (what) { | 212 | break; | 
| 215 | case 'k': | 213 | case 'K': | 
| 216 | sprintf_le_key (p, va_arg(args, struct reiserfs_key *)); | 214 | sprintf_cpu_key(p, va_arg(args, struct cpu_key *)); | 
| 217 | break; | 215 | break; | 
| 218 | case 'K': | 216 | case 'h': | 
| 219 | sprintf_cpu_key (p, va_arg(args, struct cpu_key *)); | 217 | sprintf_item_head(p, va_arg(args, struct item_head *)); | 
| 220 | break; | 218 | break; | 
| 221 | case 'h': | 219 | case 't': | 
| 222 | sprintf_item_head (p, va_arg(args, struct item_head *)); | 220 | sprintf_direntry(p, | 
| 223 | break; | 221 | va_arg(args, | 
| 224 | case 't': | 222 | struct reiserfs_dir_entry *)); | 
| 225 | sprintf_direntry (p, va_arg(args, struct reiserfs_dir_entry *)); | 223 | break; | 
| 226 | break; | 224 | case 'y': | 
| 227 | case 'y': | 225 | sprintf_disk_child(p, | 
| 228 | sprintf_disk_child (p, va_arg(args, struct disk_child *)); | 226 | va_arg(args, struct disk_child *)); | 
| 229 | break; | 227 | break; | 
| 230 | case 'z': | 228 | case 'z': | 
| 231 | sprintf_block_head (p, va_arg(args, struct buffer_head *)); | 229 | sprintf_block_head(p, | 
| 232 | break; | 230 | va_arg(args, struct buffer_head *)); | 
| 233 | case 'b': | 231 | break; | 
| 234 | sprintf_buffer_head (p, va_arg(args, struct buffer_head *)); | 232 | case 'b': | 
| 235 | break; | 233 | sprintf_buffer_head(p, | 
| 236 | case 'a': | 234 | va_arg(args, struct buffer_head *)); | 
| 237 | sprintf_de_head (p, va_arg(args, struct reiserfs_de_head *)); | 235 | break; | 
| 238 | break; | 236 | case 'a': | 
| 239 | } | 237 | sprintf_de_head(p, | 
| 240 | 238 | va_arg(args, | |
| 241 | p += strlen (p); | 239 | struct reiserfs_de_head *)); | 
| 242 | fmt1 = k + 2; | 240 | break; | 
| 243 | } | 241 | } | 
| 244 | vsprintf (p, fmt1, args); | 242 | |
| 243 | p += strlen(p); | ||
| 244 | fmt1 = k + 2; | ||
| 245 | } | ||
| 246 | vsprintf(p, fmt1, args); | ||
| 245 | 247 | ||
| 246 | } | 248 | } | 
| 247 | 249 | ||
| 248 | |||
| 249 | /* in addition to usual conversion specifiers this accepts reiserfs | 250 | /* in addition to usual conversion specifiers this accepts reiserfs | 
| 250 | specific conversion specifiers: | 251 | specific conversion specifiers: | 
| 251 | %k to print little endian key, | 252 | %k to print little endian key, | 
| @@ -264,43 +265,43 @@ prepare_error_buf( const char *fmt, va_list args ) | |||
| 264 | va_end( args );\ | 265 | va_end( args );\ | 
| 265 | } | 266 | } | 
| 266 | 267 | ||
| 267 | void reiserfs_warning (struct super_block *sb, const char * fmt, ...) | 268 | void reiserfs_warning(struct super_block *sb, const char *fmt, ...) | 
| 268 | { | 269 | { | 
| 269 | do_reiserfs_warning(fmt); | 270 | do_reiserfs_warning(fmt); | 
| 270 | if (sb) | 271 | if (sb) | 
| 271 | printk (KERN_WARNING "ReiserFS: %s: warning: %s\n", | 272 | printk(KERN_WARNING "ReiserFS: %s: warning: %s\n", | 
| 272 | reiserfs_bdevname (sb), error_buf); | 273 | reiserfs_bdevname(sb), error_buf); | 
| 273 | else | 274 | else | 
| 274 | printk (KERN_WARNING "ReiserFS: warning: %s\n", error_buf); | 275 | printk(KERN_WARNING "ReiserFS: warning: %s\n", error_buf); | 
| 275 | } | 276 | } | 
| 276 | 277 | ||
| 277 | /* No newline.. reiserfs_info calls can be followed by printk's */ | 278 | /* No newline.. reiserfs_info calls can be followed by printk's */ | 
| 278 | void reiserfs_info (struct super_block *sb, const char * fmt, ...) | 279 | void reiserfs_info(struct super_block *sb, const char *fmt, ...) | 
| 279 | { | 280 | { | 
| 280 | do_reiserfs_warning(fmt); | 281 | do_reiserfs_warning(fmt); | 
| 281 | if (sb) | 282 | if (sb) | 
| 282 | printk (KERN_NOTICE "ReiserFS: %s: %s", | 283 | printk(KERN_NOTICE "ReiserFS: %s: %s", | 
| 283 | reiserfs_bdevname (sb), error_buf); | 284 | reiserfs_bdevname(sb), error_buf); | 
| 284 | else | 285 | else | 
| 285 | printk (KERN_NOTICE "ReiserFS: %s", error_buf); | 286 | printk(KERN_NOTICE "ReiserFS: %s", error_buf); | 
| 286 | } | 287 | } | 
| 287 | 288 | ||
| 288 | /* No newline.. reiserfs_printk calls can be followed by printk's */ | 289 | /* No newline.. reiserfs_printk calls can be followed by printk's */ | 
| 289 | static void reiserfs_printk (const char * fmt, ...) | 290 | static void reiserfs_printk(const char *fmt, ...) | 
| 290 | { | 291 | { | 
| 291 | do_reiserfs_warning(fmt); | 292 | do_reiserfs_warning(fmt); | 
| 292 | printk (error_buf); | 293 | printk(error_buf); | 
| 293 | } | 294 | } | 
| 294 | 295 | ||
| 295 | void reiserfs_debug (struct super_block *s, int level, const char * fmt, ...) | 296 | void reiserfs_debug(struct super_block *s, int level, const char *fmt, ...) | 
| 296 | { | 297 | { | 
| 297 | #ifdef CONFIG_REISERFS_CHECK | 298 | #ifdef CONFIG_REISERFS_CHECK | 
| 298 | do_reiserfs_warning(fmt); | 299 | do_reiserfs_warning(fmt); | 
| 299 | if (s) | 300 | if (s) | 
| 300 | printk (KERN_DEBUG "ReiserFS: %s: %s\n", | 301 | printk(KERN_DEBUG "ReiserFS: %s: %s\n", | 
| 301 | reiserfs_bdevname (s), error_buf); | 302 | reiserfs_bdevname(s), error_buf); | 
| 302 | else | 303 | else | 
| 303 | printk (KERN_DEBUG "ReiserFS: %s\n", error_buf); | 304 | printk(KERN_DEBUG "ReiserFS: %s\n", error_buf); | 
| 304 | #endif | 305 | #endif | 
| 305 | } | 306 | } | 
| 306 | 307 | ||
| @@ -349,379 +350,403 @@ void reiserfs_debug (struct super_block *s, int level, const char * fmt, ...) | |||
| 349 | 350 | ||
| 350 | . */ | 351 | . */ | 
| 351 | 352 | ||
| 352 | |||
| 353 | #ifdef CONFIG_REISERFS_CHECK | 353 | #ifdef CONFIG_REISERFS_CHECK | 
| 354 | extern struct tree_balance * cur_tb; | 354 | extern struct tree_balance *cur_tb; | 
| 355 | #endif | 355 | #endif | 
| 356 | 356 | ||
| 357 | void reiserfs_panic (struct super_block * sb, const char * fmt, ...) | 357 | void reiserfs_panic(struct super_block *sb, const char *fmt, ...) | 
| 358 | { | 358 | { | 
| 359 | do_reiserfs_warning(fmt); | 359 | do_reiserfs_warning(fmt); | 
| 360 | printk (KERN_EMERG "REISERFS: panic (device %s): %s\n", | 360 | printk(KERN_EMERG "REISERFS: panic (device %s): %s\n", | 
| 361 | reiserfs_bdevname (sb), error_buf); | 361 | reiserfs_bdevname(sb), error_buf); | 
| 362 | BUG (); | 362 | BUG(); | 
| 363 | 363 | ||
| 364 | /* this is not actually called, but makes reiserfs_panic() "noreturn" */ | 364 | /* this is not actually called, but makes reiserfs_panic() "noreturn" */ | 
| 365 | panic ("REISERFS: panic (device %s): %s\n", | 365 | panic("REISERFS: panic (device %s): %s\n", | 
| 366 | reiserfs_bdevname (sb), error_buf); | 366 | reiserfs_bdevname(sb), error_buf); | 
| 367 | } | 367 | } | 
| 368 | 368 | ||
| 369 | void | 369 | void reiserfs_abort(struct super_block *sb, int errno, const char *fmt, ...) | 
| 370 | reiserfs_abort (struct super_block *sb, int errno, const char *fmt, ...) | ||
| 371 | { | 370 | { | 
| 372 | do_reiserfs_warning (fmt); | 371 | do_reiserfs_warning(fmt); | 
| 373 | 372 | ||
| 374 | if (reiserfs_error_panic (sb)) { | 373 | if (reiserfs_error_panic(sb)) { | 
| 375 | panic (KERN_CRIT "REISERFS: panic (device %s): %s\n", | 374 | panic(KERN_CRIT "REISERFS: panic (device %s): %s\n", | 
| 376 | reiserfs_bdevname (sb), error_buf); | 375 | reiserfs_bdevname(sb), error_buf); | 
| 377 | } | 376 | } | 
| 378 | 377 | ||
| 379 | if (sb->s_flags & MS_RDONLY) | 378 | if (sb->s_flags & MS_RDONLY) | 
| 380 | return; | 379 | return; | 
| 381 | 380 | ||
| 382 | printk (KERN_CRIT "REISERFS: abort (device %s): %s\n", | 381 | printk(KERN_CRIT "REISERFS: abort (device %s): %s\n", | 
| 383 | reiserfs_bdevname (sb), error_buf); | 382 | reiserfs_bdevname(sb), error_buf); | 
| 384 | 383 | ||
| 385 | sb->s_flags |= MS_RDONLY; | 384 | sb->s_flags |= MS_RDONLY; | 
| 386 | reiserfs_journal_abort (sb, errno); | 385 | reiserfs_journal_abort(sb, errno); | 
| 387 | } | 386 | } | 
| 388 | 387 | ||
| 389 | /* this prints internal nodes (4 keys/items in line) (dc_number, | 388 | /* this prints internal nodes (4 keys/items in line) (dc_number, | 
| 390 | dc_size)[k_dirid, k_objectid, k_offset, k_uniqueness](dc_number, | 389 | dc_size)[k_dirid, k_objectid, k_offset, k_uniqueness](dc_number, | 
| 391 | dc_size)...*/ | 390 | dc_size)...*/ | 
| 392 | static int print_internal (struct buffer_head * bh, int first, int last) | 391 | static int print_internal(struct buffer_head *bh, int first, int last) | 
| 393 | { | 392 | { | 
| 394 | struct reiserfs_key * key; | 393 | struct reiserfs_key *key; | 
| 395 | struct disk_child * dc; | 394 | struct disk_child *dc; | 
| 396 | int i; | 395 | int i; | 
| 397 | int from, to; | 396 | int from, to; | 
| 398 | |||
| 399 | if (!B_IS_KEYS_LEVEL (bh)) | ||
| 400 | return 1; | ||
| 401 | |||
| 402 | check_internal (bh); | ||
| 403 | |||
| 404 | if (first == -1) { | ||
| 405 | from = 0; | ||
| 406 | to = B_NR_ITEMS (bh); | ||
| 407 | } else { | ||
| 408 | from = first; | ||
| 409 | to = last < B_NR_ITEMS (bh) ? last : B_NR_ITEMS (bh); | ||
| 410 | } | ||
| 411 | |||
| 412 | reiserfs_printk ("INTERNAL NODE (%ld) contains %z\n", bh->b_blocknr, bh); | ||
| 413 | |||
| 414 | dc = B_N_CHILD (bh, from); | ||
| 415 | reiserfs_printk ("PTR %d: %y ", from, dc); | ||
| 416 | |||
| 417 | for (i = from, key = B_N_PDELIM_KEY (bh, from), dc ++; i < to; i ++, key ++, dc ++) { | ||
| 418 | reiserfs_printk ("KEY %d: %k PTR %d: %y ", i, key, i + 1, dc); | ||
| 419 | if (i && i % 4 == 0) | ||
| 420 | printk ("\n"); | ||
| 421 | } | ||
| 422 | printk ("\n"); | ||
| 423 | return 0; | ||
| 424 | } | ||
| 425 | 397 | ||
| 398 | if (!B_IS_KEYS_LEVEL(bh)) | ||
| 399 | return 1; | ||
| 426 | 400 | ||
| 401 | check_internal(bh); | ||
| 427 | 402 | ||
| 403 | if (first == -1) { | ||
| 404 | from = 0; | ||
| 405 | to = B_NR_ITEMS(bh); | ||
| 406 | } else { | ||
| 407 | from = first; | ||
| 408 | to = last < B_NR_ITEMS(bh) ? last : B_NR_ITEMS(bh); | ||
| 409 | } | ||
| 428 | 410 | ||
| 411 | reiserfs_printk("INTERNAL NODE (%ld) contains %z\n", bh->b_blocknr, bh); | ||
| 429 | 412 | ||
| 430 | static int print_leaf (struct buffer_head * bh, int print_mode, int first, int last) | 413 | dc = B_N_CHILD(bh, from); | 
| 431 | { | 414 | reiserfs_printk("PTR %d: %y ", from, dc); | 
| 432 | struct block_head * blkh; | ||
| 433 | struct item_head * ih; | ||
| 434 | int i, nr; | ||
| 435 | int from, to; | ||
| 436 | 415 | ||
| 437 | if (!B_IS_ITEMS_LEVEL (bh)) | 416 | for (i = from, key = B_N_PDELIM_KEY(bh, from), dc++; i < to; | 
| 438 | return 1; | 417 | i++, key++, dc++) { | 
| 418 | reiserfs_printk("KEY %d: %k PTR %d: %y ", i, key, i + 1, dc); | ||
| 419 | if (i && i % 4 == 0) | ||
| 420 | printk("\n"); | ||
| 421 | } | ||
| 422 | printk("\n"); | ||
| 423 | return 0; | ||
| 424 | } | ||
| 439 | 425 | ||
| 440 | check_leaf (bh); | 426 | static int print_leaf(struct buffer_head *bh, int print_mode, int first, | 
| 427 | int last) | ||
| 428 | { | ||
| 429 | struct block_head *blkh; | ||
| 430 | struct item_head *ih; | ||
| 431 | int i, nr; | ||
| 432 | int from, to; | ||
| 441 | 433 | ||
| 442 | blkh = B_BLK_HEAD (bh); | 434 | if (!B_IS_ITEMS_LEVEL(bh)) | 
| 443 | ih = B_N_PITEM_HEAD (bh,0); | 435 | return 1; | 
| 444 | nr = blkh_nr_item(blkh); | ||
| 445 | 436 | ||
| 446 | printk ("\n===================================================================\n"); | 437 | check_leaf(bh); | 
| 447 | reiserfs_printk ("LEAF NODE (%ld) contains %z\n", bh->b_blocknr, bh); | ||
| 448 | 438 | ||
| 449 | if (!(print_mode & PRINT_LEAF_ITEMS)) { | 439 | blkh = B_BLK_HEAD(bh); | 
| 450 | reiserfs_printk ("FIRST ITEM_KEY: %k, LAST ITEM KEY: %k\n", | 440 | ih = B_N_PITEM_HEAD(bh, 0); | 
| 451 | &(ih->ih_key), &((ih + nr - 1)->ih_key)); | 441 | nr = blkh_nr_item(blkh); | 
| 452 | return 0; | ||
| 453 | } | ||
| 454 | 442 | ||
| 455 | if (first < 0 || first > nr - 1) | 443 | printk | 
| 456 | from = 0; | 444 | ("\n===================================================================\n"); | 
| 457 | else | 445 | reiserfs_printk("LEAF NODE (%ld) contains %z\n", bh->b_blocknr, bh); | 
| 458 | from = first; | ||
| 459 | 446 | ||
| 460 | if (last < 0 || last > nr ) | 447 | if (!(print_mode & PRINT_LEAF_ITEMS)) { | 
| 461 | to = nr; | 448 | reiserfs_printk("FIRST ITEM_KEY: %k, LAST ITEM KEY: %k\n", | 
| 462 | else | 449 | &(ih->ih_key), &((ih + nr - 1)->ih_key)); | 
| 463 | to = last; | 450 | return 0; | 
| 451 | } | ||
| 464 | 452 | ||
| 465 | ih += from; | 453 | if (first < 0 || first > nr - 1) | 
| 466 | printk ("-------------------------------------------------------------------------------\n"); | 454 | from = 0; | 
| 467 | printk ("|##| type | key | ilen | free_space | version | loc |\n"); | 455 | else | 
| 468 | for (i = from; i < to; i++, ih ++) { | 456 | from = first; | 
| 469 | printk ("-------------------------------------------------------------------------------\n"); | 457 | |
| 470 | reiserfs_printk ("|%2d| %h |\n", i, ih); | 458 | if (last < 0 || last > nr) | 
| 471 | if (print_mode & PRINT_LEAF_ITEMS) | 459 | to = nr; | 
| 472 | op_print_item (ih, B_I_PITEM (bh, ih)); | 460 | else | 
| 473 | } | 461 | to = last; | 
| 462 | |||
| 463 | ih += from; | ||
| 464 | printk | ||
| 465 | ("-------------------------------------------------------------------------------\n"); | ||
| 466 | printk | ||
| 467 | ("|##| type | key | ilen | free_space | version | loc |\n"); | ||
| 468 | for (i = from; i < to; i++, ih++) { | ||
| 469 | printk | ||
| 470 | ("-------------------------------------------------------------------------------\n"); | ||
| 471 | reiserfs_printk("|%2d| %h |\n", i, ih); | ||
| 472 | if (print_mode & PRINT_LEAF_ITEMS) | ||
| 473 | op_print_item(ih, B_I_PITEM(bh, ih)); | ||
| 474 | } | ||
| 474 | 475 | ||
| 475 | printk ("===================================================================\n"); | 476 | printk | 
| 477 | ("===================================================================\n"); | ||
| 476 | 478 | ||
| 477 | return 0; | 479 | return 0; | 
| 478 | } | 480 | } | 
| 479 | 481 | ||
| 480 | char * reiserfs_hashname(int code) | 482 | char *reiserfs_hashname(int code) | 
| 481 | { | 483 | { | 
| 482 | if ( code == YURA_HASH) | 484 | if (code == YURA_HASH) | 
| 483 | return "rupasov"; | 485 | return "rupasov"; | 
| 484 | if ( code == TEA_HASH) | 486 | if (code == TEA_HASH) | 
| 485 | return "tea"; | 487 | return "tea"; | 
| 486 | if ( code == R5_HASH) | 488 | if (code == R5_HASH) | 
| 487 | return "r5"; | 489 | return "r5"; | 
| 488 | 490 | ||
| 489 | return "unknown"; | 491 | return "unknown"; | 
| 490 | } | 492 | } | 
| 491 | 493 | ||
| 492 | /* return 1 if this is not super block */ | 494 | /* return 1 if this is not super block */ | 
| 493 | static int print_super_block (struct buffer_head * bh) | 495 | static int print_super_block(struct buffer_head *bh) | 
| 494 | { | 496 | { | 
| 495 | struct reiserfs_super_block * rs = (struct reiserfs_super_block *)(bh->b_data); | 497 | struct reiserfs_super_block *rs = | 
| 496 | int skipped, data_blocks; | 498 | (struct reiserfs_super_block *)(bh->b_data); | 
| 497 | char *version; | 499 | int skipped, data_blocks; | 
| 498 | char b[BDEVNAME_SIZE]; | 500 | char *version; | 
| 499 | 501 | char b[BDEVNAME_SIZE]; | |
| 500 | if (is_reiserfs_3_5(rs)) { | 502 | |
| 501 | version = "3.5"; | 503 | if (is_reiserfs_3_5(rs)) { | 
| 502 | } else if (is_reiserfs_3_6(rs)) { | 504 | version = "3.5"; | 
| 503 | version = "3.6"; | 505 | } else if (is_reiserfs_3_6(rs)) { | 
| 504 | } else if (is_reiserfs_jr(rs)) { | 506 | version = "3.6"; | 
| 505 | version = ((sb_version(rs) == REISERFS_VERSION_2) ? | 507 | } else if (is_reiserfs_jr(rs)) { | 
| 506 | "3.6" : "3.5"); | 508 | version = ((sb_version(rs) == REISERFS_VERSION_2) ? | 
| 507 | } else { | 509 | "3.6" : "3.5"); | 
| 508 | return 1; | 510 | } else { | 
| 509 | } | 511 | return 1; | 
| 510 | 512 | } | |
| 511 | printk ("%s\'s super block is in block %llu\n", bdevname (bh->b_bdev, b), | 513 | |
| 512 | (unsigned long long)bh->b_blocknr); | 514 | printk("%s\'s super block is in block %llu\n", bdevname(bh->b_bdev, b), | 
| 513 | printk ("Reiserfs version %s\n", version ); | 515 | (unsigned long long)bh->b_blocknr); | 
| 514 | printk ("Block count %u\n", sb_block_count(rs)); | 516 | printk("Reiserfs version %s\n", version); | 
| 515 | printk ("Blocksize %d\n", sb_blocksize(rs)); | 517 | printk("Block count %u\n", sb_block_count(rs)); | 
| 516 | printk ("Free blocks %u\n", sb_free_blocks(rs)); | 518 | printk("Blocksize %d\n", sb_blocksize(rs)); | 
| 517 | // FIXME: this would be confusing if | 519 | printk("Free blocks %u\n", sb_free_blocks(rs)); | 
| 518 | // someone stores reiserfs super block in some data block ;) | 520 | // FIXME: this would be confusing if | 
| 521 | // someone stores reiserfs super block in some data block ;) | ||
| 519 | // skipped = (bh->b_blocknr * bh->b_size) / sb_blocksize(rs); | 522 | // skipped = (bh->b_blocknr * bh->b_size) / sb_blocksize(rs); | 
| 520 | skipped = bh->b_blocknr; | 523 | skipped = bh->b_blocknr; | 
| 521 | data_blocks = sb_block_count(rs) - skipped - 1 - sb_bmap_nr(rs) - | 524 | data_blocks = sb_block_count(rs) - skipped - 1 - sb_bmap_nr(rs) - | 
| 522 | (!is_reiserfs_jr(rs) ? sb_jp_journal_size(rs) + 1 : sb_reserved_for_journal(rs)) - | 525 | (!is_reiserfs_jr(rs) ? sb_jp_journal_size(rs) + | 
| 523 | sb_free_blocks(rs); | 526 | 1 : sb_reserved_for_journal(rs)) - sb_free_blocks(rs); | 
| 524 | printk ("Busy blocks (skipped %d, bitmaps - %d, journal (or reserved) blocks - %d\n" | 527 | printk | 
| 525 | "1 super block, %d data blocks\n", | 528 | ("Busy blocks (skipped %d, bitmaps - %d, journal (or reserved) blocks - %d\n" | 
| 526 | skipped, sb_bmap_nr(rs), (!is_reiserfs_jr(rs) ? (sb_jp_journal_size(rs) + 1) : | 529 | "1 super block, %d data blocks\n", skipped, sb_bmap_nr(rs), | 
| 527 | sb_reserved_for_journal(rs)) , data_blocks); | 530 | (!is_reiserfs_jr(rs) ? (sb_jp_journal_size(rs) + 1) : | 
| 528 | printk ("Root block %u\n", sb_root_block(rs)); | 531 | sb_reserved_for_journal(rs)), data_blocks); | 
| 529 | printk ("Journal block (first) %d\n", sb_jp_journal_1st_block(rs)); | 532 | printk("Root block %u\n", sb_root_block(rs)); | 
| 530 | printk ("Journal dev %d\n", sb_jp_journal_dev(rs)); | 533 | printk("Journal block (first) %d\n", sb_jp_journal_1st_block(rs)); | 
| 531 | printk ("Journal orig size %d\n", sb_jp_journal_size(rs)); | 534 | printk("Journal dev %d\n", sb_jp_journal_dev(rs)); | 
| 532 | printk ("FS state %d\n", sb_fs_state(rs)); | 535 | printk("Journal orig size %d\n", sb_jp_journal_size(rs)); | 
| 533 | printk ("Hash function \"%s\"\n", | 536 | printk("FS state %d\n", sb_fs_state(rs)); | 
| 534 | reiserfs_hashname(sb_hash_function_code(rs))); | 537 | printk("Hash function \"%s\"\n", | 
| 535 | 538 | reiserfs_hashname(sb_hash_function_code(rs))); | |
| 536 | printk ("Tree height %d\n", sb_tree_height(rs)); | 539 | |
| 537 | return 0; | 540 | printk("Tree height %d\n", sb_tree_height(rs)); | 
| 541 | return 0; | ||
| 538 | } | 542 | } | 
| 539 | 543 | ||
| 540 | static int print_desc_block (struct buffer_head * bh) | 544 | static int print_desc_block(struct buffer_head *bh) | 
| 541 | { | 545 | { | 
| 542 | struct reiserfs_journal_desc * desc; | 546 | struct reiserfs_journal_desc *desc; | 
| 543 | 547 | ||
| 544 | if (memcmp(get_journal_desc_magic (bh), JOURNAL_DESC_MAGIC, 8)) | 548 | if (memcmp(get_journal_desc_magic(bh), JOURNAL_DESC_MAGIC, 8)) | 
| 545 | return 1; | 549 | return 1; | 
| 546 | 550 | ||
| 547 | desc = (struct reiserfs_journal_desc *)(bh->b_data); | 551 | desc = (struct reiserfs_journal_desc *)(bh->b_data); | 
| 548 | printk ("Desc block %llu (j_trans_id %d, j_mount_id %d, j_len %d)", | 552 | printk("Desc block %llu (j_trans_id %d, j_mount_id %d, j_len %d)", | 
| 549 | (unsigned long long)bh->b_blocknr, get_desc_trans_id (desc), get_desc_mount_id (desc), | 553 | (unsigned long long)bh->b_blocknr, get_desc_trans_id(desc), | 
| 550 | get_desc_trans_len (desc)); | 554 | get_desc_mount_id(desc), get_desc_trans_len(desc)); | 
| 551 | 555 | ||
| 552 | return 0; | 556 | return 0; | 
| 553 | } | 557 | } | 
| 554 | 558 | ||
| 555 | 559 | void print_block(struct buffer_head *bh, ...) //int print_mode, int first, int last) | |
| 556 | void print_block (struct buffer_head * bh, ...)//int print_mode, int first, int last) | ||
| 557 | { | 560 | { | 
| 558 | va_list args; | 561 | va_list args; | 
| 559 | int mode, first, last; | 562 | int mode, first, last; | 
| 560 | 563 | ||
| 561 | va_start (args, bh); | 564 | va_start(args, bh); | 
| 562 | 565 | ||
| 563 | if ( ! bh ) { | 566 | if (!bh) { | 
| 564 | printk("print_block: buffer is NULL\n"); | 567 | printk("print_block: buffer is NULL\n"); | 
| 565 | return; | 568 | return; | 
| 566 | } | 569 | } | 
| 567 | 570 | ||
| 568 | mode = va_arg (args, int); | 571 | mode = va_arg(args, int); | 
| 569 | first = va_arg (args, int); | 572 | first = va_arg(args, int); | 
| 570 | last = va_arg (args, int); | 573 | last = va_arg(args, int); | 
| 571 | if (print_leaf (bh, mode, first, last)) | 574 | if (print_leaf(bh, mode, first, last)) | 
| 572 | if (print_internal (bh, first, last)) | 575 | if (print_internal(bh, first, last)) | 
| 573 | if (print_super_block (bh)) | 576 | if (print_super_block(bh)) | 
| 574 | if (print_desc_block (bh)) | 577 | if (print_desc_block(bh)) | 
| 575 | printk ("Block %llu contains unformatted data\n", (unsigned long long)bh->b_blocknr); | 578 | printk | 
| 579 | ("Block %llu contains unformatted data\n", | ||
| 580 | (unsigned long long)bh->b_blocknr); | ||
| 576 | } | 581 | } | 
| 577 | 582 | ||
| 578 | |||
| 579 | |||
| 580 | static char print_tb_buf[2048]; | 583 | static char print_tb_buf[2048]; | 
| 581 | 584 | ||
| 582 | /* this stores initial state of tree balance in the print_tb_buf */ | 585 | /* this stores initial state of tree balance in the print_tb_buf */ | 
| 583 | void store_print_tb (struct tree_balance * tb) | 586 | void store_print_tb(struct tree_balance *tb) | 
| 584 | { | 587 | { | 
| 585 | int h = 0; | 588 | int h = 0; | 
| 586 | int i; | 589 | int i; | 
| 587 | struct buffer_head * tbSh, * tbFh; | 590 | struct buffer_head *tbSh, *tbFh; | 
| 588 | 591 | ||
| 589 | if (!tb) | 592 | if (!tb) | 
| 590 | return; | 593 | return; | 
| 591 | 594 | ||
| 592 | sprintf (print_tb_buf, "\n" | 595 | sprintf(print_tb_buf, "\n" | 
| 593 | "BALANCING %d\n" | 596 | "BALANCING %d\n" | 
| 594 | "MODE=%c, ITEM_POS=%d POS_IN_ITEM=%d\n" | 597 | "MODE=%c, ITEM_POS=%d POS_IN_ITEM=%d\n" | 
| 595 | "=====================================================================\n" | 598 | "=====================================================================\n" | 
| 596 | "* h * S * L * R * F * FL * FR * CFL * CFR *\n", | 599 | "* h * S * L * R * F * FL * FR * CFL * CFR *\n", | 
| 597 | REISERFS_SB(tb->tb_sb)->s_do_balance, | 600 | REISERFS_SB(tb->tb_sb)->s_do_balance, | 
| 598 | tb->tb_mode, PATH_LAST_POSITION (tb->tb_path), tb->tb_path->pos_in_item); | 601 | tb->tb_mode, PATH_LAST_POSITION(tb->tb_path), | 
| 599 | 602 | tb->tb_path->pos_in_item); | |
| 600 | for (h = 0; h < sizeof(tb->insert_size) / sizeof (tb->insert_size[0]); h ++) { | 603 | |
| 601 | if (PATH_H_PATH_OFFSET (tb->tb_path, h) <= tb->tb_path->path_length && | 604 | for (h = 0; h < sizeof(tb->insert_size) / sizeof(tb->insert_size[0]); | 
| 602 | PATH_H_PATH_OFFSET (tb->tb_path, h) > ILLEGAL_PATH_ELEMENT_OFFSET) { | 605 | h++) { | 
| 603 | tbSh = PATH_H_PBUFFER (tb->tb_path, h); | 606 | if (PATH_H_PATH_OFFSET(tb->tb_path, h) <= | 
| 604 | tbFh = PATH_H_PPARENT (tb->tb_path, h); | 607 | tb->tb_path->path_length | 
| 605 | } else { | 608 | && PATH_H_PATH_OFFSET(tb->tb_path, | 
| 606 | tbSh = NULL; | 609 | h) > ILLEGAL_PATH_ELEMENT_OFFSET) { | 
| 607 | tbFh = NULL; | 610 | tbSh = PATH_H_PBUFFER(tb->tb_path, h); | 
| 611 | tbFh = PATH_H_PPARENT(tb->tb_path, h); | ||
| 612 | } else { | ||
| 613 | tbSh = NULL; | ||
| 614 | tbFh = NULL; | ||
| 615 | } | ||
| 616 | sprintf(print_tb_buf + strlen(print_tb_buf), | ||
| 617 | "* %d * %3lld(%2d) * %3lld(%2d) * %3lld(%2d) * %5lld * %5lld * %5lld * %5lld * %5lld *\n", | ||
| 618 | h, | ||
| 619 | (tbSh) ? (long long)(tbSh->b_blocknr) : (-1LL), | ||
| 620 | (tbSh) ? atomic_read(&(tbSh->b_count)) : -1, | ||
| 621 | (tb->L[h]) ? (long long)(tb->L[h]->b_blocknr) : (-1LL), | ||
| 622 | (tb->L[h]) ? atomic_read(&(tb->L[h]->b_count)) : -1, | ||
| 623 | (tb->R[h]) ? (long long)(tb->R[h]->b_blocknr) : (-1LL), | ||
| 624 | (tb->R[h]) ? atomic_read(&(tb->R[h]->b_count)) : -1, | ||
| 625 | (tbFh) ? (long long)(tbFh->b_blocknr) : (-1LL), | ||
| 626 | (tb->FL[h]) ? (long long)(tb->FL[h]-> | ||
| 627 | b_blocknr) : (-1LL), | ||
| 628 | (tb->FR[h]) ? (long long)(tb->FR[h]-> | ||
| 629 | b_blocknr) : (-1LL), | ||
| 630 | (tb->CFL[h]) ? (long long)(tb->CFL[h]-> | ||
| 631 | b_blocknr) : (-1LL), | ||
| 632 | (tb->CFR[h]) ? (long long)(tb->CFR[h]-> | ||
| 633 | b_blocknr) : (-1LL)); | ||
| 608 | } | 634 | } | 
| 609 | sprintf (print_tb_buf + strlen (print_tb_buf), | ||
| 610 | "* %d * %3lld(%2d) * %3lld(%2d) * %3lld(%2d) * %5lld * %5lld * %5lld * %5lld * %5lld *\n", | ||
| 611 | h, | ||
| 612 | (tbSh) ? (long long)(tbSh->b_blocknr):(-1LL), | ||
| 613 | (tbSh) ? atomic_read (&(tbSh->b_count)) : -1, | ||
| 614 | (tb->L[h]) ? (long long)(tb->L[h]->b_blocknr):(-1LL), | ||
| 615 | (tb->L[h]) ? atomic_read (&(tb->L[h]->b_count)) : -1, | ||
| 616 | (tb->R[h]) ? (long long)(tb->R[h]->b_blocknr):(-1LL), | ||
| 617 | (tb->R[h]) ? atomic_read (&(tb->R[h]->b_count)) : -1, | ||
| 618 | (tbFh) ? (long long)(tbFh->b_blocknr):(-1LL), | ||
| 619 | (tb->FL[h]) ? (long long)(tb->FL[h]->b_blocknr):(-1LL), | ||
| 620 | (tb->FR[h]) ? (long long)(tb->FR[h]->b_blocknr):(-1LL), | ||
| 621 | (tb->CFL[h]) ? (long long)(tb->CFL[h]->b_blocknr):(-1LL), | ||
| 622 | (tb->CFR[h]) ? (long long)(tb->CFR[h]->b_blocknr):(-1LL)); | ||
| 623 | } | ||
| 624 | |||
| 625 | sprintf (print_tb_buf + strlen (print_tb_buf), | ||
| 626 | "=====================================================================\n" | ||
| 627 | "* h * size * ln * lb * rn * rb * blkn * s0 * s1 * s1b * s2 * s2b * curb * lk * rk *\n" | ||
| 628 | "* 0 * %4d * %2d * %2d * %2d * %2d * %4d * %2d * %2d * %3d * %2d * %3d * %4d * %2d * %2d *\n", | ||
| 629 | tb->insert_size[0], tb->lnum[0], tb->lbytes, tb->rnum[0],tb->rbytes, tb->blknum[0], | ||
| 630 | tb->s0num, tb->s1num,tb->s1bytes, tb->s2num, tb->s2bytes, tb->cur_blknum, tb->lkey[0], tb->rkey[0]); | ||
| 631 | |||
| 632 | /* this prints balance parameters for non-leaf levels */ | ||
| 633 | h = 0; | ||
| 634 | do { | ||
| 635 | h++; | ||
| 636 | sprintf (print_tb_buf + strlen (print_tb_buf), | ||
| 637 | "* %d * %4d * %2d * * %2d * * %2d *\n", | ||
| 638 | h, tb->insert_size[h], tb->lnum[h], tb->rnum[h], tb->blknum[h]); | ||
| 639 | } while (tb->insert_size[h]); | ||
| 640 | |||
| 641 | sprintf (print_tb_buf + strlen (print_tb_buf), | ||
| 642 | "=====================================================================\n" | ||
| 643 | "FEB list: "); | ||
| 644 | |||
| 645 | /* print FEB list (list of buffers in form (bh (b_blocknr, b_count), that will be used for new nodes) */ | ||
| 646 | h = 0; | ||
| 647 | for (i = 0; i < sizeof (tb->FEB) / sizeof (tb->FEB[0]); i ++) | ||
| 648 | sprintf (print_tb_buf + strlen (print_tb_buf), | ||
| 649 | "%p (%llu %d)%s", tb->FEB[i], tb->FEB[i] ? (unsigned long long)tb->FEB[i]->b_blocknr : 0ULL, | ||
| 650 | tb->FEB[i] ? atomic_read (&(tb->FEB[i]->b_count)) : 0, | ||
| 651 | (i == sizeof (tb->FEB) / sizeof (tb->FEB[0]) - 1) ? "\n" : ", "); | ||
| 652 | |||
| 653 | sprintf (print_tb_buf + strlen (print_tb_buf), | ||
| 654 | "======================== the end ====================================\n"); | ||
| 655 | } | ||
| 656 | |||
| 657 | void print_cur_tb (char * mes) | ||
| 658 | { | ||
| 659 | printk ("%s\n%s", mes, print_tb_buf); | ||
| 660 | } | ||
| 661 | |||
| 662 | static void check_leaf_block_head (struct buffer_head * bh) | ||
| 663 | { | ||
| 664 | struct block_head * blkh; | ||
| 665 | int nr; | ||
| 666 | |||
| 667 | blkh = B_BLK_HEAD (bh); | ||
| 668 | nr = blkh_nr_item(blkh); | ||
| 669 | if ( nr > (bh->b_size - BLKH_SIZE) / IH_SIZE) | ||
| 670 | reiserfs_panic (NULL, "vs-6010: check_leaf_block_head: invalid item number %z", bh); | ||
| 671 | if ( blkh_free_space(blkh) > | ||
| 672 | bh->b_size - BLKH_SIZE - IH_SIZE * nr ) | ||
| 673 | reiserfs_panic (NULL, "vs-6020: check_leaf_block_head: invalid free space %z", bh); | ||
| 674 | |||
| 675 | } | ||
| 676 | 635 | ||
| 677 | static void check_internal_block_head (struct buffer_head * bh) | 636 | sprintf(print_tb_buf + strlen(print_tb_buf), | 
| 678 | { | 637 | "=====================================================================\n" | 
| 679 | struct block_head * blkh; | 638 | "* h * size * ln * lb * rn * rb * blkn * s0 * s1 * s1b * s2 * s2b * curb * lk * rk *\n" | 
| 680 | 639 | "* 0 * %4d * %2d * %2d * %2d * %2d * %4d * %2d * %2d * %3d * %2d * %3d * %4d * %2d * %2d *\n", | |
| 681 | blkh = B_BLK_HEAD (bh); | 640 | tb->insert_size[0], tb->lnum[0], tb->lbytes, tb->rnum[0], | 
| 682 | if (!(B_LEVEL (bh) > DISK_LEAF_NODE_LEVEL && B_LEVEL (bh) <= MAX_HEIGHT)) | 641 | tb->rbytes, tb->blknum[0], tb->s0num, tb->s1num, tb->s1bytes, | 
| 683 | reiserfs_panic (NULL, "vs-6025: check_internal_block_head: invalid level %z", bh); | 642 | tb->s2num, tb->s2bytes, tb->cur_blknum, tb->lkey[0], | 
| 643 | tb->rkey[0]); | ||
| 644 | |||
| 645 | /* this prints balance parameters for non-leaf levels */ | ||
| 646 | h = 0; | ||
| 647 | do { | ||
| 648 | h++; | ||
| 649 | sprintf(print_tb_buf + strlen(print_tb_buf), | ||
| 650 | "* %d * %4d * %2d * * %2d * * %2d *\n", | ||
| 651 | h, tb->insert_size[h], tb->lnum[h], tb->rnum[h], | ||
| 652 | tb->blknum[h]); | ||
| 653 | } while (tb->insert_size[h]); | ||
| 684 | 654 | ||
| 685 | if (B_NR_ITEMS (bh) > (bh->b_size - BLKH_SIZE) / IH_SIZE) | 655 | sprintf(print_tb_buf + strlen(print_tb_buf), | 
| 686 | reiserfs_panic (NULL, "vs-6030: check_internal_block_head: invalid item number %z", bh); | 656 | "=====================================================================\n" | 
| 657 | "FEB list: "); | ||
| 687 | 658 | ||
| 688 | if (B_FREE_SPACE (bh) != | 659 | /* print FEB list (list of buffers in form (bh (b_blocknr, b_count), that will be used for new nodes) */ | 
| 689 | bh->b_size - BLKH_SIZE - KEY_SIZE * B_NR_ITEMS (bh) - DC_SIZE * (B_NR_ITEMS (bh) + 1)) | 660 | h = 0; | 
| 690 | reiserfs_panic (NULL, "vs-6040: check_internal_block_head: invalid free space %z", bh); | 661 | for (i = 0; i < sizeof(tb->FEB) / sizeof(tb->FEB[0]); i++) | 
| 662 | sprintf(print_tb_buf + strlen(print_tb_buf), | ||
| 663 | "%p (%llu %d)%s", tb->FEB[i], | ||
| 664 | tb->FEB[i] ? (unsigned long long)tb->FEB[i]-> | ||
| 665 | b_blocknr : 0ULL, | ||
| 666 | tb->FEB[i] ? atomic_read(&(tb->FEB[i]->b_count)) : 0, | ||
| 667 | (i == | ||
| 668 | sizeof(tb->FEB) / sizeof(tb->FEB[0]) - | ||
| 669 | 1) ? "\n" : ", "); | ||
| 691 | 670 | ||
| 671 | sprintf(print_tb_buf + strlen(print_tb_buf), | ||
| 672 | "======================== the end ====================================\n"); | ||
| 692 | } | 673 | } | 
| 693 | 674 | ||
| 675 | void print_cur_tb(char *mes) | ||
| 676 | { | ||
| 677 | printk("%s\n%s", mes, print_tb_buf); | ||
| 678 | } | ||
| 694 | 679 | ||
| 695 | void check_leaf (struct buffer_head * bh) | 680 | static void check_leaf_block_head(struct buffer_head *bh) | 
| 696 | { | 681 | { | 
| 697 | int i; | 682 | struct block_head *blkh; | 
| 698 | struct item_head * ih; | 683 | int nr; | 
| 684 | |||
| 685 | blkh = B_BLK_HEAD(bh); | ||
| 686 | nr = blkh_nr_item(blkh); | ||
| 687 | if (nr > (bh->b_size - BLKH_SIZE) / IH_SIZE) | ||
| 688 | reiserfs_panic(NULL, | ||
| 689 | "vs-6010: check_leaf_block_head: invalid item number %z", | ||
| 690 | bh); | ||
| 691 | if (blkh_free_space(blkh) > bh->b_size - BLKH_SIZE - IH_SIZE * nr) | ||
| 692 | reiserfs_panic(NULL, | ||
| 693 | "vs-6020: check_leaf_block_head: invalid free space %z", | ||
| 694 | bh); | ||
| 699 | 695 | ||
| 700 | if (!bh) | ||
| 701 | return; | ||
| 702 | check_leaf_block_head (bh); | ||
| 703 | for (i = 0, ih = B_N_PITEM_HEAD (bh, 0); i < B_NR_ITEMS (bh); i ++, ih ++) | ||
| 704 | op_check_item (ih, B_I_PITEM (bh, ih)); | ||
| 705 | } | 696 | } | 
| 706 | 697 | ||
| 698 | static void check_internal_block_head(struct buffer_head *bh) | ||
| 699 | { | ||
| 700 | struct block_head *blkh; | ||
| 701 | |||
| 702 | blkh = B_BLK_HEAD(bh); | ||
| 703 | if (!(B_LEVEL(bh) > DISK_LEAF_NODE_LEVEL && B_LEVEL(bh) <= MAX_HEIGHT)) | ||
| 704 | reiserfs_panic(NULL, | ||
| 705 | "vs-6025: check_internal_block_head: invalid level %z", | ||
| 706 | bh); | ||
| 707 | |||
| 708 | if (B_NR_ITEMS(bh) > (bh->b_size - BLKH_SIZE) / IH_SIZE) | ||
| 709 | reiserfs_panic(NULL, | ||
| 710 | "vs-6030: check_internal_block_head: invalid item number %z", | ||
| 711 | bh); | ||
| 712 | |||
| 713 | if (B_FREE_SPACE(bh) != | ||
| 714 | bh->b_size - BLKH_SIZE - KEY_SIZE * B_NR_ITEMS(bh) - | ||
| 715 | DC_SIZE * (B_NR_ITEMS(bh) + 1)) | ||
| 716 | reiserfs_panic(NULL, | ||
| 717 | "vs-6040: check_internal_block_head: invalid free space %z", | ||
| 718 | bh); | ||
| 719 | |||
| 720 | } | ||
| 707 | 721 | ||
| 708 | void check_internal (struct buffer_head * bh) | 722 | void check_leaf(struct buffer_head *bh) | 
| 709 | { | 723 | { | 
| 710 | if (!bh) | 724 | int i; | 
| 711 | return; | 725 | struct item_head *ih; | 
| 712 | check_internal_block_head (bh); | 726 | |
| 727 | if (!bh) | ||
| 728 | return; | ||
| 729 | check_leaf_block_head(bh); | ||
| 730 | for (i = 0, ih = B_N_PITEM_HEAD(bh, 0); i < B_NR_ITEMS(bh); i++, ih++) | ||
| 731 | op_check_item(ih, B_I_PITEM(bh, ih)); | ||
| 713 | } | 732 | } | 
| 714 | 733 | ||
| 734 | void check_internal(struct buffer_head *bh) | ||
| 735 | { | ||
| 736 | if (!bh) | ||
| 737 | return; | ||
| 738 | check_internal_block_head(bh); | ||
| 739 | } | ||
| 715 | 740 | ||
| 716 | void print_statistics (struct super_block * s) | 741 | void print_statistics(struct super_block *s) | 
| 717 | { | 742 | { | 
| 718 | 743 | ||
| 719 | /* | 744 | /* | 
| 720 | printk ("reiserfs_put_super: session statistics: balances %d, fix_nodes %d, \ | 745 | printk ("reiserfs_put_super: session statistics: balances %d, fix_nodes %d, \ | 
| 721 | bmap with search %d, without %d, dir2ind %d, ind2dir %d\n", | 746 | bmap with search %d, without %d, dir2ind %d, ind2dir %d\n", | 
| 722 | REISERFS_SB(s)->s_do_balance, REISERFS_SB(s)->s_fix_nodes, | 747 | REISERFS_SB(s)->s_do_balance, REISERFS_SB(s)->s_fix_nodes, | 
| 723 | REISERFS_SB(s)->s_bmaps, REISERFS_SB(s)->s_bmaps_without_search, | 748 | REISERFS_SB(s)->s_bmaps, REISERFS_SB(s)->s_bmaps_without_search, | 
| 724 | REISERFS_SB(s)->s_direct2indirect, REISERFS_SB(s)->s_indirect2direct); | 749 | REISERFS_SB(s)->s_direct2indirect, REISERFS_SB(s)->s_indirect2direct); | 
| 725 | */ | 750 | */ | 
| 726 | 751 | ||
| 727 | } | 752 | } | 
