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 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.