patch-pre2.0.7 linux/mm/filemap.c
Next file: linux/net/appletalk/ddp.c
Previous file: linux/kernel/module.c
Back to the patch index
Back to the overall index
-  Lines: 31
 -  Date:
Sun May 19 23:37:07 1996
 -  Orig file: 
pre2.0.6/linux/mm/filemap.c
 -  Orig date: 
Fri May 17 15:32:19 1996
 
diff -u --recursive --new-file pre2.0.6/linux/mm/filemap.c linux/mm/filemap.c
@@ -745,7 +745,7 @@
 	if (page)
 		goto found_page;
 	if (!new_page)
-		return 0;
+		goto failure;
 	page = mem_map + MAP_NR(new_page);
 	new_page = 0;
 	add_to_page_cache(page, inode, offset);
@@ -757,7 +757,20 @@
 		free_page(new_page);
 found_page_dont_free:
 	wait_on_page(page);
-	return page_address(page);
+	if (PageUptodate(page)) {
+success:	
+		return page_address(page);
+	}
+	/* If not marked as error, try _once_ to read it again */
+	if (!PageError(page)) {
+		inode->i_op->readpage(inode, page);
+		wait_on_page(page);
+		if (PageUptodate(page))
+			goto success;
+	}
+	page->count--;
+failure:
+	return 0;
 }
 
 /*
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov
with Sam's (original) version of this