diff options
Diffstat (limited to 'mm/shmem.c')
| -rw-r--r-- | mm/shmem.c | 9 | 
1 files changed, 6 insertions, 3 deletions
diff --git a/mm/shmem.c b/mm/shmem.c index 2f2e0e618072..f5af4b943e42 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -2796,7 +2796,8 @@ static ssize_t shmem_file_splice_read(struct file *in, loff_t *ppos,  		if (*ppos >= i_size_read(inode))  			break; -		error = shmem_get_folio(inode, *ppos / PAGE_SIZE, &folio, SGP_READ); +		error = shmem_get_folio(inode, *ppos / PAGE_SIZE, &folio, +					SGP_READ);  		if (error) {  			if (error == -EINVAL)  				error = 0; @@ -2805,7 +2806,9 @@ static ssize_t shmem_file_splice_read(struct file *in, loff_t *ppos,  		if (folio) {  			folio_unlock(folio); -			if (folio_test_hwpoison(folio)) { +			if (folio_test_hwpoison(folio) || +			    (folio_test_large(folio) && +			     folio_test_has_hwpoisoned(folio))) {  				error = -EIO;  				break;  			} @@ -2841,7 +2844,7 @@ static ssize_t shmem_file_splice_read(struct file *in, loff_t *ppos,  			folio_put(folio);  			folio = NULL;  		} else { -			n = splice_zeropage_into_pipe(pipe, *ppos, len); +			n = splice_zeropage_into_pipe(pipe, *ppos, part);  		}  		if (!n)  |