mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
ntfs: fix invalid PTR_ERR() usage in __ntfs_bitmap_set_bits_in_run()
The Smatch reported a warning in __ntfs_bitmap_set_bits_in_run(): "warn: passing a valid pointer to 'PTR_ERR'" This occurs because the 'folio' variable might contain a valid pointer when jumping to the 'rollback' label, specifically when 'cnt <= 0' is detected during the subsequent page mapping loop. In such cases, calling PTR_ERR(folio) is incorrect as it does not contain an error code. Fix this by introducing an explicit 'err' variable to track the error status. This ensures that the rollback logic and the return value consistently use a proper error code regardless of the state of the folio pointer. Reported-by: Dan Carpenter <dan.carpenter@linaro.org> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
This commit is contained in:
parent
785bc56816
commit
d986ba0329
|
|
@ -125,7 +125,7 @@ int __ntfs_bitmap_set_bits_in_run(struct inode *vi, const s64 start_bit,
|
|||
struct address_space *mapping;
|
||||
struct folio *folio;
|
||||
u8 *kaddr;
|
||||
int pos, len;
|
||||
int pos, len, err;
|
||||
u8 bit;
|
||||
struct ntfs_inode *ni = NTFS_I(vi);
|
||||
struct ntfs_volume *vol = ni->vol;
|
||||
|
|
@ -201,8 +201,10 @@ int __ntfs_bitmap_set_bits_in_run(struct inode *vi, const s64 start_bit,
|
|||
|
||||
/* If we are not in the last page, deal with all subsequent pages. */
|
||||
while (index < end_index) {
|
||||
if (cnt <= 0)
|
||||
if (cnt <= 0) {
|
||||
err = -EIO;
|
||||
goto rollback;
|
||||
}
|
||||
|
||||
/* Update @index and get the next folio. */
|
||||
folio_mark_dirty(folio);
|
||||
|
|
@ -214,6 +216,7 @@ int __ntfs_bitmap_set_bits_in_run(struct inode *vi, const s64 start_bit,
|
|||
ntfs_error(vi->i_sb,
|
||||
"Failed to map subsequent page (error %li), aborting.",
|
||||
PTR_ERR(folio));
|
||||
err = PTR_ERR(folio);
|
||||
goto rollback;
|
||||
}
|
||||
|
||||
|
|
@ -265,7 +268,7 @@ int __ntfs_bitmap_set_bits_in_run(struct inode *vi, const s64 start_bit,
|
|||
* - @count - @cnt is the number of bits that have been modified
|
||||
*/
|
||||
if (is_rollback)
|
||||
return PTR_ERR(folio);
|
||||
return err;
|
||||
if (count != cnt)
|
||||
pos = __ntfs_bitmap_set_bits_in_run(vi, start_bit, count - cnt,
|
||||
value ? 0 : 1, true);
|
||||
|
|
@ -274,14 +277,14 @@ int __ntfs_bitmap_set_bits_in_run(struct inode *vi, const s64 start_bit,
|
|||
if (!pos) {
|
||||
/* Rollback was successful. */
|
||||
ntfs_error(vi->i_sb,
|
||||
"Failed to map subsequent page (error %li), aborting.",
|
||||
PTR_ERR(folio));
|
||||
"Failed to map subsequent page (error %i), aborting.",
|
||||
err);
|
||||
} else {
|
||||
/* Rollback failed. */
|
||||
ntfs_error(vi->i_sb,
|
||||
"Failed to map subsequent page (error %li) and rollback failed (error %i). Aborting and leaving inconsistent metadata. Unmount and run chkdsk.",
|
||||
PTR_ERR(folio), pos);
|
||||
"Failed to map subsequent page (error %i) and rollback failed (error %i). Aborting and leaving inconsistent metadata. Unmount and run chkdsk.",
|
||||
err, pos);
|
||||
NVolSetErrors(NTFS_SB(vi->i_sb));
|
||||
}
|
||||
return PTR_ERR(folio);
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user