Re: [PATCH] ufs: do not treat unreadable directory blocks as empty
Jan Kara <[email protected]> Mon, 3 Aug 2026 12:01:29 +0200
| Newsgroups | org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <jub6jswxsoov3ytgo2ga4m7pa7yjraltf7vznyvc4pmfzeuexh@vstvw6p7whsl> |
On Sat 01-08-26 04:39:32, Ali Ahmet Memis wrote:
> ufs_empty_dir() scans every directory block to decide whether a
> directory is empty before rmdir() removes it. When ufs_get_folio()
> cannot read or validate a block it returns an error pointer, and the
> loop currently skips that block with continue and keeps scanning the
> remaining blocks.
>
> If none of the readable blocks hold an entry, the function returns 1
> and the caller unlinks the directory. A directory whose contents live
> in a block that cannot be read, for example because of an I/O error or
> corrupted directory metadata, is therefore seen as empty and removed,
> losing the entries it still holds.
>
> Follow the ext2 behaviour and treat an unreadable block as a reason to
> consider the directory not empty, so rmdir() fails instead of
> discarding data that could not be verified.
>
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> Signed-off-by: Ali Ahmet Memis <[email protected]>
Fair. Feel free to add:
Reviewed-by: Jan Kara <[email protected]>
Honza
> ---
> fs/ufs/dir.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c
> index e62fe5667..ce43cf20b 100644
> --- a/fs/ufs/dir.c
> +++ b/fs/ufs/dir.c
> @@ -590,7 +590,7 @@ int ufs_empty_dir(struct inode * inode)
>
> kaddr = ufs_get_folio(inode, i, &folio);
> if (IS_ERR(kaddr))
> - continue;
> + return 0;
>
> de = (struct ufs_dir_entry *)kaddr;
> kaddr += ufs_last_byte(inode, i) - UFS_DIR_REC_LEN(1);
> --
> 2.54.0
>
--
Jan Kara <[email protected]>
SUSE Labs, CR