On Mon, Mar 03, 2025 at 02:09:05PM -0500, Brian Foster wrote: > On Thu, Jan 23, 2025 at 08:52:11AM -0500, Brian Foster wrote: > > fstests test ext4/048 fails on big endian systems due to broken > > debugfs dirsearch functionality. On an s390x system and 4k block > > size, the dirsearch command seems to hang indefinitely. On the same > > system with a 1k block size, the command fails to locate an existing > > entry and causes the test to fail due to unexpected results. > > > > The cause of the dirsearch failure is lack of byte swapping of the > > on-disk (little endian) dirent buffer before attempting to iterate > > entries in the given block. This leads to garbage record and name > > length values, for example. To resolve this problem, byte swap the > > directory buffer on big endian systems. > > > > Signed-off-by: Brian Foster <bfoster@xxxxxxxxxx> > > --- > > > > Hi all, > > > > I'm not terribly familiar with this code, but this fixes the test and > > doesn't show any regressions from fstests runs on big or little endian > > systems. Thanks. > > > > Ping... curious if anybody has thoughts on this for dirsearch on big > endian? Thanks! It looks correct to /me/... horrors of debugfs, etc. :( Reviewed-by: "Darrick J. Wong" <djwong@xxxxxxxxxx> --D > > Brian > > > Brian > > > > debugfs/htree.c | 6 ++++++ > > 1 file changed, 6 insertions(+) > > > > diff --git a/debugfs/htree.c b/debugfs/htree.c > > index a1008150..4ea8f30b 100644 > > --- a/debugfs/htree.c > > +++ b/debugfs/htree.c > > @@ -482,6 +482,12 @@ static int search_dir_block(ext2_filsys fs, blk64_t *blocknr, > > return BLOCK_ABORT; > > } > > > > +#ifdef WORDS_BIGENDIAN > > + errcode = ext2fs_dirent_swab_in(fs, p->buf, 0); > > + if (errcode) > > + return BLOCK_ABORT; > > +#endif > > + > > while (offset < fs->blocksize) { > > dirent = (struct ext2_dir_entry *) (p->buf + offset); > > errcode = ext2fs_get_rec_len(fs, dirent, &rec_len); > > -- > > 2.47.1 > > > > > >