3
* Copyright (c) International Business Machines Corp., 2000
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
13
* the GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
* FUNCTION: display/modify iag
28
#include "jfs_byteorder.h"
29
#include <jfs_xtree.h>
30
#include <jfs_filsys.h>
32
extern int64_t AIT_2nd_offset; /* Defined and assigned in xpeek.c */
35
extern uint32_t type_jfs;
36
extern void ujfs_swap_xtpage_t( xtpage_t * );
37
extern void ujfs_swap_iag_t( iag_t * );
39
int32_t change_iag(iag_t *);
40
int32_t display_ext(pxd_t *, char *);
41
int32_t display_map(uint32_t *, int32_t);
52
uint32_t which_table = FILESYSTEM_I;
54
token = strtok(0, " \n");
56
fputs("iag: Please enter: iagnum [ a | 0 ]\niag> ",stdout);
57
fgets(cmd_line, 80, stdin);
58
token=strtok(cmd_line, " \n");
63
iagnum = strtoul(token, 0, 0);
64
token = strtok(0, " \n");
67
which_table = AGGREGATE_I;
68
else if (token[0] == 's')
69
which_table = AGGREGATE_2ND_I;
70
else if (token[0] != '0') {
71
fputs("iag: invalide fileset\n\n", stderr);
75
if (strtok(0, " \n")) {
76
fputs("iag: Too many arguments\n\n", stderr);
80
if (find_iag(iagnum, which_table, &address) ||
81
xRead(address, sizeof(iag_t), (char *)&iag)) {
82
fputs("iag: error reading iag\n\n", stderr);
86
/* swap if on big endian machine */
87
if (type_jfs & JFS_SWAP_BYTES) {
88
ujfs_swap_iag_t( &iag );
90
block_num = address >> l2bsize;
93
printf("IAG %d at block %lld\n\n", iagnum, (long long)block_num);
95
if ((rc = change_iag(&iag)) == XPEEK_ERROR)
97
if (rc & XPEEK_CHANGED) {
98
/* swap if on big endian machine */
99
if (type_jfs & JFS_SWAP_BYTES) {
100
ujfs_swap_iag_t( &iag );
103
if (xWrite(address, sizeof(iag_t), (char *)&iag)) {
104
fputs("iag: error writing iag\n\n", stderr);
105
/* swap back if on big endian machine */
106
if (type_jfs & JFS_SWAP_BYTES) ujfs_swap_iag_t( &iag );
110
/* swap back if on big endian machine */
111
if (type_jfs & JFS_SWAP_BYTES) {
112
ujfs_swap_iag_t( &iag );
115
if (rc & XPEEK_REDISPLAY)
120
/****************************************************************************
121
************************ Sample output of display_iag()
125
[1] agstart: 25 [12] extsmap[0]: ffffffff
126
[2] iagnum: 0 [13] extsmap[1]: ffffffff
127
[3] inofreefwd: -1 [14] extsmap[2]: ffffe000
128
[4] inofreeback: -1 [15] extsmap[3]: 00000000
129
[5] extfreefwd: -1 [16] nfreeinos: 284
130
[6] extfreeback: -1 [17] nfreeexts: 45
131
[7] iagfree: -1 [18] pad: Not Displayed
132
[8] inosmap[0]: ffffffff [19] wmap: Type 'w'
133
[9] inosmap[1]: ffffffff [20] pmap: Type 'p'
134
[10] inosmap[2]: ff801fff [21] inoext: Type 'i'
135
[11] inosmap[3]: ffffffff
137
****************************************************************************/
139
void display_iag(iag_t *iag)
141
printf("[1] agstart:\t\t%lld\t\t", (long long)iag->agstart);
142
printf("[12] extsmap[0]:\t%08x\n", iag->extsmap[0]);
143
printf("[2] iagnum:\t\t%d\t\t", iag->iagnum);
144
printf("[13] extsmap[1]:\t%08x\n", iag->extsmap[1]);
145
printf("[3] inofreefwd:\t\t%d\t\t", iag->inofreefwd);
146
printf("[14] extsmap[2]:\t%08x\n", iag->extsmap[2]);
147
printf("[4] inofreeback:\t%d\t\t", iag->inofreeback);
148
printf("[15] extsmap[3]:\t%08x\n", iag->extsmap[3]);
149
printf("[5] extfreefwd:\t\t%d\t\t", iag->extfreefwd);
150
printf("[16] nfreeinos:\t\t%d\n", iag->nfreeinos);
151
printf("[6] extfreeback:\t%d\t\t", iag->extfreeback);
152
printf("[17] nfreeexts:\t\t%d\n", iag->nfreeexts);
153
printf("[7] iagfree:\t\t%d\t\t", iag->iagfree);
154
printf("[18] pad:\t\tNot Displayed\n");
155
printf("[8] inosmap[0]:\t\t%08x\t", iag->inosmap[0]);
156
printf("[19] wmap:\t\tType 'w'\n");
157
printf("[9] inosmap[1]:\t\t%08x\t", iag->inosmap[1]);
158
printf("[20] pmap:\t\tType 'p'\n");
159
printf("[10] inosmap[2]:\t%08x\t", iag->inosmap[2]);
160
printf("[21] inoext:\t\tType 'i'\n");
161
printf("[11] inosmap[3]:\t%08x\n", iag->inosmap[3]);
164
int32_t change_iag(iag_t *iag)
171
fputs("change_iag: [m]odify, [w]map, [p]map, [i]noext or e[x]it > ", stdout);
172
fgets(cmdline, 80, stdin);
173
token = strtok(cmdline, " \n");
174
if (token == 0 || token[0] == 'x')
177
return display_map(iag->wmap, EXTSPERIAG);
179
return display_map(iag->pmap, EXTSPERIAG);
180
if (token[0] == 'i') {
181
return display_ext(iag->inoext, cmdline);
183
field = m_parse(cmdline, 17, &token);
189
iag->agstart = strtoll(token, 0, 0);
192
iag->iagnum = strtol(token, 0, 0);
195
iag->inofreefwd = strtol(token, 0, 0);
198
iag->inofreeback = strtol(token, 0, 0);
201
iag->extfreefwd = strtol(token, 0, 0);
204
iag->extfreeback = strtol(token, 0, 0);
207
iag->iagfree = strtol(token, 0, 0);
210
iag->inosmap[0] = strtoul(token, 0, 16);
213
iag->inosmap[1] = strtoul(token, 0, 16);
216
iag->inosmap[2] = strtoul(token, 0, 16);
219
iag->inosmap[3] = strtoul(token, 0, 16);
222
iag->extsmap[0] = strtoul(token, 0, 16);
225
iag->extsmap[1] = strtoul(token, 0, 16);
228
iag->extsmap[2] = strtoul(token, 0, 16);
231
iag->extsmap[3] = strtoul(token, 0, 16);
234
iag->nfreeinos = strtol(token, 0, 0);
237
iag->nfreeexts = strtol(token, 0, 0);
240
return XPEEK_CHANGED | XPEEK_REDISPLAY;
243
#define XT_CMP(CMP, K, X) \
245
int64_t offset64 = offsetXAD(X); \
246
(CMP) = ((K) >= offset64 + lengthXAD(X)) ? 1 : \
247
((K) < offset64) ? -1 : 0 ; \
250
int32_t find_iag( uint32_t iagnum,
251
uint32_t which_table,
257
dinode_t fileset_inode;
258
int64_t fileset_inode_address;
265
if (which_table != FILESYSTEM_I &&
266
which_table != AGGREGATE_I &&
267
which_table != AGGREGATE_2ND_I) {
268
fprintf(stderr, "find_iag: Invalid fileset, %d\n", which_table);
271
iagblock = IAGTOLBLK(iagnum, L2PSIZE-l2bsize);
273
if ( which_table == AGGREGATE_2ND_I ) {
274
fileset_inode_address = AIT_2nd_offset + sizeof(dinode_t);
276
fileset_inode_address = AGGR_INODE_TABLE_START +
277
(which_table * sizeof(dinode_t));
279
rc = xRead(fileset_inode_address, sizeof(dinode_t),
280
(char *)&fileset_inode);
282
fputs("find_inode: Error reading fileset inode\n", stderr);
286
page = (xtpage_t *)&(fileset_inode.di_btroot);
290
for (base = XTENTRYSTART,
291
lim = __le16_to_cpu(page->header.nextindex) - XTENTRYSTART;
293
index = base + (lim >> 1);
294
XT_CMP(cmp, iagblock, &(page->xad[index]));
297
if (page->header.flag & BT_LEAF) {
298
*address = (addressXAD(&(page->xad[index]))
300
offsetXAD(&(page->xad[index]))))
304
rc = xRead( addressXAD(&(page->xad[index])) << l2bsize,
307
fputs("find_iag: Error reading btree node\n", stderr);
310
page = (xtpage_t *)buffer;
314
} else if (cmp > 0) {
320
if (page->header.flag & BT_INTERNAL ) {
321
/* Traverse internal page, it might hit down there
322
* If base is non-zero, decrement base by one to get the parent
323
* entry of the child page to search.
325
index = base ? base - 1 : base;
327
rc = xRead(addressXAD(&(page->xad[index])) << l2bsize, PSIZE,
330
fputs("find_iag: Error reading btree node\n", stderr);
333
page = (xtpage_t *)buffer;
339
fprintf(stderr, "find_iag: IAG %d not found!\n", iagnum);
343
/* display_map is also called from display_page in dmap.c */
345
int32_t display_map( uint32_t *map,
352
int32_t rc = XPEEK_OK;
357
end = MIN(start+128, size);
358
for (i = start; i < end; i+=8) {
359
if ((i+7) < 100) /* [i-(i+7)] fits in first field */
360
printf("[%d-%d]\t", i, i+7);
362
printf("[%d- ]\t", i);
364
printf("%08x %08x %08x %08x %08x %08x %08x %08x\n", map[i],
365
map[i+1],map[i+2],map[i+3],map[i+4],map[i+5],map[i+6],
369
fputs("display_map: [m]odify, [b]ack, e[x]it\n", stdout);
370
fgets(cmdline, 80, stdin);
371
token = strtok(cmdline, " \n");
373
start = (size > end)? end : 0;
378
if (token[0] != 'm') { /* assuming 'b' */
379
return(rc | XPEEK_REDISPLAY);
382
index = m_parse(cmdline, size-1, &token);
386
map[index] = strtoul(token, 0, 16);
391
int32_t display_ext( pxd_t *ext,
396
int32_t rc = XPEEK_OK;
399
token = strtok(0, " \n");
402
fputs("Please enter: index [0-127] > ",stdout);
403
fgets(cmdline, 80, stdin);
404
token = strtok(cmdline, " \n");
406
return rc | XPEEK_REDISPLAY;
409
index = strtol(token, 0, 0);
410
if (index < 0 || index >= EXTSPERIAG) {
411
fputs("Invalid index\n", stderr);
415
printf("[1] inoext[%d].len:\t%d\n", index, ext[index].len);
416
printf("[2] inoext[%d].addr1:\t0x%02x\n", index, ext[index].addr1);
417
printf("[3] inoext[%d].addr2:\t0x%08x\n", index, ext[index].addr2);
418
printf(" addressPXD:\t\t%lld\n", (long long)addressPXD(&ext[index]));
420
fputs("display_ext: [m]odify, ext [#], [b]ack to iag, e[x]it > ",
422
fgets(cmdline, 80, stdin);
423
token = strtok(cmdline, " \n");
424
if (token == 0 || token[0] == 'x')
426
if (isdigit(token[0]))
428
if (token[0] != 'm') /* assuming 'b' */
429
return rc | XPEEK_REDISPLAY;
431
field = m_parse(cmdline, 3, &token);
437
ext[index].len = strtol(token,0,0);
440
ext[index].addr1 = strtol(token,0,16);
443
ext[index].addr2 = strtol(token,0,16);