mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 01:49:46 +00:00
ceph: fix crash after fscrypt_encrypt_pagecache_blocks() error
commit249e0a47cdupstream. The function move_dirty_folio_in_page_array() was created by commitce80b76dd3("ceph: introduce ceph_process_folio_batch() method") by moving code from ceph_writepages_start() to this function. This new function is supposed to return an error code which is checked by the caller (now ceph_process_folio_batch()), and on error, the caller invokes redirty_page_for_writepage() and then breaks from the loop. However, the refactoring commit has gone wrong, and it by accident, it always returns 0 (= success) because it first NULLs the pointer and then returns PTR_ERR(NULL) which is always 0. This means errors are silently ignored, leaving NULL entries in the page array, which may later crash the kernel. The simple solution is to call PTR_ERR() before clearing the pointer. Cc: stable@vger.kernel.org Fixes:ce80b76dd3("ceph: introduce ceph_process_folio_batch() method") Link: https://lore.kernel.org/ceph-devel/aK4v548CId5GIKG1@swift.blarg.de/ Signed-off-by: Max Kellermann <max.kellermann@ionos.com> Reviewed-by: Ilya Dryomov <idryomov@gmail.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
289b6615cf
commit
dd1616ecbe
@@ -1264,7 +1264,9 @@ static inline int move_dirty_folio_in_page_array(struct address_space *mapping,
|
||||
0,
|
||||
gfp_flags);
|
||||
if (IS_ERR(pages[index])) {
|
||||
if (PTR_ERR(pages[index]) == -EINVAL) {
|
||||
int err = PTR_ERR(pages[index]);
|
||||
|
||||
if (err == -EINVAL) {
|
||||
pr_err_client(cl, "inode->i_blkbits=%hhu\n",
|
||||
inode->i_blkbits);
|
||||
}
|
||||
@@ -1273,7 +1275,7 @@ static inline int move_dirty_folio_in_page_array(struct address_space *mapping,
|
||||
BUG_ON(ceph_wbc->locked_pages == 0);
|
||||
|
||||
pages[index] = NULL;
|
||||
return PTR_ERR(pages[index]);
|
||||
return err;
|
||||
}
|
||||
} else {
|
||||
pages[index] = &folio->page;
|
||||
|
||||
Reference in New Issue
Block a user