Instead of only using dir_emit_dots for the root inode and explictily requiring the . and .. entries to emit them, use dir_emit_dots for all directories. That allows filesystems with directories without the . or .. entries to still show them. Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@xxxxxxxxxx> --- fs/fat/dir.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/fs/fat/dir.c b/fs/fat/dir.c index 4e4a359a1ea3..e70781569de5 100644 --- a/fs/fat/dir.c +++ b/fs/fat/dir.c @@ -583,15 +583,14 @@ static int __fat_readdir(struct inode *inode, struct file *file, mutex_lock(&sbi->s_lock); cpos = ctx->pos; - /* Fake . and .. for the root directory. */ - if (inode->i_ino == MSDOS_ROOT_INO) { - if (!dir_emit_dots(file, ctx)) - goto out; - if (ctx->pos == 2) { - fake_offset = 1; - cpos = 0; - } + + if (!dir_emit_dots(file, ctx)) + goto out; + if (ctx->pos == 2) { + fake_offset = 1; + cpos = 0; } + if (cpos & (sizeof(struct msdos_dir_entry) - 1)) { ret = -ENOENT; goto out; @@ -671,13 +670,8 @@ static int __fat_readdir(struct inode *inode, struct file *file, if (fake_offset && ctx->pos < 2) ctx->pos = 2; - if (!memcmp(de->name, MSDOS_DOT, MSDOS_NAME)) { - if (!dir_emit_dot(file, ctx)) - goto fill_failed; - } else if (!memcmp(de->name, MSDOS_DOTDOT, MSDOS_NAME)) { - if (!dir_emit_dotdot(file, ctx)) - goto fill_failed; - } else { + if (memcmp(de->name, MSDOS_DOT, MSDOS_NAME) && + memcmp(de->name, MSDOS_DOTDOT, MSDOS_NAME)) { unsigned long inum; loff_t i_pos = fat_make_i_pos(sb, bh, de); struct inode *tmp = fat_iget(sb, i_pos); -- 2.34.1