This is an automated email from the git hooks/post-receive script.
andyp pushed a commit to branch master in repository gfs2-utils.
commit 0aabb9fe5a3421487dd778f80ca455d3bcc91c01 Author: Andrew Price anprice@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@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; }
cluster-commits@lists.fedorahosted.org