diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-23 01:43:01 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-23 01:43:01 -0400 |
commit | caebc160ce3f76761cc62ad96ef6d6f30f54e3dd (patch) | |
tree | 6bedd4a62d65a4ba121a0c170d1ca657d922d352 /fs/nilfs2/segment.c | |
parent | d798f7f080805ad7e15fc37a43d8c6f91edb6dda (diff) | |
parent | 5fc7b14177b1a1c2f2511aed62a4ca870d0332e7 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2:
nilfs2: use mark_buffer_dirty to mark btnode or meta data dirty
nilfs2: always set back pointer to host inode in mapping->host
nilfs2: get rid of NILFS_I_NILFS
nilfs2: use list_first_entry
nilfs2: use empty_aops for gc-inodes
nilfs2: implement resize ioctl
nilfs2: add truncation routine of segment usage file
nilfs2: add routine to move secondary super block
nilfs2: add ioctl which limits range of segment to be allocated
nilfs2: zero fill unused portion of super root block
nilfs2: super root size should change depending on inode size
nilfs2: get rid of private page allocator
nilfs2: merge list_del()/list_add_tail() to list_move_tail()
Diffstat (limited to 'fs/nilfs2/segment.c')
-rw-r--r-- | fs/nilfs2/segment.c | 190 |
1 files changed, 33 insertions, 157 deletions
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index afe4f2183454..141646e88fb5 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c | |||
@@ -655,13 +655,10 @@ static size_t nilfs_lookup_dirty_data_buffers(struct inode *inode, | |||
655 | if (unlikely(page->index > last)) | 655 | if (unlikely(page->index > last)) |
656 | break; | 656 | break; |
657 | 657 | ||
658 | if (mapping->host) { | 658 | lock_page(page); |
659 | lock_page(page); | 659 | if (!page_has_buffers(page)) |
660 | if (!page_has_buffers(page)) | 660 | create_empty_buffers(page, 1 << inode->i_blkbits, 0); |
661 | create_empty_buffers(page, | 661 | unlock_page(page); |
662 | 1 << inode->i_blkbits, 0); | ||
663 | unlock_page(page); | ||
664 | } | ||
665 | 662 | ||
666 | bh = head = page_buffers(page); | 663 | bh = head = page_buffers(page); |
667 | do { | 664 | do { |
@@ -809,7 +806,7 @@ static int nilfs_segctor_create_checkpoint(struct nilfs_sc_info *sci) | |||
809 | /* The following code is duplicated with cpfile. But, it is | 806 | /* The following code is duplicated with cpfile. But, it is |
810 | needed to collect the checkpoint even if it was not newly | 807 | needed to collect the checkpoint even if it was not newly |
811 | created */ | 808 | created */ |
812 | nilfs_mdt_mark_buffer_dirty(bh_cp); | 809 | mark_buffer_dirty(bh_cp); |
813 | nilfs_mdt_mark_dirty(nilfs->ns_cpfile); | 810 | nilfs_mdt_mark_dirty(nilfs->ns_cpfile); |
814 | nilfs_cpfile_put_checkpoint( | 811 | nilfs_cpfile_put_checkpoint( |
815 | nilfs->ns_cpfile, nilfs->ns_cno, bh_cp); | 812 | nilfs->ns_cpfile, nilfs->ns_cno, bh_cp); |
@@ -889,12 +886,14 @@ static void nilfs_segctor_fill_in_super_root(struct nilfs_sc_info *sci, | |||
889 | { | 886 | { |
890 | struct buffer_head *bh_sr; | 887 | struct buffer_head *bh_sr; |
891 | struct nilfs_super_root *raw_sr; | 888 | struct nilfs_super_root *raw_sr; |
892 | unsigned isz = nilfs->ns_inode_size; | 889 | unsigned isz, srsz; |
893 | 890 | ||
894 | bh_sr = NILFS_LAST_SEGBUF(&sci->sc_segbufs)->sb_super_root; | 891 | bh_sr = NILFS_LAST_SEGBUF(&sci->sc_segbufs)->sb_super_root; |
895 | raw_sr = (struct nilfs_super_root *)bh_sr->b_data; | 892 | raw_sr = (struct nilfs_super_root *)bh_sr->b_data; |
893 | isz = nilfs->ns_inode_size; | ||
894 | srsz = NILFS_SR_BYTES(isz); | ||
896 | 895 | ||
897 | raw_sr->sr_bytes = cpu_to_le16(NILFS_SR_BYTES); | 896 | raw_sr->sr_bytes = cpu_to_le16(srsz); |
898 | raw_sr->sr_nongc_ctime | 897 | raw_sr->sr_nongc_ctime |
899 | = cpu_to_le64(nilfs_doing_gc() ? | 898 | = cpu_to_le64(nilfs_doing_gc() ? |
900 | nilfs->ns_nongc_ctime : sci->sc_seg_ctime); | 899 | nilfs->ns_nongc_ctime : sci->sc_seg_ctime); |
@@ -906,6 +905,7 @@ static void nilfs_segctor_fill_in_super_root(struct nilfs_sc_info *sci, | |||
906 | NILFS_SR_CPFILE_OFFSET(isz), 1); | 905 | NILFS_SR_CPFILE_OFFSET(isz), 1); |
907 | nilfs_write_inode_common(nilfs->ns_sufile, (void *)raw_sr + | 906 | nilfs_write_inode_common(nilfs->ns_sufile, (void *)raw_sr + |
908 | NILFS_SR_SUFILE_OFFSET(isz), 1); | 907 | NILFS_SR_SUFILE_OFFSET(isz), 1); |
908 | memset((void *)raw_sr + srsz, 0, nilfs->ns_blocksize - srsz); | ||
909 | } | 909 | } |
910 | 910 | ||
911 | static void nilfs_redirty_inodes(struct list_head *head) | 911 | static void nilfs_redirty_inodes(struct list_head *head) |
@@ -954,8 +954,8 @@ static int nilfs_segctor_apply_buffers(struct nilfs_sc_info *sci, | |||
954 | 954 | ||
955 | dispose_buffers: | 955 | dispose_buffers: |
956 | while (!list_empty(listp)) { | 956 | while (!list_empty(listp)) { |
957 | bh = list_entry(listp->next, struct buffer_head, | 957 | bh = list_first_entry(listp, struct buffer_head, |
958 | b_assoc_buffers); | 958 | b_assoc_buffers); |
959 | list_del_init(&bh->b_assoc_buffers); | 959 | list_del_init(&bh->b_assoc_buffers); |
960 | brelse(bh); | 960 | brelse(bh); |
961 | } | 961 | } |
@@ -1500,10 +1500,7 @@ nilfs_segctor_update_payload_blocknr(struct nilfs_sc_info *sci, | |||
1500 | nblocks = le32_to_cpu(finfo->fi_nblocks); | 1500 | nblocks = le32_to_cpu(finfo->fi_nblocks); |
1501 | ndatablk = le32_to_cpu(finfo->fi_ndatablk); | 1501 | ndatablk = le32_to_cpu(finfo->fi_ndatablk); |
1502 | 1502 | ||
1503 | if (buffer_nilfs_node(bh)) | 1503 | inode = bh->b_page->mapping->host; |
1504 | inode = NILFS_BTNC_I(bh->b_page->mapping); | ||
1505 | else | ||
1506 | inode = NILFS_AS_I(bh->b_page->mapping); | ||
1507 | 1504 | ||
1508 | if (mode == SC_LSEG_DSYNC) | 1505 | if (mode == SC_LSEG_DSYNC) |
1509 | sc_op = &nilfs_sc_dsync_ops; | 1506 | sc_op = &nilfs_sc_dsync_ops; |
@@ -1556,83 +1553,24 @@ static int nilfs_segctor_assign(struct nilfs_sc_info *sci, int mode) | |||
1556 | return 0; | 1553 | return 0; |
1557 | } | 1554 | } |
1558 | 1555 | ||
1559 | static int | 1556 | static void nilfs_begin_page_io(struct page *page) |
1560 | nilfs_copy_replace_page_buffers(struct page *page, struct list_head *out) | ||
1561 | { | ||
1562 | struct page *clone_page; | ||
1563 | struct buffer_head *bh, *head, *bh2; | ||
1564 | void *kaddr; | ||
1565 | |||
1566 | bh = head = page_buffers(page); | ||
1567 | |||
1568 | clone_page = nilfs_alloc_private_page(bh->b_bdev, bh->b_size, 0); | ||
1569 | if (unlikely(!clone_page)) | ||
1570 | return -ENOMEM; | ||
1571 | |||
1572 | bh2 = page_buffers(clone_page); | ||
1573 | kaddr = kmap_atomic(page, KM_USER0); | ||
1574 | do { | ||
1575 | if (list_empty(&bh->b_assoc_buffers)) | ||
1576 | continue; | ||
1577 | get_bh(bh2); | ||
1578 | page_cache_get(clone_page); /* for each bh */ | ||
1579 | memcpy(bh2->b_data, kaddr + bh_offset(bh), bh2->b_size); | ||
1580 | bh2->b_blocknr = bh->b_blocknr; | ||
1581 | list_replace(&bh->b_assoc_buffers, &bh2->b_assoc_buffers); | ||
1582 | list_add_tail(&bh->b_assoc_buffers, out); | ||
1583 | } while (bh = bh->b_this_page, bh2 = bh2->b_this_page, bh != head); | ||
1584 | kunmap_atomic(kaddr, KM_USER0); | ||
1585 | |||
1586 | if (!TestSetPageWriteback(clone_page)) | ||
1587 | account_page_writeback(clone_page); | ||
1588 | unlock_page(clone_page); | ||
1589 | |||
1590 | return 0; | ||
1591 | } | ||
1592 | |||
1593 | static int nilfs_test_page_to_be_frozen(struct page *page) | ||
1594 | { | ||
1595 | struct address_space *mapping = page->mapping; | ||
1596 | |||
1597 | if (!mapping || !mapping->host || S_ISDIR(mapping->host->i_mode)) | ||
1598 | return 0; | ||
1599 | |||
1600 | if (page_mapped(page)) { | ||
1601 | ClearPageChecked(page); | ||
1602 | return 1; | ||
1603 | } | ||
1604 | return PageChecked(page); | ||
1605 | } | ||
1606 | |||
1607 | static int nilfs_begin_page_io(struct page *page, struct list_head *out) | ||
1608 | { | 1557 | { |
1609 | if (!page || PageWriteback(page)) | 1558 | if (!page || PageWriteback(page)) |
1610 | /* For split b-tree node pages, this function may be called | 1559 | /* For split b-tree node pages, this function may be called |
1611 | twice. We ignore the 2nd or later calls by this check. */ | 1560 | twice. We ignore the 2nd or later calls by this check. */ |
1612 | return 0; | 1561 | return; |
1613 | 1562 | ||
1614 | lock_page(page); | 1563 | lock_page(page); |
1615 | clear_page_dirty_for_io(page); | 1564 | clear_page_dirty_for_io(page); |
1616 | set_page_writeback(page); | 1565 | set_page_writeback(page); |
1617 | unlock_page(page); | 1566 | unlock_page(page); |
1618 | |||
1619 | if (nilfs_test_page_to_be_frozen(page)) { | ||
1620 | int err = nilfs_copy_replace_page_buffers(page, out); | ||
1621 | if (unlikely(err)) | ||
1622 | return err; | ||
1623 | } | ||
1624 | return 0; | ||
1625 | } | 1567 | } |
1626 | 1568 | ||
1627 | static int nilfs_segctor_prepare_write(struct nilfs_sc_info *sci, | 1569 | static void nilfs_segctor_prepare_write(struct nilfs_sc_info *sci) |
1628 | struct page **failed_page) | ||
1629 | { | 1570 | { |
1630 | struct nilfs_segment_buffer *segbuf; | 1571 | struct nilfs_segment_buffer *segbuf; |
1631 | struct page *bd_page = NULL, *fs_page = NULL; | 1572 | struct page *bd_page = NULL, *fs_page = NULL; |
1632 | struct list_head *list = &sci->sc_copied_buffers; | ||
1633 | int err; | ||
1634 | 1573 | ||
1635 | *failed_page = NULL; | ||
1636 | list_for_each_entry(segbuf, &sci->sc_segbufs, sb_list) { | 1574 | list_for_each_entry(segbuf, &sci->sc_segbufs, sb_list) { |
1637 | struct buffer_head *bh; | 1575 | struct buffer_head *bh; |
1638 | 1576 | ||
@@ -1662,11 +1600,7 @@ static int nilfs_segctor_prepare_write(struct nilfs_sc_info *sci, | |||
1662 | break; | 1600 | break; |
1663 | } | 1601 | } |
1664 | if (bh->b_page != fs_page) { | 1602 | if (bh->b_page != fs_page) { |
1665 | err = nilfs_begin_page_io(fs_page, list); | 1603 | nilfs_begin_page_io(fs_page); |
1666 | if (unlikely(err)) { | ||
1667 | *failed_page = fs_page; | ||
1668 | goto out; | ||
1669 | } | ||
1670 | fs_page = bh->b_page; | 1604 | fs_page = bh->b_page; |
1671 | } | 1605 | } |
1672 | } | 1606 | } |
@@ -1677,11 +1611,7 @@ static int nilfs_segctor_prepare_write(struct nilfs_sc_info *sci, | |||
1677 | set_page_writeback(bd_page); | 1611 | set_page_writeback(bd_page); |
1678 | unlock_page(bd_page); | 1612 | unlock_page(bd_page); |
1679 | } | 1613 | } |
1680 | err = nilfs_begin_page_io(fs_page, list); | 1614 | nilfs_begin_page_io(fs_page); |
1681 | if (unlikely(err)) | ||
1682 | *failed_page = fs_page; | ||
1683 | out: | ||
1684 | return err; | ||
1685 | } | 1615 | } |
1686 | 1616 | ||
1687 | static int nilfs_segctor_write(struct nilfs_sc_info *sci, | 1617 | static int nilfs_segctor_write(struct nilfs_sc_info *sci, |
@@ -1694,24 +1624,6 @@ static int nilfs_segctor_write(struct nilfs_sc_info *sci, | |||
1694 | return ret; | 1624 | return ret; |
1695 | } | 1625 | } |
1696 | 1626 | ||
1697 | static void __nilfs_end_page_io(struct page *page, int err) | ||
1698 | { | ||
1699 | if (!err) { | ||
1700 | if (!nilfs_page_buffers_clean(page)) | ||
1701 | __set_page_dirty_nobuffers(page); | ||
1702 | ClearPageError(page); | ||
1703 | } else { | ||
1704 | __set_page_dirty_nobuffers(page); | ||
1705 | SetPageError(page); | ||
1706 | } | ||
1707 | |||
1708 | if (buffer_nilfs_allocated(page_buffers(page))) { | ||
1709 | if (TestClearPageWriteback(page)) | ||
1710 | dec_zone_page_state(page, NR_WRITEBACK); | ||
1711 | } else | ||
1712 | end_page_writeback(page); | ||
1713 | } | ||
1714 | |||
1715 | static void nilfs_end_page_io(struct page *page, int err) | 1627 | static void nilfs_end_page_io(struct page *page, int err) |
1716 | { | 1628 | { |
1717 | if (!page) | 1629 | if (!page) |
@@ -1738,40 +1650,19 @@ static void nilfs_end_page_io(struct page *page, int err) | |||
1738 | return; | 1650 | return; |
1739 | } | 1651 | } |
1740 | 1652 | ||
1741 | __nilfs_end_page_io(page, err); | 1653 | if (!err) { |
1742 | } | 1654 | if (!nilfs_page_buffers_clean(page)) |
1743 | 1655 | __set_page_dirty_nobuffers(page); | |
1744 | static void nilfs_clear_copied_buffers(struct list_head *list, int err) | 1656 | ClearPageError(page); |
1745 | { | 1657 | } else { |
1746 | struct buffer_head *bh, *head; | 1658 | __set_page_dirty_nobuffers(page); |
1747 | struct page *page; | 1659 | SetPageError(page); |
1748 | |||
1749 | while (!list_empty(list)) { | ||
1750 | bh = list_entry(list->next, struct buffer_head, | ||
1751 | b_assoc_buffers); | ||
1752 | page = bh->b_page; | ||
1753 | page_cache_get(page); | ||
1754 | head = bh = page_buffers(page); | ||
1755 | do { | ||
1756 | if (!list_empty(&bh->b_assoc_buffers)) { | ||
1757 | list_del_init(&bh->b_assoc_buffers); | ||
1758 | if (!err) { | ||
1759 | set_buffer_uptodate(bh); | ||
1760 | clear_buffer_dirty(bh); | ||
1761 | clear_buffer_delay(bh); | ||
1762 | clear_buffer_nilfs_volatile(bh); | ||
1763 | } | ||
1764 | brelse(bh); /* for b_assoc_buffers */ | ||
1765 | } | ||
1766 | } while ((bh = bh->b_this_page) != head); | ||
1767 | |||
1768 | __nilfs_end_page_io(page, err); | ||
1769 | page_cache_release(page); | ||
1770 | } | 1660 | } |
1661 | |||
1662 | end_page_writeback(page); | ||
1771 | } | 1663 | } |
1772 | 1664 | ||
1773 | static void nilfs_abort_logs(struct list_head *logs, struct page *failed_page, | 1665 | static void nilfs_abort_logs(struct list_head *logs, int err) |
1774 | int err) | ||
1775 | { | 1666 | { |
1776 | struct nilfs_segment_buffer *segbuf; | 1667 | struct nilfs_segment_buffer *segbuf; |
1777 | struct page *bd_page = NULL, *fs_page = NULL; | 1668 | struct page *bd_page = NULL, *fs_page = NULL; |
@@ -1801,8 +1692,6 @@ static void nilfs_abort_logs(struct list_head *logs, struct page *failed_page, | |||
1801 | } | 1692 | } |
1802 | if (bh->b_page != fs_page) { | 1693 | if (bh->b_page != fs_page) { |
1803 | nilfs_end_page_io(fs_page, err); | 1694 | nilfs_end_page_io(fs_page, err); |
1804 | if (fs_page && fs_page == failed_page) | ||
1805 | return; | ||
1806 | fs_page = bh->b_page; | 1695 | fs_page = bh->b_page; |
1807 | } | 1696 | } |
1808 | } | 1697 | } |
@@ -1821,12 +1710,11 @@ static void nilfs_segctor_abort_construction(struct nilfs_sc_info *sci, | |||
1821 | 1710 | ||
1822 | list_splice_tail_init(&sci->sc_write_logs, &logs); | 1711 | list_splice_tail_init(&sci->sc_write_logs, &logs); |
1823 | ret = nilfs_wait_on_logs(&logs); | 1712 | ret = nilfs_wait_on_logs(&logs); |
1824 | nilfs_abort_logs(&logs, NULL, ret ? : err); | 1713 | nilfs_abort_logs(&logs, ret ? : err); |
1825 | 1714 | ||
1826 | list_splice_tail_init(&sci->sc_segbufs, &logs); | 1715 | list_splice_tail_init(&sci->sc_segbufs, &logs); |
1827 | nilfs_cancel_segusage(&logs, nilfs->ns_sufile); | 1716 | nilfs_cancel_segusage(&logs, nilfs->ns_sufile); |
1828 | nilfs_free_incomplete_logs(&logs, nilfs); | 1717 | nilfs_free_incomplete_logs(&logs, nilfs); |
1829 | nilfs_clear_copied_buffers(&sci->sc_copied_buffers, err); | ||
1830 | 1718 | ||
1831 | if (sci->sc_stage.flags & NILFS_CF_SUFREED) { | 1719 | if (sci->sc_stage.flags & NILFS_CF_SUFREED) { |
1832 | ret = nilfs_sufile_cancel_freev(nilfs->ns_sufile, | 1720 | ret = nilfs_sufile_cancel_freev(nilfs->ns_sufile, |
@@ -1920,8 +1808,6 @@ static void nilfs_segctor_complete_write(struct nilfs_sc_info *sci) | |||
1920 | 1808 | ||
1921 | nilfs_end_page_io(fs_page, 0); | 1809 | nilfs_end_page_io(fs_page, 0); |
1922 | 1810 | ||
1923 | nilfs_clear_copied_buffers(&sci->sc_copied_buffers, 0); | ||
1924 | |||
1925 | nilfs_drop_collected_inodes(&sci->sc_dirty_files); | 1811 | nilfs_drop_collected_inodes(&sci->sc_dirty_files); |
1926 | 1812 | ||
1927 | if (nilfs_doing_gc()) | 1813 | if (nilfs_doing_gc()) |
@@ -1979,7 +1865,7 @@ static int nilfs_segctor_collect_dirty_files(struct nilfs_sc_info *sci, | |||
1979 | "failed to get inode block.\n"); | 1865 | "failed to get inode block.\n"); |
1980 | return err; | 1866 | return err; |
1981 | } | 1867 | } |
1982 | nilfs_mdt_mark_buffer_dirty(ibh); | 1868 | mark_buffer_dirty(ibh); |
1983 | nilfs_mdt_mark_dirty(ifile); | 1869 | nilfs_mdt_mark_dirty(ifile); |
1984 | spin_lock(&nilfs->ns_inode_lock); | 1870 | spin_lock(&nilfs->ns_inode_lock); |
1985 | if (likely(!ii->i_bh)) | 1871 | if (likely(!ii->i_bh)) |
@@ -1991,8 +1877,7 @@ static int nilfs_segctor_collect_dirty_files(struct nilfs_sc_info *sci, | |||
1991 | 1877 | ||
1992 | clear_bit(NILFS_I_QUEUED, &ii->i_state); | 1878 | clear_bit(NILFS_I_QUEUED, &ii->i_state); |
1993 | set_bit(NILFS_I_BUSY, &ii->i_state); | 1879 | set_bit(NILFS_I_BUSY, &ii->i_state); |
1994 | list_del(&ii->i_dirty); | 1880 | list_move_tail(&ii->i_dirty, &sci->sc_dirty_files); |
1995 | list_add_tail(&ii->i_dirty, &sci->sc_dirty_files); | ||
1996 | } | 1881 | } |
1997 | spin_unlock(&nilfs->ns_inode_lock); | 1882 | spin_unlock(&nilfs->ns_inode_lock); |
1998 | 1883 | ||
@@ -2014,8 +1899,7 @@ static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci, | |||
2014 | clear_bit(NILFS_I_BUSY, &ii->i_state); | 1899 | clear_bit(NILFS_I_BUSY, &ii->i_state); |
2015 | brelse(ii->i_bh); | 1900 | brelse(ii->i_bh); |
2016 | ii->i_bh = NULL; | 1901 | ii->i_bh = NULL; |
2017 | list_del(&ii->i_dirty); | 1902 | list_move_tail(&ii->i_dirty, &ti->ti_garbage); |
2018 | list_add_tail(&ii->i_dirty, &ti->ti_garbage); | ||
2019 | } | 1903 | } |
2020 | spin_unlock(&nilfs->ns_inode_lock); | 1904 | spin_unlock(&nilfs->ns_inode_lock); |
2021 | } | 1905 | } |
@@ -2026,7 +1910,6 @@ static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci, | |||
2026 | static int nilfs_segctor_do_construct(struct nilfs_sc_info *sci, int mode) | 1910 | static int nilfs_segctor_do_construct(struct nilfs_sc_info *sci, int mode) |
2027 | { | 1911 | { |
2028 | struct the_nilfs *nilfs = sci->sc_super->s_fs_info; | 1912 | struct the_nilfs *nilfs = sci->sc_super->s_fs_info; |
2029 | struct page *failed_page; | ||
2030 | int err; | 1913 | int err; |
2031 | 1914 | ||
2032 | sci->sc_stage.scnt = NILFS_ST_INIT; | 1915 | sci->sc_stage.scnt = NILFS_ST_INIT; |
@@ -2081,11 +1964,7 @@ static int nilfs_segctor_do_construct(struct nilfs_sc_info *sci, int mode) | |||
2081 | nilfs_segctor_update_segusage(sci, nilfs->ns_sufile); | 1964 | nilfs_segctor_update_segusage(sci, nilfs->ns_sufile); |
2082 | 1965 | ||
2083 | /* Write partial segments */ | 1966 | /* Write partial segments */ |
2084 | err = nilfs_segctor_prepare_write(sci, &failed_page); | 1967 | nilfs_segctor_prepare_write(sci); |
2085 | if (err) { | ||
2086 | nilfs_abort_logs(&sci->sc_segbufs, failed_page, err); | ||
2087 | goto failed_to_write; | ||
2088 | } | ||
2089 | 1968 | ||
2090 | nilfs_add_checksums_on_logs(&sci->sc_segbufs, | 1969 | nilfs_add_checksums_on_logs(&sci->sc_segbufs, |
2091 | nilfs->ns_crc_seed); | 1970 | nilfs->ns_crc_seed); |
@@ -2687,7 +2566,6 @@ static struct nilfs_sc_info *nilfs_segctor_new(struct super_block *sb, | |||
2687 | INIT_LIST_HEAD(&sci->sc_segbufs); | 2566 | INIT_LIST_HEAD(&sci->sc_segbufs); |
2688 | INIT_LIST_HEAD(&sci->sc_write_logs); | 2567 | INIT_LIST_HEAD(&sci->sc_write_logs); |
2689 | INIT_LIST_HEAD(&sci->sc_gc_inodes); | 2568 | INIT_LIST_HEAD(&sci->sc_gc_inodes); |
2690 | INIT_LIST_HEAD(&sci->sc_copied_buffers); | ||
2691 | init_timer(&sci->sc_timer); | 2569 | init_timer(&sci->sc_timer); |
2692 | 2570 | ||
2693 | sci->sc_interval = HZ * NILFS_SC_DEFAULT_TIMEOUT; | 2571 | sci->sc_interval = HZ * NILFS_SC_DEFAULT_TIMEOUT; |
@@ -2741,8 +2619,6 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) | |||
2741 | if (flag || !nilfs_segctor_confirm(sci)) | 2619 | if (flag || !nilfs_segctor_confirm(sci)) |
2742 | nilfs_segctor_write_out(sci); | 2620 | nilfs_segctor_write_out(sci); |
2743 | 2621 | ||
2744 | WARN_ON(!list_empty(&sci->sc_copied_buffers)); | ||
2745 | |||
2746 | if (!list_empty(&sci->sc_dirty_files)) { | 2622 | if (!list_empty(&sci->sc_dirty_files)) { |
2747 | nilfs_warning(sci->sc_super, __func__, | 2623 | nilfs_warning(sci->sc_super, __func__, |
2748 | "dirty file(s) after the final construction\n"); | 2624 | "dirty file(s) after the final construction\n"); |