[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <871q4kae58.fsf@mail.parknet.co.jp>
Date: Wed, 26 Jun 2024 06:47:15 +0900
From: OGAWA Hirofumi <hirofumi@...l.parknet.co.jp>
To: Thadeu Lima de Souza Cascardo <cascardo@...lia.com>
Cc: linux-fsdevel@...r.kernel.org, linux-kernel@...r.kernel.org,
Gwendal
Grignou <gwendal@...omium.org>, dlunev@...omium.org
Subject: Re: [PATCH v2 2/2] fat: always use dir_emit_dots and ignore . and
.. entries
Thadeu Lima de Souza Cascardo <cascardo@...lia.com> writes:
> 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.
Unacceptable to change the correct behavior to broken format. And
unlikely break the userspace, however this still has the user visible
change of seek pos.
Thanks.
> Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@...lia.com>
> ---
> 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);
--
OGAWA Hirofumi <hirofumi@...l.parknet.co.jp>
Powered by blists - more mailing lists