From: rpeterso@sourceware.org <rpeterso@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] cluster/gfs2 edit/hexedit.c man/gfs2_edit.8
Date: 12 Oct 2007 21:38:19 -0000 [thread overview]
Message-ID: <20071012213819.12411.qmail@sourceware.org> (raw)
CVSROOT: /cvs/cluster
Module name: cluster
Changes by: rpeterso at sourceware.org 2007-10-12 21:38:18
Modified files:
gfs2/edit : hexedit.c
gfs2/man : gfs2_edit.8
Log message:
Resolves: 235931: gfs2_edit command to set NOALLOC flag
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/edit/hexedit.c.diff?cvsroot=cluster&r1=1.20&r2=1.21
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/man/gfs2_edit.8.diff?cvsroot=cluster&r1=1.2&r2=1.3
--- cluster/gfs2/edit/hexedit.c 2007/10/12 15:37:19 1.20
+++ cluster/gfs2/edit/hexedit.c 2007/10/12 21:38:18 1.21
@@ -602,6 +602,98 @@
}
/* ------------------------------------------------------------------------ */
+/* rgcount - return how many rgrps there are. */
+/* ------------------------------------------------------------------------ */
+void rgcount(void)
+{
+ uint64_t block;
+ struct gfs2_buffer_head *ribh;
+ struct gfs2_inode *riinode;
+
+ if (gfs1)
+ block = sbd1->sb_rindex_di.no_addr;
+ else
+ block = masterblock("rindex");
+ ribh = bread(&sbd, block);
+ riinode = inode_get(&sbd, ribh);
+ printf("%d RGs in this file system.\n",
+ riinode->i_di.di_size / sizeof(struct gfs2_rindex));
+ inode_put(riinode, not_updated);
+ exit(EXIT_SUCCESS);
+}
+
+/* ------------------------------------------------------------------------ */
+/* find_rgrp_block - locate the block for a given rgrp number */
+/* ------------------------------------------------------------------------ */
+uint64_t find_rgrp_block(struct gfs2_inode *di, int rg)
+{
+ char buf[sizeof(struct gfs2_rindex)];
+ int amt;
+ struct gfs2_rindex ri;
+
+ amt = gfs2_readi(di, (void *)&buf,
+ rg * sizeof(struct gfs2_rindex),
+ sizeof(struct gfs2_rindex));
+ if (!amt) /* end of file */
+ return 0;
+ gfs2_rindex_in(&ri, buf);
+ return ri.ri_addr;
+}
+
+/* ------------------------------------------------------------------------ */
+/* set_rgrp_flags - Set an rgrp's flags to a given value */
+/* rgnum: which rg to print or modify flags for (0 - X) */
+/* new_flags: value to set new rg_flags to (if modify == TRUE) */
+/* modify: TRUE if the value is to be modified, FALSE if it's to be printed */
+/* full: TRUE if the full RG should be printed. */
+/* ------------------------------------------------------------------------ */
+void set_rgrp_flags(int rgnum, uint32_t new_flags, int modify, int full)
+{
+ struct gfs2_rgrp rg;
+ struct gfs2_buffer_head *bh, *ribh;
+ uint64_t rgblk, block;
+ struct gfs2_inode *riinode;
+
+ if (gfs1)
+ block = sbd1->sb_rindex_di.no_addr;
+ else
+ block = masterblock("rindex");
+ ribh = bread(&sbd, block);
+ riinode = inode_get(&sbd, ribh);
+ if (rgnum >= riinode->i_di.di_size / sizeof(struct gfs2_rindex)) {
+ fprintf(stderr, "Error: File system only has %d RGs.\n",
+ riinode->i_di.di_size / sizeof(struct gfs2_rindex));
+ inode_put(riinode, not_updated);
+ brelse(ribh, not_updated);
+ return;
+ }
+ rgblk = find_rgrp_block(riinode, rgnum);
+ bh = bread(&sbd, rgblk);
+ gfs2_rgrp_in(&rg, bh->b_data);
+ if (modify) {
+ printf("RG #%d (block %lld / 0x%llx) rg_flags changed from 0x%08x to 0x%08x\n",
+ rgnum, rgblk, rgblk, rg.rg_flags, new_flags);
+ rg.rg_flags = new_flags;
+ gfs2_rgrp_out(&rg, bh->b_data);
+ brelse(bh, updated);
+ } else {
+ if (full) {
+ print_gfs2("RG #%d", rgnum);
+ print_gfs2(" located at: %llu (0x%llx)", rgblk, rgblk);
+ eol(0);
+ gfs2_rgrp_print(&rg);
+ }
+ else
+ printf("RG #%d (block %lld / 0x%llx) rg_flags = 0x%08x\n",
+ rgnum, rgblk, rgblk, rg.rg_flags);
+ brelse(bh, not_updated);
+ }
+ inode_put(riinode, not_updated);
+ if (modify)
+ bsync(&sbd);
+}
+
+/* ------------------------------------------------------------------------ */
/* parse_rindex - print the rgindex file. */
/* ------------------------------------------------------------------------ */
int parse_rindex(struct gfs2_inode *di, int print_rindex)
@@ -622,9 +714,9 @@
error = gfs2_readi(di, (void *)&buf,
print_entry_ndx * sizeof(struct gfs2_rindex),
sizeof(struct gfs2_rindex));
- gfs2_rindex_in(&ri, buf);
if (!error) /* end of file */
break;
+ gfs2_rindex_in(&ri, buf);
if (!termlines ||
(print_entry_ndx >= start_row[dmode] &&
((print_entry_ndx - start_row[dmode])+1) * lines_per_row[dmode] <=
@@ -1994,6 +2086,8 @@
fprintf(stderr,"savemeta - save off your metadata for analysis and debugging. The intelligent way (assume bitmap is correct).\n");
fprintf(stderr,"savemetaslow - save off your metadata for analysis and debugging. The SLOW way (block by block).\n");
fprintf(stderr,"restoremeta - restore metadata for debugging (DANGEROUS).\n");
+ fprintf(stderr,"rgcount - print how many RGs in the file system.\n");
+ fprintf(stderr,"rgflags rgnum [new flags] - print or modify flags for rg #rgnum (0 - X)\n");
fprintf(stderr,"-V prints version number.\n");
fprintf(stderr,"-c 1 selects alternate color scheme 1\n");
fprintf(stderr,"-p prints GFS2 structures or blocks to stdout.\n");
@@ -2006,6 +2100,7 @@
fprintf(stderr," inum - prints the inum file.\n");
fprintf(stderr," statfs - prints the statfs file.\n");
fprintf(stderr," rindex - prints the rindex file.\n");
+ fprintf(stderr," rg X - print resource group X.\n");
fprintf(stderr," rgs - prints all the resource groups (rgs).\n");
fprintf(stderr," quota - prints the quota file.\n");
fprintf(stderr,"-x print in hexmode.\n");
@@ -2019,6 +2114,10 @@
fprintf(stderr," gfs2_edit -x -p master /dev/bobs_vg/lvol0\n");
fprintf(stderr," To print out the block-type for block 0x27381:\n");
fprintf(stderr," gfs2_edit identify -p 0x27381 /dev/bobs_vg/lvol0\n");
+ fprintf(stderr," To print out the fourth Resource Group. (the first R is #0)\n");
+ fprintf(stderr," gfs2_edit -p rg 3 /dev/sdb1\n");
+ fprintf(stderr," To set the Resource Group flags for rg #7 to 3.\n");
+ fprintf(stderr," gfs2_edit rgflags 7 3 /dev/sdc2\n");
}/* usage */
/* ------------------------------------------------------------------------ */
@@ -2064,6 +2163,12 @@
savemeta(argv[i+1], argv[i+2], TRUE);
else if (!strcasecmp(argv[i], "restoremeta"))
restoremeta(argv[i+1], argv[i+2]);
+ else if (!strcmp(argv[i], "rgcount"))
+ termlines = 0;
+ else if (!strcmp(argv[i], "rgflags"))
+ termlines = 0;
+ else if (!strcmp(argv[i], "rg"))
+ termlines = 0;
else if (strchr(argv[i],'/'))
strcpy(device, argv[i]);
}
@@ -2119,6 +2224,58 @@
else
push_block(masterblock("quota"));
}
+ else if (!strcmp(argv[i], "rgcount"))
+ rgcount();
+ else if (!strcmp(argv[i], "rgflags")) {
+ int rg, set = FALSE;
+ uint32_t new_flags = 0;
+
+ i++;
+ if (i >= argc - 1) {
+ printf("Error: rg # not specified.\n");
+ printf("Format is: %s rgflags rgnum"
+ "[newvalue]\n",
+ argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ if (argv[i][0]=='0' && argv[i][1]=='x')
+ sscanf(argv[i], "%"SCNx32,
+ &rg);
+ else
+ rg = atoi(argv[i]);
+ i++;
+ if (i < argc - 1 &&
+ isdigit(argv[i][0])) {
+ set = TRUE;
+ if (argv[i][0]=='0' &&
+ argv[i][1]=='x')
+ sscanf(argv[i],
+ "%"SCNx32,
+ &new_flags);
+ else
+ new_flags =
+ atoi(argv[i]);
+ }
+ set_rgrp_flags(rg, new_flags, set,
+ FALSE);
+ exit(EXIT_SUCCESS);
+ }
+ else if (!strcmp(argv[i], "rg")) {
+ int rg;
+ uint32_t new_flags = 0;
+
+ i++;
+ if (i >= argc - 1) {
+ printf("Error: rg # not specified.\n");
+ printf("Format is: %s rg rgnum"
+ "\n", argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ rg = atoi(argv[i]);
+ i++;
+ set_rgrp_flags(rg, 0, FALSE, TRUE);
+ exit(EXIT_SUCCESS);
+ }
else if (argv[i][0]=='0' && argv[i][1]=='x') { /* hex addr */
sscanf(argv[i], "%"SCNx64, &temp_blk);/* retrieve in hex */
push_block(temp_blk);
--- cluster/gfs2/man/gfs2_edit.8 2007/10/08 21:40:32 1.2
+++ cluster/gfs2/man/gfs2_edit.8 2007/10/12 21:38:18 1.3
@@ -44,6 +44,8 @@
\fIrindex\fR, \fIrgindex\fR - Print the resource group index system file.
+\fIrg X\fR - Print the resource group information for RG X.
+
\fIrgs\fR - Print the resource group information.
\fIquota\fR - Print the contents of the system quota file.
@@ -85,6 +87,23 @@
Print in hex mode.
.TP
+\fBrg\fP \fI<rg>\fR \fI<device>\fR
+Print the contents of Resource Group \fI<rg>\fR on \fI<device>\fR.
+
+\fI<rg>\fR is a number from 0 to X - 1, where X is the number of RGs.
+.TP
+\fBrgcount\fP \fI<device>\fR
+Print the number of Resource Groups in the file system on \fI<device>\fR.
+.TP
+\fBrgflags\fP \fI<rg>\fR [\fInew_value\fR] \fI<device>\fR
+Print and/or modify the rg_flags value of Resource Group \fI<rg>\fR on
+\fI<device>\fR.
+
+\fI<rg>\fR is a number from 0 to X - 1, where X is the number of RGs.
+If \fInew_value\fR is not specified, the current rg_flags value will be
+printed but not modified. If \fInew_value\fR is specified, the rg_flags
+field will be overwritten with the new value.
+.TP
\fBsavemeta\fP \fI<device>\fR \fI<filename>\fR
Save off the GFS2 metadata (not user data) for the file system on the
specified device to a file given by <filename>. You can use this option
@@ -267,8 +286,23 @@
gfs2_edit -p 12345 /dev/sdc2
Print the gfs2 data structure at block 12345.
+.TP
+gfs2_edit rgcount /dev/sdb1
+Print how many Resource Groups exist for /dev/sdb1.
+
+.TP
+gfs2_edit -p rg 17 /dev/sdb1
+Print the contents of the eighteenth Resource Group on /dev/sdb1.
+
+.TP
+gfs2_edit rgflags 3 /dev/sdb1
+Print the rg_flags value for the fourth Resource Group on /dev/sdb1.
+
+.TP
+gfs2_edit rgflags 3 8 /dev/sdb1
+Set the GFS2_RGF_NOALLOC flag on for the fourth Resource Group on /dev/sdb1.
+
.SH KNOWN BUGS
.TP
The directory code does not work well. It might be confused
by directory "sentinel" entries.
-
reply other threads:[~2007-10-12 21:38 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20071012213819.12411.qmail@sourceware.org \
--to=rpeterso@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).