This is an automated email from the git hooks/post-receive script.
andyp pushed a commit to branch andyp-sparse
in repository gfs2-utils.
commit 717c5a1157b13e7e95c2d93f506c304f3410af73
Author: Andrew Price <anprice(a)redhat.com>
AuthorDate: Fri Jun 4 11:10:31 2021 +0100
gfs2_edit: Use native-endian types for dirent processing
Replace gfs2_edit's 'struct gfs2_dirents' with a new 'struct
idirent'
that doesn't use the big-endian 'struct gfs2_dirent'.
Signed-off-by: Andrew Price <anprice(a)redhat.com>
---
gfs2/edit/extended.c | 22 ++++++++++----------
gfs2/edit/gfs2hex.c | 59 ++++++++++++++++++++++++++++------------------------
gfs2/edit/hexedit.c | 41 ++++++++++++++++++------------------
gfs2/edit/hexedit.h | 17 +++++++++++----
gfs2/edit/journal.c | 2 +-
gfs2/edit/savemeta.c | 4 ++--
6 files changed, 79 insertions(+), 66 deletions(-)
diff --git a/gfs2/edit/extended.c b/gfs2/edit/extended.c
index 4d6b7496..d2ac8507 100644
--- a/gfs2/edit/extended.c
+++ b/gfs2/edit/extended.c
@@ -59,7 +59,7 @@ static int _do_indirect_extended(char *diebuf, struct iinfo *iinf, int
hgt)
iinf->ii[x].height = 0;
iinf->ii[x].block = 0;
iinf->ii[x].dirents = 0;
- memset(&iinf->ii[x].dirent, 0, sizeof(struct gfs2_dirents));
+ memset(&iinf->ii[x].dirent, 0, sizeof(struct idirent));
}
headoff = sbd.gfs1 ? sizeof(struct gfs_indirect) : sizeof(struct gfs2_meta_header);
for (x = headoff, y = 0; x < sbd.sd_bsize; x += sizeof(uint64_t), y++) {
@@ -331,21 +331,21 @@ static int display_leaf(struct iinfo *ind)
line - start_line - 1 ==
edit_row[dmode] - start_row[dmode]) {
COLORS_HIGHLIGHT;
- sprintf(estring, "%"PRIx64, ind->ii[0].dirent[d].block);
+ sprintf(estring, "%"PRIx64, ind->ii[0].dirent[d].inum.addr);
strcpy(edit_fmt, "%llx");
}
}
print_gfs2("%d/%d [%08"PRIX32"] %"PRIu64"/%"PRIu64"
(0x%"PRIx64"/0x%"PRIx64") +%"PRIu16": ",
total_dirents, d + 1,
- ind->ii[0].dirent[d].dirent.de_hash,
- ind->ii[0].dirent[d].dirent.de_inum.no_formal_ino,
- ind->ii[0].dirent[d].block,
- ind->ii[0].dirent[d].dirent.de_inum.no_formal_ino,
- ind->ii[0].dirent[d].block,
- ind->ii[0].dirent[d].dirent.de_rahead
+ ind->ii[0].dirent[d].hash,
+ ind->ii[0].dirent[d].inum.formal_ino,
+ ind->ii[0].dirent[d].inum.addr,
+ ind->ii[0].dirent[d].inum.formal_ino,
+ ind->ii[0].dirent[d].inum.addr,
+ ind->ii[0].dirent[d].rahead
);
}
- print_inode_type(ind->ii[0].dirent[d].dirent.de_type);
+ print_inode_type(ind->ii[0].dirent[d].type);
print_gfs2(" %s", ind->ii[0].dirent[d].filename);
if (termlines) {
if (edit_row[dmode] >= 0 &&
@@ -479,10 +479,10 @@ static int print_gfs2_jindex(void)
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);
+ ip = lgfs2_inode_read(&sbd, indirect->ii[0].dirent[d].inum.addr);
print_gfs2("%s: 0x%-5"PRIx64" %"PRIu64"MB ",
indirect->ii[0].dirent[d].filename,
- indirect->ii[0].dirent[d].block,
+ indirect->ii[0].dirent[d].inum.addr,
ip->i_size / 1048576);
error = lgfs2_find_jhead(ip, &head);
if (error) {
diff --git a/gfs2/edit/gfs2hex.c b/gfs2/edit/gfs2hex.c
index f0c409b5..5a1f9b7f 100644
--- a/gfs2/edit/gfs2hex.c
+++ b/gfs2/edit/gfs2hex.c
@@ -209,25 +209,37 @@ void print_it(const char *label, const char *fmt, const char *fmt2,
...)
}
}
-static int indirect_dirent(struct indirect_info *indir, char *ptr, int d)
+void idirent_in(struct idirent *id, void *dep)
{
- struct gfs2_dirent de;
+ struct gfs2_dirent *de = dep;
+
+ id->inum.formal_ino = be64_to_cpu(de->de_inum.no_formal_ino);
+ id->inum.addr = be64_to_cpu(de->de_inum.no_addr);
+ id->hash = be32_to_cpu(de->de_hash);
+ id->rec_len = be16_to_cpu(de->de_rec_len);
+ id->name_len = be16_to_cpu(de->de_name_len);
+ id->type = be16_to_cpu(de->de_type);
+ id->rahead = be16_to_cpu(de->de_rahead);
+ memcpy(id->filename, (char *)de + sizeof(*de), id->name_len);
+ id->filename[id->name_len] = '\0';
+}
+
+static int indirect_dirent(struct indirect_info *indir, void *ptr, int d)
+{
+ struct gfs2_dirent *de = ptr;
+ int ret = 0;
- gfs2_dirent_in(&de, ptr);
- if (de.de_rec_len < sizeof(struct gfs2_dirent) ||
- de.de_rec_len > 4096 - sizeof(struct gfs2_dirent))
+ if (be16_to_cpu(de->de_rec_len) < sizeof(struct gfs2_dirent) ||
+ be16_to_cpu(de->de_rec_len) > 4096 - sizeof(struct gfs2_dirent))
return -1;
- if (de.de_inum.no_addr) {
- indir->block = de.de_inum.no_addr;
- memcpy(&indir->dirent[d].dirent, &de, sizeof(struct gfs2_dirent));
- memcpy(&indir->dirent[d].filename,
- ptr + sizeof(struct gfs2_dirent), de.de_name_len);
- indir->dirent[d].filename[de.de_name_len] = '\0';
- indir->dirent[d].block = de.de_inum.no_addr;
+ if (de->de_inum.no_addr) {
+ idirent_in(&indir->dirent[d], ptr);
+ indir->block = be64_to_cpu(de->de_inum.no_addr);
indir->is_dir = TRUE;
indir->dirents++;
+ ret = indir->dirent[d].rec_len;
}
- return de.de_rec_len;
+ return ret;
}
void do_dinode_extended(char *buf)
@@ -320,29 +332,22 @@ void do_dinode_extended(char *buf)
uint64_t do_leaf_extended(char *dlebuf, struct iinfo *indir)
{
int x, i;
- struct gfs2_dirent de;
+ struct gfs2_dirent *de;
x = 0;
memset(indir, 0, sizeof(*indir));
gfs2_leaf_in(&indir->ii[0].lf, dlebuf);
/* Directory Entries: */
- for (i = sizeof(struct gfs2_leaf); i < sbd.sd_bsize;
- i += de.de_rec_len) {
- gfs2_dirent_in(&de, dlebuf + i);
- if (de.de_inum.no_addr) {
- indir->ii[0].block = de.de_inum.no_addr;
- indir->ii[0].dirent[x].block = de.de_inum.no_addr;
- memcpy(&indir->ii[0].dirent[x].dirent,
- &de, sizeof(struct gfs2_dirent));
- memcpy(&indir->ii[0].dirent[x].filename,
- dlebuf + i + sizeof(struct gfs2_dirent),
- de.de_name_len);
- indir->ii[0].dirent[x].filename[de.de_name_len] = '\0';
+ for (i = sizeof(struct gfs2_leaf); i < sbd.sd_bsize; i +=
be16_to_cpu(de->de_rec_len)) {
+ de = (struct gfs2_dirent *)(dlebuf + i);
+ if (de->de_inum.no_addr) {
+ idirent_in(&indir->ii[0].dirent[x], de);
+ indir->ii[0].block = be64_to_cpu(de->de_inum.no_addr);
indir->ii[0].is_dir = TRUE;
indir->ii[0].dirents++;
x++;
}
- if (de.de_rec_len <= sizeof(struct gfs2_dirent))
+ if (be16_to_cpu(de->de_rec_len) <= sizeof(struct gfs2_dirent))
break;
}
return indir->ii[0].lf.lf_next;
diff --git a/gfs2/edit/hexedit.c b/gfs2/edit/hexedit.c
index 2843262b..fb643ac3 100644
--- a/gfs2/edit/hexedit.c
+++ b/gfs2/edit/hexedit.c
@@ -462,7 +462,7 @@ int display_block_type(char *buf, uint64_t addr, int from_restore)
int d;
for (d = 2; d < 8; d++) {
- if (block == masterdir.dirent[d].block) {
+ if (block == masterdir.dirent[d].inum.addr) {
if (!strncmp(masterdir.dirent[d].filename, "jindex", 6))
print_gfs2("--------------- Journal Index ------------------");
else if (!strncmp(masterdir.dirent[d].filename, "per_node", 8))
@@ -687,7 +687,7 @@ uint64_t masterblock(const char *fn)
for (d = 2; d < 8; d++)
if (!strncmp(masterdir.dirent[d].filename, fn, strlen(fn)))
- return (masterdir.dirent[d].block);
+ return (masterdir.dirent[d].inum.addr);
return 0;
}
@@ -1024,27 +1024,26 @@ int display(int identify_only, int trunc_zeros, uint64_t flagref,
indirect_blocks = 0;
lines_per_row[dmode] = 1;
if (gfs2_struct_type == GFS2_METATYPE_SB || blk == 0x10 * (4096 / sbd.sd_bsize)) {
+ struct indirect_info *ii = &indirect->ii[0];
+ struct idirent *id;
+
lgfs2_sb_in(&sbd, bh->b_data);
memset(indirect, 0, sizeof(struct iinfo));
- indirect->ii[0].block = sbd.sd_meta_dir.no_addr;
- indirect->ii[0].is_dir = TRUE;
- indirect->ii[0].dirents = 2;
-
- memcpy(&indirect->ii[0].dirent[0].filename, "root", 4);
- indirect->ii[0].dirent[0].dirent.de_inum.no_formal_ino =
- sbd.sd_root_dir.no_formal_ino;
- indirect->ii[0].dirent[0].dirent.de_inum.no_addr =
- sbd.sd_root_dir.no_addr;
- indirect->ii[0].dirent[0].block = sbd.sd_root_dir.no_addr;
- indirect->ii[0].dirent[0].dirent.de_type = DT_DIR;
-
- memcpy(&indirect->ii[0].dirent[1].filename, "master", 7);
- indirect->ii[0].dirent[1].dirent.de_inum.no_formal_ino =
- sbd.sd_meta_dir.no_formal_ino;
- indirect->ii[0].dirent[1].dirent.de_inum.no_addr =
- sbd.sd_meta_dir.no_addr;
- indirect->ii[0].dirent[1].block = sbd.sd_meta_dir.no_addr;
- indirect->ii[0].dirent[1].dirent.de_type = DT_DIR;
+ ii->block = sbd.sd_meta_dir.no_addr;
+ ii->is_dir = TRUE;
+ ii->dirents = 2;
+
+ id = &ii->dirent[0];
+ memcpy(id->filename, "root", 4);
+ id->inum.formal_ino = sbd.sd_root_dir.no_formal_ino;
+ id->inum.addr = sbd.sd_root_dir.no_addr;
+ id->type = DT_DIR;
+
+ id = &ii->dirent[1];
+ memcpy(id->filename, "master", 7);
+ id->inum.formal_ino = sbd.sd_meta_dir.no_formal_ino;
+ id->inum.addr = sbd.sd_meta_dir.no_addr;
+ id->type = DT_DIR;
}
else if (gfs2_struct_type == GFS2_METATYPE_DI) {
di = (struct gfs2_dinode *)bh->b_data;
diff --git a/gfs2/edit/hexedit.h b/gfs2/edit/hexedit.h
index fb060089..f60d836d 100644
--- a/gfs2/edit/hexedit.h
+++ b/gfs2/edit/hexedit.h
@@ -63,12 +63,21 @@ extern int combined_display;
extern int details;
extern const char *allocdesc[2][5];
-struct gfs2_dirents {
- uint64_t block;
- struct gfs2_dirent dirent;
+struct idirent {
+ struct {
+ uint64_t formal_ino;
+ uint64_t addr;
+ } inum;
+ uint32_t hash;
+ uint16_t rec_len;
+ uint16_t name_len;
+ uint16_t type;
+ uint16_t rahead;
char filename[NAME_MAX];
};
+extern void idirent_in(struct idirent *id, void *de);
+
struct indirect_info {
int is_dir;
int height;
@@ -76,7 +85,7 @@ struct indirect_info {
uint32_t dirents;
struct gfs2_leaf lf;
struct metapath mp;
- struct gfs2_dirents dirent[64];
+ struct idirent dirent[64];
uint64_t ptroff;
};
diff --git a/gfs2/edit/journal.c b/gfs2/edit/journal.c
index eb8fb4f6..b3333861 100644
--- a/gfs2/edit/journal.c
+++ b/gfs2/edit/journal.c
@@ -77,7 +77,7 @@ uint64_t find_journal_block(const char *journal, uint64_t *j_size)
if (journal_num > indirect->ii[0].dirents - 2)
return 0;
- jblock = indirect->ii[0].dirent[journal_num + 2].block;
+ jblock = indirect->ii[0].dirent[journal_num + 2].inum.addr;
j_bh = bread(&sbd, jblock);
jdi = (struct gfs2_dinode *)j_bh->b_data;
*j_size = be64_to_cpu(jdi->di_size);
diff --git a/gfs2/edit/savemeta.c b/gfs2/edit/savemeta.c
index b4706248..5d51ea1f 100644
--- a/gfs2/edit/savemeta.c
+++ b/gfs2/edit/savemeta.c
@@ -278,7 +278,7 @@ static int init_per_node_lookup(void)
for (i = 0; i < indirect_blocks; i++) {
int d;
for (d = 0; d < indirect->ii[i].dirents; d++) {
- int ret = insert_per_node_lookup(indirect->ii[i].dirent[d].block);
+ int ret = insert_per_node_lookup(indirect->ii[i].dirent[d].inum.addr);
if (ret != 0)
return ret;
}
@@ -966,7 +966,7 @@ static void get_journal_inode_blocks(void)
} else {
if (journal + 3 > indirect->ii[0].dirents)
break;
- jblock = indirect->ii[0].dirent[journal + 2].block;
+ jblock = indirect->ii[0].dirent[journal + 2].inum.addr;
}
journal_blocks[journals_found++] = jblock;
}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.