Commit 681be068 authored by Tong Tiangen's avatar Tong Tiangen
Browse files

mm/hwpoison: return -EFAULT when copy fail in copy_mc_[user]_highpage()

hulk inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I8M74H


CVE: NA

-------------------------------

If hardware errors are encountered during page copying, returning the bytes
not copied is not meaningful, and the caller cannot do any processing on
the remaining data. Returning -EFAULT is more reasonable, which represents
a hardware error encountered during the copying.

Signed-off-by: default avatarTong Tiangen <tongtiangen@huawei.com>
parent 1a1eddb9
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -335,8 +335,8 @@ static inline void copy_highpage(struct page *to, struct page *from)
/*
 * If architecture supports machine check exception handling, define the
 * #MC versions of copy_user_highpage and copy_highpage. They copy a memory
 * page with #MC in source page (@from) handled, and return the number
 * of bytes not copied if there was a #MC, otherwise 0 for success.
 * page with #MC in source page (@from) handled, and return -EFAULT if there
 * was a #MC, otherwise 0 for success.
 */
static inline int copy_mc_user_highpage(struct page *to, struct page *from,
					unsigned long vaddr, struct vm_area_struct *vma)
@@ -352,7 +352,7 @@ static inline int copy_mc_user_highpage(struct page *to, struct page *from,
	kunmap_local(vto);
	kunmap_local(vfrom);

	return ret;
	return ret ? -EFAULT : 0;
}

static inline int copy_mc_highpage(struct page *to, struct page *from)
@@ -368,7 +368,7 @@ static inline int copy_mc_highpage(struct page *to, struct page *from)
	kunmap_local(vto);
	kunmap_local(vfrom);

	return ret;
	return ret ? -EFAULT : 0;
}
#else
static inline int copy_mc_user_highpage(struct page *to, struct page *from,
+2 −2
Original line number Diff line number Diff line
@@ -797,7 +797,7 @@ static int __collapse_huge_page_copy(pte_t *pte,
			continue;
		}
		src_page = pte_page(pteval);
		if (copy_mc_user_highpage(page, src_page, _address, vma) > 0) {
		if (copy_mc_user_highpage(page, src_page, _address, vma)) {
			result = SCAN_COPY_MC;
			break;
		}
@@ -2050,7 +2050,7 @@ static int collapse_file(struct mm_struct *mm, unsigned long addr,
			clear_highpage(hpage + (index % HPAGE_PMD_NR));
			index++;
		}
		if (copy_mc_highpage(hpage + (page->index % HPAGE_PMD_NR), page) > 0) {
		if (copy_mc_highpage(hpage + (page->index % HPAGE_PMD_NR), page)) {
			result = SCAN_COPY_MC;
			goto rollback;
		}