The directory listing command 'l' currently shows deleted files plus other filetypes that couldn't possibly be booted. Eliminate deleted files and make it show only regular/symlink and directory entries. Signed-off-by: James Bottomley <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx> --- ipl/ext2.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ipl/ext2.c b/ipl/ext2.c index 86b8259..8a96b9b 100644 --- a/ipl/ext2.c +++ b/ipl/ext2.c @@ -728,6 +728,7 @@ static struct ext2_dir_entry_2 *ext2_readdiri(struct ext2_inode *dir_inode, return NULL; } + repeat: #ifdef DEBUG printf("ext2_readdiri: blkoffset %d diroffset %d len %d\n", blockoffset, diroffset, dir_inode->i_size); @@ -751,6 +752,15 @@ static struct ext2_dir_entry_2 *ext2_readdiri(struct ext2_inode *dir_inode, dp = (struct ext2_dir_entry_2 *) (blkbuf + blockoffset); swapde(dp); blockoffset += dp->rec_len; + /* ext2 deletes a file by zeroing its inode. We skip deleted + * files, corrupt entries and entries that aren't a regular + * file or a symlink */ + if (dp->name_len == 0 || dp->inode == 0) + goto repeat; + if (dp->file_type != EXT2_FT_REG_FILE && + dp->file_type != EXT2_FT_SYMLINK && + dp->file_type != EXT2_FT_DIR) + goto repeat; #ifdef DEBUG printf("ext2_readdiri: returning %p = %.*s\n", dp, dp->name_len, dp->name); #endif -- 2.30.0.rc2