* [Cluster-devel] [gfs2-utils patch] gfs2_edit: Add "journals" option to print journal info
[not found] <124698110.6047985.1377871903018.JavaMail.root@redhat.com>
@ 2013-08-30 14:13 ` Bob Peterson
2013-08-30 14:22 ` Andrew Price
2013-09-04 14:58 ` Steven Whitehouse
0 siblings, 2 replies; 3+ messages in thread
From: Bob Peterson @ 2013-08-30 14:13 UTC (permalink / raw)
To: cluster-devel.redhat.com
Hi,
This patch adds a keyword "journals" to gfs2_edit. Its purpose is
to print information about the GFS2 journals: location, size, and
whether they're clean, dirty or damaged.
Example output:
# ./gfs2_edit -p journals /dev/mpathc/scratch
Block #Journal Status: of 536870912 (0x20000000)
-------------------- Journal List --------------------
journal0: 0x19 128MB dirty.
journal1: 0x805b 128MB clean.
journal2: 0x100a3 128MB dirty.
journal3: 0x180e5 128MB clean.
journal4: 0x2012e 128MB clean.
------------------------------------------------------
Regards,
Bob Peterson
Red Hat File Systems
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
---
diff --git a/gfs2/edit/extended.c b/gfs2/edit/extended.c
index 27c32a9..ac1e5d7 100644
--- a/gfs2/edit/extended.c
+++ b/gfs2/edit/extended.c
@@ -427,7 +427,7 @@ static void gfs_jindex_print(struct gfs_jindex *ji)
pv(ji, ji_pad, "%u", "0x%x");
}
-static int print_jindex(struct gfs2_inode *dij)
+static int print_gfs_jindex(struct gfs2_inode *dij)
{
int error, start_line;
struct gfs_jindex ji;
@@ -467,6 +467,35 @@ static int print_jindex(struct gfs2_inode *dij)
return error;
}
+static int print_gfs2_jindex(void)
+{
+ int d, error;
+ struct gfs2_log_header head;
+ struct gfs2_inode *ip;
+
+ for (d = 0; d < indirect->ii[0].dirents; d++) {
+ if (strncmp(indirect->ii[0].dirent[d].filename, "journal", 7))
+ continue;
+ ip = lgfs2_inode_read(&sbd, indirect->ii[0].dirent[d].block);
+ print_gfs2("%s: 0x%-5x %dMB ",
+ indirect->ii[0].dirent[d].filename,
+ indirect->ii[0].dirent[d].block,
+ ip->i_di.di_size / 1048576);
+ error = gfs2_find_jhead(ip, &head);
+ if (error) {
+ print_gfs2("corrupt.");
+ } else {
+ if (head.lh_flags & GFS2_LOG_HEAD_UNMOUNT)
+ print_gfs2("clean.");
+ else
+ print_gfs2("dirty.");
+ }
+ eol(0);
+ inode_put(&ip);
+ }
+ return 0;
+}
+
static int parse_rindex(struct gfs2_inode *dip, int print_rindex)
{
int error, start_line;
@@ -618,8 +647,13 @@ int display_extended(void)
parse_rindex(tmp_inode, TRUE);
inode_put(&tmp_inode);
brelse(tmp_bh);
- }
- else if (has_indirect_blocks() && !indirect_blocks &&
+ } else if (block_is_journals()) {
+ if (sbd.gfs1)
+ block = sbd1->sb_jindex_di.no_addr;
+ else
+ block = masterblock("jindex");
+ print_gfs2_jindex();
+ } else if (has_indirect_blocks() && !indirect_blocks &&
!display_leaf(indirect))
return -1;
else if (display_indirect(indirect, indirect_blocks, 0, 0) == 0)
@@ -635,13 +669,12 @@ int display_extended(void)
parse_rindex(tmp_inode, FALSE);
inode_put(&tmp_inode);
brelse(tmp_bh);
- }
- else if (block_is_jindex()) {
+ } else if (block_is_jindex()) {
tmp_bh = bread(&sbd, block);
tmp_inode = lgfs2_inode_get(&sbd, tmp_bh);
if (tmp_inode == NULL)
return -1;
- print_jindex(tmp_inode);
+ print_gfs_jindex(tmp_inode);
inode_put(&tmp_inode);
brelse(tmp_bh);
}
diff --git a/gfs2/edit/hexedit.c b/gfs2/edit/hexedit.c
index f0d9789..738dc4e 100644
--- a/gfs2/edit/hexedit.c
+++ b/gfs2/edit/hexedit.c
@@ -592,6 +592,8 @@ int display_block_type(int from_restore)
}
if (block == RGLIST_DUMMY_BLOCK)
print_gfs2("RG List ");
+ else if (block == JOURNALS_DUMMY_BLOCK)
+ print_gfs2("Journal Status: ");
else
print_gfs2("%lld (0x%llx)", block, block);
if (termlines) {
@@ -605,6 +607,9 @@ int display_block_type(int from_restore)
ret_type = GFS2_METATYPE_RG;
struct_len = sbd.gfs1 ? sizeof(struct gfs_rgrp) :
sizeof(struct gfs2_rgrp);
+ } else if (block == JOURNALS_DUMMY_BLOCK) {
+ ret_type = GFS2_METATYPE_DI;
+ struct_len = 0;
} else {
ret_type = get_block_type(bh);
switch (ret_type) {
@@ -777,6 +782,8 @@ int display_block_type(int from_restore)
print_gfs2("-------------- Master directory -----------------");
else if (!sbd.gfs1 && block == RGLIST_DUMMY_BLOCK)
print_gfs2("------------------ RG List ----------------------");
+ else if (!sbd.gfs1 && block == JOURNALS_DUMMY_BLOCK)
+ print_gfs2("-------------------- Journal List --------------------");
else {
if (sbd.gfs1) {
if (block == sbd1->sb_rindex_di.no_addr)
@@ -1215,6 +1222,7 @@ static int block_has_extended_info(void)
if (has_indirect_blocks() ||
block_is_rindex() ||
block_is_rgtree() ||
+ block_is_journals() ||
block_is_jindex() ||
block_is_inum_file() ||
block_is_statfs_file() ||
@@ -1334,6 +1342,11 @@ int display(int identify_only)
blk = sbd1->sb_rindex_di.no_addr;
else
blk = masterblock("rindex");
+ } else if (block == JOURNALS_DUMMY_BLOCK) {
+ if (sbd.gfs1)
+ blk = sbd1->sb_jindex_di.no_addr;
+ else
+ blk = masterblock("jindex");
} else
blk = block;
if (termlines) {
@@ -1400,6 +1413,7 @@ int display(int identify_only)
else if (gfs2_struct_type == GFS2_METATYPE_LF) { /* directory leaf */
do_leaf_extended(bh->b_data, indirect);
}
+
last_entry_onscreen[dmode] = 0;
if (dmode == EXTENDED_MODE && !block_has_extended_info())
dmode = HEX_MODE;
@@ -1415,9 +1429,10 @@ int display(int identify_only)
if (dmode == HEX_MODE) /* if hex display mode */
hexdump(dev_offset, (gfs2_struct_type == GFS2_METATYPE_DI)?
struct_len + di.di_size:sbd.bsize);
- else if (dmode == GFS2_MODE) /* if structure display */
- display_gfs2(); /* display the gfs2 structure */
- else
+ else if (dmode == GFS2_MODE) { /* if structure display */
+ if (block != JOURNALS_DUMMY_BLOCK)
+ display_gfs2(); /* display the gfs2 structure */
+ } else
display_extended(); /* display extended blocks */
/* No else here because display_extended can switch back to hex mode */
if (termlines)
@@ -1748,6 +1763,8 @@ uint64_t check_keywords(const char *kword)
rgnum = atoi(kword + 3);
blk = get_rg_addr(rgnum);
+ } else if (!strncmp(kword, "journals", 8)) {
+ blk = JOURNALS_DUMMY_BLOCK;
} else if (!strncmp(kword, "journal", 7) && isdigit(kword[7])) {
uint64_t j_size;
@@ -1783,7 +1800,8 @@ static uint64_t goto_block(void)
temp_blk = block + delta;
}
- if (temp_blk == RGLIST_DUMMY_BLOCK || temp_blk < max_block) {
+ if (temp_blk == RGLIST_DUMMY_BLOCK ||
+ temp_blk == JOURNALS_DUMMY_BLOCK || temp_blk < max_block) {
offset = 0;
block = temp_blk;
push_block(block);
@@ -2832,6 +2850,7 @@ static void usage(void)
fprintf(stderr," master - prints the master directory.\n");
fprintf(stderr," root - prints the root directory.\n");
fprintf(stderr," jindex - prints the journal index directory.\n");
+ fprintf(stderr," journals - prints the journal status.\n");
fprintf(stderr," per_node - prints the per_node directory.\n");
fprintf(stderr," inum - prints the inum file.\n");
fprintf(stderr," statfs - prints the statfs file.\n");
diff --git a/gfs2/edit/hexedit.h b/gfs2/edit/hexedit.h
index 706909c..21cf70a 100644
--- a/gfs2/edit/hexedit.h
+++ b/gfs2/edit/hexedit.h
@@ -25,6 +25,7 @@ enum dsp_mode { HEX_MODE = 0, GFS2_MODE = 1, EXTENDED_MODE = 2, INIT_MODE = 3 };
print_it(" "#member, fmt, fmt2, struct->member); \
} while (FALSE);
#define RGLIST_DUMMY_BLOCK -2
+#define JOURNALS_DUMMY_BLOCK -3
extern struct gfs2_sb sb;
extern uint64_t block;
@@ -121,6 +122,13 @@ static inline int block_is_rgtree(void)
return FALSE;
}
+static inline int block_is_journals(void)
+{
+ if (block == JOURNALS_DUMMY_BLOCK)
+ return TRUE;
+ return FALSE;
+}
+
#define SCREEN_HEIGHT (16)
#define SCREEN_WIDTH (16)
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [Cluster-devel] [gfs2-utils patch] gfs2_edit: Add "journals" option to print journal info
2013-08-30 14:13 ` [Cluster-devel] [gfs2-utils patch] gfs2_edit: Add "journals" option to print journal info Bob Peterson
@ 2013-08-30 14:22 ` Andrew Price
2013-09-04 14:58 ` Steven Whitehouse
1 sibling, 0 replies; 3+ messages in thread
From: Andrew Price @ 2013-08-30 14:22 UTC (permalink / raw)
To: cluster-devel.redhat.com
Hi Bob,
On 30/08/13 15:13, Bob Peterson wrote:
> Hi,
>
> This patch adds a keyword "journals" to gfs2_edit. Its purpose is
> to print information about the GFS2 journals: location, size, and
> whether they're clean, dirty or damaged.
>
> Example output:
>
> # ./gfs2_edit -p journals /dev/mpathc/scratch
> Block #Journal Status: of 536870912 (0x20000000)
> -------------------- Journal List --------------------
> journal0: 0x19 128MB dirty.
> journal1: 0x805b 128MB clean.
> journal2: 0x100a3 128MB dirty.
> journal3: 0x180e5 128MB clean.
> journal4: 0x2012e 128MB clean.
> ------------------------------------------------------
Looks good to me. ACK.
Thanks,
Andy
> Regards,
>
> Bob Peterson
> Red Hat File Systems
>
> Signed-off-by: Bob Peterson <rpeterso@redhat.com>
> ---
> diff --git a/gfs2/edit/extended.c b/gfs2/edit/extended.c
> index 27c32a9..ac1e5d7 100644
> --- a/gfs2/edit/extended.c
> +++ b/gfs2/edit/extended.c
> @@ -427,7 +427,7 @@ static void gfs_jindex_print(struct gfs_jindex *ji)
> pv(ji, ji_pad, "%u", "0x%x");
> }
>
> -static int print_jindex(struct gfs2_inode *dij)
> +static int print_gfs_jindex(struct gfs2_inode *dij)
> {
> int error, start_line;
> struct gfs_jindex ji;
> @@ -467,6 +467,35 @@ static int print_jindex(struct gfs2_inode *dij)
> return error;
> }
>
> +static int print_gfs2_jindex(void)
> +{
> + int d, error;
> + struct gfs2_log_header head;
> + struct gfs2_inode *ip;
> +
> + for (d = 0; d < indirect->ii[0].dirents; d++) {
> + if (strncmp(indirect->ii[0].dirent[d].filename, "journal", 7))
> + continue;
> + ip = lgfs2_inode_read(&sbd, indirect->ii[0].dirent[d].block);
> + print_gfs2("%s: 0x%-5x %dMB ",
> + indirect->ii[0].dirent[d].filename,
> + indirect->ii[0].dirent[d].block,
> + ip->i_di.di_size / 1048576);
> + error = gfs2_find_jhead(ip, &head);
> + if (error) {
> + print_gfs2("corrupt.");
> + } else {
> + if (head.lh_flags & GFS2_LOG_HEAD_UNMOUNT)
> + print_gfs2("clean.");
> + else
> + print_gfs2("dirty.");
> + }
> + eol(0);
> + inode_put(&ip);
> + }
> + return 0;
> +}
> +
> static int parse_rindex(struct gfs2_inode *dip, int print_rindex)
> {
> int error, start_line;
> @@ -618,8 +647,13 @@ int display_extended(void)
> parse_rindex(tmp_inode, TRUE);
> inode_put(&tmp_inode);
> brelse(tmp_bh);
> - }
> - else if (has_indirect_blocks() && !indirect_blocks &&
> + } else if (block_is_journals()) {
> + if (sbd.gfs1)
> + block = sbd1->sb_jindex_di.no_addr;
> + else
> + block = masterblock("jindex");
> + print_gfs2_jindex();
> + } else if (has_indirect_blocks() && !indirect_blocks &&
> !display_leaf(indirect))
> return -1;
> else if (display_indirect(indirect, indirect_blocks, 0, 0) == 0)
> @@ -635,13 +669,12 @@ int display_extended(void)
> parse_rindex(tmp_inode, FALSE);
> inode_put(&tmp_inode);
> brelse(tmp_bh);
> - }
> - else if (block_is_jindex()) {
> + } else if (block_is_jindex()) {
> tmp_bh = bread(&sbd, block);
> tmp_inode = lgfs2_inode_get(&sbd, tmp_bh);
> if (tmp_inode == NULL)
> return -1;
> - print_jindex(tmp_inode);
> + print_gfs_jindex(tmp_inode);
> inode_put(&tmp_inode);
> brelse(tmp_bh);
> }
> diff --git a/gfs2/edit/hexedit.c b/gfs2/edit/hexedit.c
> index f0d9789..738dc4e 100644
> --- a/gfs2/edit/hexedit.c
> +++ b/gfs2/edit/hexedit.c
> @@ -592,6 +592,8 @@ int display_block_type(int from_restore)
> }
> if (block == RGLIST_DUMMY_BLOCK)
> print_gfs2("RG List ");
> + else if (block == JOURNALS_DUMMY_BLOCK)
> + print_gfs2("Journal Status: ");
> else
> print_gfs2("%lld (0x%llx)", block, block);
> if (termlines) {
> @@ -605,6 +607,9 @@ int display_block_type(int from_restore)
> ret_type = GFS2_METATYPE_RG;
> struct_len = sbd.gfs1 ? sizeof(struct gfs_rgrp) :
> sizeof(struct gfs2_rgrp);
> + } else if (block == JOURNALS_DUMMY_BLOCK) {
> + ret_type = GFS2_METATYPE_DI;
> + struct_len = 0;
> } else {
> ret_type = get_block_type(bh);
> switch (ret_type) {
> @@ -777,6 +782,8 @@ int display_block_type(int from_restore)
> print_gfs2("-------------- Master directory -----------------");
> else if (!sbd.gfs1 && block == RGLIST_DUMMY_BLOCK)
> print_gfs2("------------------ RG List ----------------------");
> + else if (!sbd.gfs1 && block == JOURNALS_DUMMY_BLOCK)
> + print_gfs2("-------------------- Journal List --------------------");
> else {
> if (sbd.gfs1) {
> if (block == sbd1->sb_rindex_di.no_addr)
> @@ -1215,6 +1222,7 @@ static int block_has_extended_info(void)
> if (has_indirect_blocks() ||
> block_is_rindex() ||
> block_is_rgtree() ||
> + block_is_journals() ||
> block_is_jindex() ||
> block_is_inum_file() ||
> block_is_statfs_file() ||
> @@ -1334,6 +1342,11 @@ int display(int identify_only)
> blk = sbd1->sb_rindex_di.no_addr;
> else
> blk = masterblock("rindex");
> + } else if (block == JOURNALS_DUMMY_BLOCK) {
> + if (sbd.gfs1)
> + blk = sbd1->sb_jindex_di.no_addr;
> + else
> + blk = masterblock("jindex");
> } else
> blk = block;
> if (termlines) {
> @@ -1400,6 +1413,7 @@ int display(int identify_only)
> else if (gfs2_struct_type == GFS2_METATYPE_LF) { /* directory leaf */
> do_leaf_extended(bh->b_data, indirect);
> }
> +
> last_entry_onscreen[dmode] = 0;
> if (dmode == EXTENDED_MODE && !block_has_extended_info())
> dmode = HEX_MODE;
> @@ -1415,9 +1429,10 @@ int display(int identify_only)
> if (dmode == HEX_MODE) /* if hex display mode */
> hexdump(dev_offset, (gfs2_struct_type == GFS2_METATYPE_DI)?
> struct_len + di.di_size:sbd.bsize);
> - else if (dmode == GFS2_MODE) /* if structure display */
> - display_gfs2(); /* display the gfs2 structure */
> - else
> + else if (dmode == GFS2_MODE) { /* if structure display */
> + if (block != JOURNALS_DUMMY_BLOCK)
> + display_gfs2(); /* display the gfs2 structure */
> + } else
> display_extended(); /* display extended blocks */
> /* No else here because display_extended can switch back to hex mode */
> if (termlines)
> @@ -1748,6 +1763,8 @@ uint64_t check_keywords(const char *kword)
>
> rgnum = atoi(kword + 3);
> blk = get_rg_addr(rgnum);
> + } else if (!strncmp(kword, "journals", 8)) {
> + blk = JOURNALS_DUMMY_BLOCK;
> } else if (!strncmp(kword, "journal", 7) && isdigit(kword[7])) {
> uint64_t j_size;
>
> @@ -1783,7 +1800,8 @@ static uint64_t goto_block(void)
> temp_blk = block + delta;
> }
>
> - if (temp_blk == RGLIST_DUMMY_BLOCK || temp_blk < max_block) {
> + if (temp_blk == RGLIST_DUMMY_BLOCK ||
> + temp_blk == JOURNALS_DUMMY_BLOCK || temp_blk < max_block) {
> offset = 0;
> block = temp_blk;
> push_block(block);
> @@ -2832,6 +2850,7 @@ static void usage(void)
> fprintf(stderr," master - prints the master directory.\n");
> fprintf(stderr," root - prints the root directory.\n");
> fprintf(stderr," jindex - prints the journal index directory.\n");
> + fprintf(stderr," journals - prints the journal status.\n");
> fprintf(stderr," per_node - prints the per_node directory.\n");
> fprintf(stderr," inum - prints the inum file.\n");
> fprintf(stderr," statfs - prints the statfs file.\n");
> diff --git a/gfs2/edit/hexedit.h b/gfs2/edit/hexedit.h
> index 706909c..21cf70a 100644
> --- a/gfs2/edit/hexedit.h
> +++ b/gfs2/edit/hexedit.h
> @@ -25,6 +25,7 @@ enum dsp_mode { HEX_MODE = 0, GFS2_MODE = 1, EXTENDED_MODE = 2, INIT_MODE = 3 };
> print_it(" "#member, fmt, fmt2, struct->member); \
> } while (FALSE);
> #define RGLIST_DUMMY_BLOCK -2
> +#define JOURNALS_DUMMY_BLOCK -3
>
> extern struct gfs2_sb sb;
> extern uint64_t block;
> @@ -121,6 +122,13 @@ static inline int block_is_rgtree(void)
> return FALSE;
> }
>
> +static inline int block_is_journals(void)
> +{
> + if (block == JOURNALS_DUMMY_BLOCK)
> + return TRUE;
> + return FALSE;
> +}
> +
> #define SCREEN_HEIGHT (16)
> #define SCREEN_WIDTH (16)
>
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* [Cluster-devel] [gfs2-utils patch] gfs2_edit: Add "journals" option to print journal info
2013-08-30 14:13 ` [Cluster-devel] [gfs2-utils patch] gfs2_edit: Add "journals" option to print journal info Bob Peterson
2013-08-30 14:22 ` Andrew Price
@ 2013-09-04 14:58 ` Steven Whitehouse
1 sibling, 0 replies; 3+ messages in thread
From: Steven Whitehouse @ 2013-09-04 14:58 UTC (permalink / raw)
To: cluster-devel.redhat.com
On Fri, 2013-08-30 at 10:13 -0400, Bob Peterson wrote:
> Hi,
>
> This patch adds a keyword "journals" to gfs2_edit. Its purpose is
> to print information about the GFS2 journals: location, size, and
> whether they're clean, dirty or damaged.
>
> Example output:
>
Looks good to me. I wonder whether an FIEMAP type interface would also
be useful (not just for journals, but for any inode)
Steve.
> # ./gfs2_edit -p journals /dev/mpathc/scratch
> Block #Journal Status: of 536870912 (0x20000000)
> -------------------- Journal List --------------------
> journal0: 0x19 128MB dirty.
> journal1: 0x805b 128MB clean.
> journal2: 0x100a3 128MB dirty.
> journal3: 0x180e5 128MB clean.
> journal4: 0x2012e 128MB clean.
> ------------------------------------------------------
>
> Regards,
>
> Bob Peterson
> Red Hat File Systems
>
> Signed-off-by: Bob Peterson <rpeterso@redhat.com>
> ---
> diff --git a/gfs2/edit/extended.c b/gfs2/edit/extended.c
> index 27c32a9..ac1e5d7 100644
> --- a/gfs2/edit/extended.c
> +++ b/gfs2/edit/extended.c
> @@ -427,7 +427,7 @@ static void gfs_jindex_print(struct gfs_jindex *ji)
> pv(ji, ji_pad, "%u", "0x%x");
> }
>
> -static int print_jindex(struct gfs2_inode *dij)
> +static int print_gfs_jindex(struct gfs2_inode *dij)
> {
> int error, start_line;
> struct gfs_jindex ji;
> @@ -467,6 +467,35 @@ static int print_jindex(struct gfs2_inode *dij)
> return error;
> }
>
> +static int print_gfs2_jindex(void)
> +{
> + int d, error;
> + struct gfs2_log_header head;
> + struct gfs2_inode *ip;
> +
> + for (d = 0; d < indirect->ii[0].dirents; d++) {
> + if (strncmp(indirect->ii[0].dirent[d].filename, "journal", 7))
> + continue;
> + ip = lgfs2_inode_read(&sbd, indirect->ii[0].dirent[d].block);
> + print_gfs2("%s: 0x%-5x %dMB ",
> + indirect->ii[0].dirent[d].filename,
> + indirect->ii[0].dirent[d].block,
> + ip->i_di.di_size / 1048576);
> + error = gfs2_find_jhead(ip, &head);
> + if (error) {
> + print_gfs2("corrupt.");
> + } else {
> + if (head.lh_flags & GFS2_LOG_HEAD_UNMOUNT)
> + print_gfs2("clean.");
> + else
> + print_gfs2("dirty.");
> + }
> + eol(0);
> + inode_put(&ip);
> + }
> + return 0;
> +}
> +
> static int parse_rindex(struct gfs2_inode *dip, int print_rindex)
> {
> int error, start_line;
> @@ -618,8 +647,13 @@ int display_extended(void)
> parse_rindex(tmp_inode, TRUE);
> inode_put(&tmp_inode);
> brelse(tmp_bh);
> - }
> - else if (has_indirect_blocks() && !indirect_blocks &&
> + } else if (block_is_journals()) {
> + if (sbd.gfs1)
> + block = sbd1->sb_jindex_di.no_addr;
> + else
> + block = masterblock("jindex");
> + print_gfs2_jindex();
> + } else if (has_indirect_blocks() && !indirect_blocks &&
> !display_leaf(indirect))
> return -1;
> else if (display_indirect(indirect, indirect_blocks, 0, 0) == 0)
> @@ -635,13 +669,12 @@ int display_extended(void)
> parse_rindex(tmp_inode, FALSE);
> inode_put(&tmp_inode);
> brelse(tmp_bh);
> - }
> - else if (block_is_jindex()) {
> + } else if (block_is_jindex()) {
> tmp_bh = bread(&sbd, block);
> tmp_inode = lgfs2_inode_get(&sbd, tmp_bh);
> if (tmp_inode == NULL)
> return -1;
> - print_jindex(tmp_inode);
> + print_gfs_jindex(tmp_inode);
> inode_put(&tmp_inode);
> brelse(tmp_bh);
> }
> diff --git a/gfs2/edit/hexedit.c b/gfs2/edit/hexedit.c
> index f0d9789..738dc4e 100644
> --- a/gfs2/edit/hexedit.c
> +++ b/gfs2/edit/hexedit.c
> @@ -592,6 +592,8 @@ int display_block_type(int from_restore)
> }
> if (block == RGLIST_DUMMY_BLOCK)
> print_gfs2("RG List ");
> + else if (block == JOURNALS_DUMMY_BLOCK)
> + print_gfs2("Journal Status: ");
> else
> print_gfs2("%lld (0x%llx)", block, block);
> if (termlines) {
> @@ -605,6 +607,9 @@ int display_block_type(int from_restore)
> ret_type = GFS2_METATYPE_RG;
> struct_len = sbd.gfs1 ? sizeof(struct gfs_rgrp) :
> sizeof(struct gfs2_rgrp);
> + } else if (block == JOURNALS_DUMMY_BLOCK) {
> + ret_type = GFS2_METATYPE_DI;
> + struct_len = 0;
> } else {
> ret_type = get_block_type(bh);
> switch (ret_type) {
> @@ -777,6 +782,8 @@ int display_block_type(int from_restore)
> print_gfs2("-------------- Master directory -----------------");
> else if (!sbd.gfs1 && block == RGLIST_DUMMY_BLOCK)
> print_gfs2("------------------ RG List ----------------------");
> + else if (!sbd.gfs1 && block == JOURNALS_DUMMY_BLOCK)
> + print_gfs2("-------------------- Journal List --------------------");
> else {
> if (sbd.gfs1) {
> if (block == sbd1->sb_rindex_di.no_addr)
> @@ -1215,6 +1222,7 @@ static int block_has_extended_info(void)
> if (has_indirect_blocks() ||
> block_is_rindex() ||
> block_is_rgtree() ||
> + block_is_journals() ||
> block_is_jindex() ||
> block_is_inum_file() ||
> block_is_statfs_file() ||
> @@ -1334,6 +1342,11 @@ int display(int identify_only)
> blk = sbd1->sb_rindex_di.no_addr;
> else
> blk = masterblock("rindex");
> + } else if (block == JOURNALS_DUMMY_BLOCK) {
> + if (sbd.gfs1)
> + blk = sbd1->sb_jindex_di.no_addr;
> + else
> + blk = masterblock("jindex");
> } else
> blk = block;
> if (termlines) {
> @@ -1400,6 +1413,7 @@ int display(int identify_only)
> else if (gfs2_struct_type == GFS2_METATYPE_LF) { /* directory leaf */
> do_leaf_extended(bh->b_data, indirect);
> }
> +
> last_entry_onscreen[dmode] = 0;
> if (dmode == EXTENDED_MODE && !block_has_extended_info())
> dmode = HEX_MODE;
> @@ -1415,9 +1429,10 @@ int display(int identify_only)
> if (dmode == HEX_MODE) /* if hex display mode */
> hexdump(dev_offset, (gfs2_struct_type == GFS2_METATYPE_DI)?
> struct_len + di.di_size:sbd.bsize);
> - else if (dmode == GFS2_MODE) /* if structure display */
> - display_gfs2(); /* display the gfs2 structure */
> - else
> + else if (dmode == GFS2_MODE) { /* if structure display */
> + if (block != JOURNALS_DUMMY_BLOCK)
> + display_gfs2(); /* display the gfs2 structure */
> + } else
> display_extended(); /* display extended blocks */
> /* No else here because display_extended can switch back to hex mode */
> if (termlines)
> @@ -1748,6 +1763,8 @@ uint64_t check_keywords(const char *kword)
>
> rgnum = atoi(kword + 3);
> blk = get_rg_addr(rgnum);
> + } else if (!strncmp(kword, "journals", 8)) {
> + blk = JOURNALS_DUMMY_BLOCK;
> } else if (!strncmp(kword, "journal", 7) && isdigit(kword[7])) {
> uint64_t j_size;
>
> @@ -1783,7 +1800,8 @@ static uint64_t goto_block(void)
> temp_blk = block + delta;
> }
>
> - if (temp_blk == RGLIST_DUMMY_BLOCK || temp_blk < max_block) {
> + if (temp_blk == RGLIST_DUMMY_BLOCK ||
> + temp_blk == JOURNALS_DUMMY_BLOCK || temp_blk < max_block) {
> offset = 0;
> block = temp_blk;
> push_block(block);
> @@ -2832,6 +2850,7 @@ static void usage(void)
> fprintf(stderr," master - prints the master directory.\n");
> fprintf(stderr," root - prints the root directory.\n");
> fprintf(stderr," jindex - prints the journal index directory.\n");
> + fprintf(stderr," journals - prints the journal status.\n");
> fprintf(stderr," per_node - prints the per_node directory.\n");
> fprintf(stderr," inum - prints the inum file.\n");
> fprintf(stderr," statfs - prints the statfs file.\n");
> diff --git a/gfs2/edit/hexedit.h b/gfs2/edit/hexedit.h
> index 706909c..21cf70a 100644
> --- a/gfs2/edit/hexedit.h
> +++ b/gfs2/edit/hexedit.h
> @@ -25,6 +25,7 @@ enum dsp_mode { HEX_MODE = 0, GFS2_MODE = 1, EXTENDED_MODE = 2, INIT_MODE = 3 };
> print_it(" "#member, fmt, fmt2, struct->member); \
> } while (FALSE);
> #define RGLIST_DUMMY_BLOCK -2
> +#define JOURNALS_DUMMY_BLOCK -3
>
> extern struct gfs2_sb sb;
> extern uint64_t block;
> @@ -121,6 +122,13 @@ static inline int block_is_rgtree(void)
> return FALSE;
> }
>
> +static inline int block_is_journals(void)
> +{
> + if (block == JOURNALS_DUMMY_BLOCK)
> + return TRUE;
> + return FALSE;
> +}
> +
> #define SCREEN_HEIGHT (16)
> #define SCREEN_WIDTH (16)
>
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2013-09-04 14:58 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <124698110.6047985.1377871903018.JavaMail.root@redhat.com>
2013-08-30 14:13 ` [Cluster-devel] [gfs2-utils patch] gfs2_edit: Add "journals" option to print journal info Bob Peterson
2013-08-30 14:22 ` Andrew Price
2013-09-04 14:58 ` Steven Whitehouse
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.