]>
git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blob - db/block.c
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
20 static int ablock_f(int argc
, char **argv
);
21 static void ablock_help(void);
22 static int daddr_f(int argc
, char **argv
);
23 static void daddr_help(void);
24 static int dblock_f(int argc
, char **argv
);
25 static void dblock_help(void);
26 static int fsblock_f(int argc
, char **argv
);
27 static void fsblock_help(void);
28 static void print_rawdata(void *data
, int len
);
30 static const cmdinfo_t ablock_cmd
=
31 { "ablock", NULL
, ablock_f
, 1, 1, 1, N_("filoff"),
32 N_("set address to file offset (attr fork)"), ablock_help
};
33 static const cmdinfo_t daddr_cmd
=
34 { "daddr", NULL
, daddr_f
, 0, 1, 1, N_("[d]"),
35 N_("set address to daddr value"), daddr_help
};
36 static const cmdinfo_t dblock_cmd
=
37 { "dblock", NULL
, dblock_f
, 1, 1, 1, N_("filoff"),
38 N_("set address to file offset (data fork)"), dblock_help
};
39 static const cmdinfo_t fsblock_cmd
=
40 { "fsblock", "fsb", fsblock_f
, 0, 1, 1, N_("[fsb]"),
41 N_("set address to fsblock value"), fsblock_help
};
49 " 'ablock 23' - sets the file position to the 23rd filesystem block in\n"
50 " the inode's attribute fork. The filesystem block size is specified in\n"
51 " the superblock.\n\n"
67 struct xfs_dinode
*dip
= iocur_top
->data
;
69 bno
= (xfs_fileoff_t
)strtoull(argv
[1], &p
, 0);
71 dbprintf(_("bad block number %s\n"), argv
[1]);
75 set_cur_inode(iocur_top
->ino
);
78 dbprintf(_("no current inode\n"));
81 haveattr
= dip
->di_forkoff
;
84 dbprintf(_("no attribute data for file\n"));
88 bmap(bno
, 1, XFS_ATTR_FORK
, &nex
, &bm
);
90 dbprintf(_("file attr block is unmapped\n"));
93 dfsbno
= bm
.startblock
+ (bno
- bm
.startoff
);
94 ASSERT(typtab
[TYP_ATTR
].typnm
== TYP_ATTR
);
95 set_cur(&typtab
[TYP_ATTR
], (int64_t)XFS_FSB_TO_DADDR(mp
, dfsbno
),
96 blkbb
, DB_RING_ADD
, NULL
);
103 add_command(&ablock_cmd
);
104 add_command(&daddr_cmd
);
105 add_command(&dblock_cmd
);
106 add_command(&fsblock_cmd
);
115 " 'daddr 102' - sets position to the 102nd absolute disk block\n"
116 " (512 byte block).\n"
129 xfs_daddr_t daddr
= iocur_top
->off
>> BBSHIFT
;
131 if (iocur_is_ddev(iocur_top
))
132 dbprintf(_("datadev daddr is %lld\n"), daddr
);
133 else if (iocur_is_extlogdev(iocur_top
))
134 dbprintf(_("logdev daddr is %lld\n"), daddr
);
136 dbprintf(_("current daddr is %lld\n"), daddr
);
140 d
= (int64_t)strtoull(argv
[1], &p
, 0);
142 d
>= mp
->m_sb
.sb_dblocks
<< (mp
->m_sb
.sb_blocklog
- BBSHIFT
)) {
143 dbprintf(_("bad daddr %s\n"), argv
[1]);
146 ASSERT(typtab
[TYP_DATA
].typnm
== TYP_DATA
);
147 set_cur(&typtab
[TYP_DATA
], d
, 1, DB_RING_ADD
, NULL
);
157 " 'dblock 23' - sets the file position to the 23rd filesystem block in\n"
158 " the inode's data fork. The filesystem block size is specified in the\n"
171 xfs_fsblock_t dfsbno
;
177 bno
= (xfs_fileoff_t
)strtoull(argv
[1], &p
, 0);
179 dbprintf(_("bad block number %s\n"), argv
[1]);
183 set_cur_inode(iocur_top
->ino
);
184 type
= inode_next_type();
186 if (type
== TYP_NONE
) {
187 dbprintf(_("no type for file data\n"));
190 nex
= nb
= type
== TYP_DIR2
? mp
->m_dir_geo
->fsbcount
: 1;
191 bmp
= malloc(nb
* sizeof(*bmp
));
192 bmap(bno
, nb
, XFS_DATA_FORK
, &nex
, bmp
);
194 dbprintf(_("file data block is unmapped\n"));
198 dfsbno
= bmp
->startblock
+ (bno
- bmp
->startoff
);
199 ASSERT(typtab
[type
].typnm
== type
);
201 make_bbmap(&bbmap
, nex
, bmp
);
202 set_cur(&typtab
[type
], (int64_t)XFS_FSB_TO_DADDR(mp
, dfsbno
),
203 nb
* blkbb
, DB_RING_ADD
, nex
> 1 ? &bbmap
: NULL
);
214 " 'fsblock 1023' - sets the file position to the 1023rd filesystem block.\n"
215 " The filesystem block size is specified in the superblock and set during\n"
216 " mkfs time. Offset is absolute (not AG relative).\n\n"
231 if (!iocur_is_ddev(iocur_top
)) {
232 dbprintf(_("cursor does not point to data device\n"));
235 dbprintf(_("current fsblock is %lld\n"),
236 XFS_DADDR_TO_FSB(mp
, iocur_top
->off
>> BBSHIFT
));
239 d
= strtoull(argv
[1], &p
, 0);
241 dbprintf(_("bad fsblock %s\n"), argv
[1]);
244 agno
= XFS_FSB_TO_AGNO(mp
, d
);
245 agbno
= XFS_FSB_TO_AGBNO(mp
, d
);
246 if (agno
>= mp
->m_sb
.sb_agcount
|| agbno
>= mp
->m_sb
.sb_agblocks
) {
247 dbprintf(_("bad fsblock %s\n"), argv
[1]);
250 ASSERT(typtab
[TYP_DATA
].typnm
== TYP_DATA
);
251 set_cur(&typtab
[TYP_DATA
], XFS_AGB_TO_DADDR(mp
, agno
, agbno
),
252 blkbb
, DB_RING_ADD
, NULL
);
258 const field_t
*fields
,
262 print_rawdata(iocur_top
->data
, iocur_top
->len
);
276 lastaddr
= (len
- 1) & ~(32 - 1);
279 else if (lastaddr
< 0x100)
281 else if (lastaddr
< 0x1000)
285 for (i
= 0, p
= data
; i
< len
; i
+= 32) {
286 dbprintf("%-0*.*x:", offchars
, offchars
, i
);
287 for (j
= 0; j
< 32 && i
+ j
< len
; j
++, p
++) {
290 dbprintf("%02x", *p
);