mirror-linux/fs/ext2
Al Viro 67ffc6dc30 ext2: unbugger ext2_empty_dir()
commit 27e714c007 upstream.

In 27cfa25895 "ext2: fix fs corruption when trying to remove
a non-empty directory with IO error" a funny thing has happened:

-               page = ext2_get_page(inode, i, dir_has_error, &page_addr);
+               page = ext2_get_page(inode, i, 0, &page_addr);

 -               if (IS_ERR(page)) {
 -                       dir_has_error = 1;
 -                       continue;
 -               }
 +               if (IS_ERR(page))
 +                       goto not_empty;

And at not_empty: we hit ext2_put_page(page, page_addr), which does
put_page(page).  Which, unless I'm very mistaken, should oops
immediately when given ERR_PTR(-E...) as page.

OK, shit happens, insufficiently tested patches included.  But when
commit in question describes the fault-injection test that exercised
that particular failure exit...

Ow.

CC: stable@vger.kernel.org
Fixes: 27cfa25895 ("ext2: fix fs corruption when trying to remove a non-empty directory with IO error")
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2023-01-07 11:11:40 +01:00
..
Kconfig
Makefile
acl.c vfs: add rcu argument to ->get_acl() callback 2021-08-18 22:08:24 +02:00
acl.h vfs: add rcu argument to ->get_acl() callback 2021-08-18 22:08:24 +02:00
balloc.c ext2: replace bh_submit_read() helper with bh_read() 2022-09-11 20:26:08 -07:00
dir.c ext2: unbugger ext2_empty_dir() 2023-01-07 11:11:40 +01:00
ext2.h ext2: remove nobh support 2022-08-02 12:34:04 -04:00
file.c
ialloc.c treewide: use prandom_u32_max() when possible, part 2 2022-10-11 17:42:58 -06:00
inode.c Folio changes for 6.0 2022-08-03 10:35:43 -07:00
ioctl.c
namei.c vfs: open inside ->tmpfile() 2022-09-24 07:00:00 +02:00
super.c ext2: Use kvmalloc() for group descriptor array 2022-09-26 14:59:52 +02:00
symlink.c
xattr.c ext2: avoid deleting xattr block that is being reused 2022-08-02 23:56:25 -04:00
xattr.h
xattr_security.c
xattr_trusted.c
xattr_user.c