aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ceph/addr.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 4aa8e375e648..080a9cab3ee1 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -544,11 +544,21 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
544 truncate_seq, truncate_size, 544 truncate_seq, truncate_size,
545 &inode->i_mtime, &page, 1); 545 &inode->i_mtime, &page, 1);
546 if (err < 0) { 546 if (err < 0) {
547 dout("writepage setting page/mapping error %d %p\n", err, page); 547 struct writeback_control tmp_wbc;
548 if (!wbc)
549 wbc = &tmp_wbc;
550 if (err == -ERESTARTSYS) {
551 /* killed by SIGKILL */
552 dout("writepage interrupted page %p\n", page);
553 redirty_page_for_writepage(wbc, page);
554 end_page_writeback(page);
555 goto out;
556 }
557 dout("writepage setting page/mapping error %d %p\n",
558 err, page);
548 SetPageError(page); 559 SetPageError(page);
549 mapping_set_error(&inode->i_data, err); 560 mapping_set_error(&inode->i_data, err);
550 if (wbc) 561 wbc->pages_skipped++;
551 wbc->pages_skipped++;
552 } else { 562 } else {
553 dout("writepage cleaned page %p\n", page); 563 dout("writepage cleaned page %p\n", page);
554 err = 0; /* vfs expects us to return 0 */ 564 err = 0; /* vfs expects us to return 0 */
@@ -569,12 +579,16 @@ static int ceph_writepage(struct page *page, struct writeback_control *wbc)
569 BUG_ON(!inode); 579 BUG_ON(!inode);
570 ihold(inode); 580 ihold(inode);
571 err = writepage_nounlock(page, wbc); 581 err = writepage_nounlock(page, wbc);
582 if (err == -ERESTARTSYS) {
583 /* direct memory reclaimer was killed by SIGKILL. return 0
584 * to prevent caller from setting mapping/page error */
585 err = 0;
586 }
572 unlock_page(page); 587 unlock_page(page);
573 iput(inode); 588 iput(inode);
574 return err; 589 return err;
575} 590}
576 591
577
578/* 592/*
579 * lame release_pages helper. release_pages() isn't exported to 593 * lame release_pages helper. release_pages() isn't exported to
580 * modules. 594 * modules.