diff options
-rw-r--r-- | fs/ceph/addr.c | 22 |
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. |