diff --git a/mm/filemap.c b/mm/filemap.c
index 88d719665a28e8f28b66a9fadffa933ae46b1875..35e12d1865666717f09094090bd5032995b7e63b 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -1105,6 +1105,12 @@ static void do_generic_file_read(struct file *filp, loff_t *ppos,
 		}
 
 readpage:
+		/*
+		 * A previous I/O error may have been due to temporary
+		 * failures, eg. multipath errors.
+		 * PG_error will be set again if readpage fails.
+		 */
+		ClearPageError(page);
 		/* Start the actual read. The read will unlock the page. */
 		error = mapping->a_ops->readpage(filp, page);