mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
ceph: fix crash after fscrypt_encrypt_pagecache_blocks() error
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>
This commit is contained in:
parent
cce7c15faa
commit
249e0a47cd
1 changed files with 4 additions and 2 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue