aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2010-12-01 17:06:21 -0500
committerAlex Elder <aelder@sgi.com>2010-12-16 17:05:16 -0500
commite2714bf8d5c8e131a6df6b0ea2269433e9a03a9b (patch)
tree2e056b611bcad732b828df1c563f2fa9cca16e11
parent576ecb8e2b725726471cc62b12c01e28d33127ba (diff)
xfs: remove leftovers of old buffer log items in recovery code
XFS used to support different types of buffer log items long time ago. Remove the switch statements checking the log item type in various buffer recovery helpers that were left over from those days and the rather useless xlog_recover_do_buffer_pass2 wrapper. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Alex Elder <aelder@sgi.com>
-rw-r--r--fs/xfs/xfs_log_recover.c155
1 files changed, 40 insertions, 115 deletions
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index 966d3f97458c..e51d93db1b0b 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -1614,22 +1614,13 @@ xlog_recover_do_buffer_pass1(
1614 xfs_buf_cancel_t *nextp; 1614 xfs_buf_cancel_t *nextp;
1615 xfs_buf_cancel_t *prevp; 1615 xfs_buf_cancel_t *prevp;
1616 xfs_buf_cancel_t **bucket; 1616 xfs_buf_cancel_t **bucket;
1617 xfs_daddr_t blkno = 0; 1617 xfs_daddr_t blkno = buf_f->blf_blkno;
1618 uint len = 0; 1618 uint len = buf_f->blf_len;
1619 ushort flags = 0;
1620
1621 switch (buf_f->blf_type) {
1622 case XFS_LI_BUF:
1623 blkno = buf_f->blf_blkno;
1624 len = buf_f->blf_len;
1625 flags = buf_f->blf_flags;
1626 break;
1627 }
1628 1619
1629 /* 1620 /*
1630 * If this isn't a cancel buffer item, then just return. 1621 * If this isn't a cancel buffer item, then just return.
1631 */ 1622 */
1632 if (!(flags & XFS_BLF_CANCEL)) { 1623 if (!(buf_f->blf_flags & XFS_BLF_CANCEL)) {
1633 trace_xfs_log_recover_buf_not_cancel(log, buf_f); 1624 trace_xfs_log_recover_buf_not_cancel(log, buf_f);
1634 return; 1625 return;
1635 } 1626 }
@@ -1767,77 +1758,38 @@ xlog_check_buffer_cancelled(
1767 return 0; 1758 return 0;
1768} 1759}
1769 1760
1770STATIC int
1771xlog_recover_do_buffer_pass2(
1772 xlog_t *log,
1773 xfs_buf_log_format_t *buf_f)
1774{
1775 xfs_daddr_t blkno = 0;
1776 ushort flags = 0;
1777 uint len = 0;
1778
1779 switch (buf_f->blf_type) {
1780 case XFS_LI_BUF:
1781 blkno = buf_f->blf_blkno;
1782 flags = buf_f->blf_flags;
1783 len = buf_f->blf_len;
1784 break;
1785 }
1786
1787 return xlog_check_buffer_cancelled(log, blkno, len, flags);
1788}
1789
1790/* 1761/*
1791 * Perform recovery for a buffer full of inodes. In these buffers, 1762 * Perform recovery for a buffer full of inodes. In these buffers, the only
1792 * the only data which should be recovered is that which corresponds 1763 * data which should be recovered is that which corresponds to the
1793 * to the di_next_unlinked pointers in the on disk inode structures. 1764 * di_next_unlinked pointers in the on disk inode structures. The rest of the
1794 * The rest of the data for the inodes is always logged through the 1765 * data for the inodes is always logged through the inodes themselves rather
1795 * inodes themselves rather than the inode buffer and is recovered 1766 * than the inode buffer and is recovered in xlog_recover_inode_pass2().
1796 * in xlog_recover_do_inode_trans().
1797 * 1767 *
1798 * The only time when buffers full of inodes are fully recovered is 1768 * The only time when buffers full of inodes are fully recovered is when the
1799 * when the buffer is full of newly allocated inodes. In this case 1769 * buffer is full of newly allocated inodes. In this case the buffer will
1800 * the buffer will not be marked as an inode buffer and so will be 1770 * not be marked as an inode buffer and so will be sent to
1801 * sent to xlog_recover_do_reg_buffer() below during recovery. 1771 * xlog_recover_do_reg_buffer() below during recovery.
1802 */ 1772 */
1803STATIC int 1773STATIC int
1804xlog_recover_do_inode_buffer( 1774xlog_recover_do_inode_buffer(
1805 xfs_mount_t *mp, 1775 struct xfs_mount *mp,
1806 xlog_recover_item_t *item, 1776 xlog_recover_item_t *item,
1807 xfs_buf_t *bp, 1777 struct xfs_buf *bp,
1808 xfs_buf_log_format_t *buf_f) 1778 xfs_buf_log_format_t *buf_f)
1809{ 1779{
1810 int i; 1780 int i;
1811 int item_index; 1781 int item_index = 0;
1812 int bit; 1782 int bit = 0;
1813 int nbits; 1783 int nbits = 0;
1814 int reg_buf_offset; 1784 int reg_buf_offset = 0;
1815 int reg_buf_bytes; 1785 int reg_buf_bytes = 0;
1816 int next_unlinked_offset; 1786 int next_unlinked_offset;
1817 int inodes_per_buf; 1787 int inodes_per_buf;
1818 xfs_agino_t *logged_nextp; 1788 xfs_agino_t *logged_nextp;
1819 xfs_agino_t *buffer_nextp; 1789 xfs_agino_t *buffer_nextp;
1820 unsigned int *data_map = NULL;
1821 unsigned int map_size = 0;
1822 1790
1823 trace_xfs_log_recover_buf_inode_buf(mp->m_log, buf_f); 1791 trace_xfs_log_recover_buf_inode_buf(mp->m_log, buf_f);
1824 1792
1825 switch (buf_f->blf_type) {
1826 case XFS_LI_BUF:
1827 data_map = buf_f->blf_data_map;
1828 map_size = buf_f->blf_map_size;
1829 break;
1830 }
1831 /*
1832 * Set the variables corresponding to the current region to
1833 * 0 so that we'll initialize them on the first pass through
1834 * the loop.
1835 */
1836 reg_buf_offset = 0;
1837 reg_buf_bytes = 0;
1838 bit = 0;
1839 nbits = 0;
1840 item_index = 0;
1841 inodes_per_buf = XFS_BUF_COUNT(bp) >> mp->m_sb.sb_inodelog; 1793 inodes_per_buf = XFS_BUF_COUNT(bp) >> mp->m_sb.sb_inodelog;
1842 for (i = 0; i < inodes_per_buf; i++) { 1794 for (i = 0; i < inodes_per_buf; i++) {
1843 next_unlinked_offset = (i * mp->m_sb.sb_inodesize) + 1795 next_unlinked_offset = (i * mp->m_sb.sb_inodesize) +
@@ -1852,18 +1804,18 @@ xlog_recover_do_inode_buffer(
1852 * the current di_next_unlinked field. 1804 * the current di_next_unlinked field.
1853 */ 1805 */
1854 bit += nbits; 1806 bit += nbits;
1855 bit = xfs_next_bit(data_map, map_size, bit); 1807 bit = xfs_next_bit(buf_f->blf_data_map,
1808 buf_f->blf_map_size, bit);
1856 1809
1857 /* 1810 /*
1858 * If there are no more logged regions in the 1811 * If there are no more logged regions in the
1859 * buffer, then we're done. 1812 * buffer, then we're done.
1860 */ 1813 */
1861 if (bit == -1) { 1814 if (bit == -1)
1862 return 0; 1815 return 0;
1863 }
1864 1816
1865 nbits = xfs_contig_bits(data_map, map_size, 1817 nbits = xfs_contig_bits(buf_f->blf_data_map,
1866 bit); 1818 buf_f->blf_map_size, bit);
1867 ASSERT(nbits > 0); 1819 ASSERT(nbits > 0);
1868 reg_buf_offset = bit << XFS_BLF_SHIFT; 1820 reg_buf_offset = bit << XFS_BLF_SHIFT;
1869 reg_buf_bytes = nbits << XFS_BLF_SHIFT; 1821 reg_buf_bytes = nbits << XFS_BLF_SHIFT;
@@ -1875,9 +1827,8 @@ xlog_recover_do_inode_buffer(
1875 * di_next_unlinked field, then move on to the next 1827 * di_next_unlinked field, then move on to the next
1876 * di_next_unlinked field. 1828 * di_next_unlinked field.
1877 */ 1829 */
1878 if (next_unlinked_offset < reg_buf_offset) { 1830 if (next_unlinked_offset < reg_buf_offset)
1879 continue; 1831 continue;
1880 }
1881 1832
1882 ASSERT(item->ri_buf[item_index].i_addr != NULL); 1833 ASSERT(item->ri_buf[item_index].i_addr != NULL);
1883 ASSERT((item->ri_buf[item_index].i_len % XFS_BLF_CHUNK) == 0); 1834 ASSERT((item->ri_buf[item_index].i_len % XFS_BLF_CHUNK) == 0);
@@ -1913,36 +1864,29 @@ xlog_recover_do_inode_buffer(
1913 * given buffer. The bitmap in the buf log format structure indicates 1864 * given buffer. The bitmap in the buf log format structure indicates
1914 * where to place the logged data. 1865 * where to place the logged data.
1915 */ 1866 */
1916/*ARGSUSED*/
1917STATIC void 1867STATIC void
1918xlog_recover_do_reg_buffer( 1868xlog_recover_do_reg_buffer(
1919 struct xfs_mount *mp, 1869 struct xfs_mount *mp,
1920 xlog_recover_item_t *item, 1870 xlog_recover_item_t *item,
1921 xfs_buf_t *bp, 1871 struct xfs_buf *bp,
1922 xfs_buf_log_format_t *buf_f) 1872 xfs_buf_log_format_t *buf_f)
1923{ 1873{
1924 int i; 1874 int i;
1925 int bit; 1875 int bit;
1926 int nbits; 1876 int nbits;
1927 unsigned int *data_map = NULL;
1928 unsigned int map_size = 0;
1929 int error; 1877 int error;
1930 1878
1931 trace_xfs_log_recover_buf_reg_buf(mp->m_log, buf_f); 1879 trace_xfs_log_recover_buf_reg_buf(mp->m_log, buf_f);
1932 1880
1933 switch (buf_f->blf_type) {
1934 case XFS_LI_BUF:
1935 data_map = buf_f->blf_data_map;
1936 map_size = buf_f->blf_map_size;
1937 break;
1938 }
1939 bit = 0; 1881 bit = 0;
1940 i = 1; /* 0 is the buf format structure */ 1882 i = 1; /* 0 is the buf format structure */
1941 while (1) { 1883 while (1) {
1942 bit = xfs_next_bit(data_map, map_size, bit); 1884 bit = xfs_next_bit(buf_f->blf_data_map,
1885 buf_f->blf_map_size, bit);
1943 if (bit == -1) 1886 if (bit == -1)
1944 break; 1887 break;
1945 nbits = xfs_contig_bits(data_map, map_size, bit); 1888 nbits = xfs_contig_bits(buf_f->blf_data_map,
1889 buf_f->blf_map_size, bit);
1946 ASSERT(nbits > 0); 1890 ASSERT(nbits > 0);
1947 ASSERT(item->ri_buf[i].i_addr != NULL); 1891 ASSERT(item->ri_buf[i].i_addr != NULL);
1948 ASSERT(item->ri_buf[i].i_len % XFS_BLF_CHUNK == 0); 1892 ASSERT(item->ri_buf[i].i_len % XFS_BLF_CHUNK == 0);
@@ -2182,13 +2126,9 @@ xlog_recover_do_buffer_trans(
2182 int pass) 2126 int pass)
2183{ 2127{
2184 xfs_buf_log_format_t *buf_f = item->ri_buf[0].i_addr; 2128 xfs_buf_log_format_t *buf_f = item->ri_buf[0].i_addr;
2185 xfs_mount_t *mp; 2129 xfs_mount_t *mp = log->l_mp;
2186 xfs_buf_t *bp; 2130 xfs_buf_t *bp;
2187 int error; 2131 int error;
2188 int cancel;
2189 xfs_daddr_t blkno;
2190 int len;
2191 ushort flags;
2192 uint buf_flags; 2132 uint buf_flags;
2193 2133
2194 if (pass == XLOG_RECOVER_PASS1) { 2134 if (pass == XLOG_RECOVER_PASS1) {
@@ -2206,47 +2146,32 @@ xlog_recover_do_buffer_trans(
2206 * we call here will tell us whether or not to 2146 * we call here will tell us whether or not to
2207 * continue with the replay of this buffer. 2147 * continue with the replay of this buffer.
2208 */ 2148 */
2209 cancel = xlog_recover_do_buffer_pass2(log, buf_f); 2149 if (xlog_check_buffer_cancelled(log, buf_f->blf_blkno,
2210 if (cancel) { 2150 buf_f->blf_len, buf_f->blf_flags)) {
2211 trace_xfs_log_recover_buf_cancel(log, buf_f); 2151 trace_xfs_log_recover_buf_cancel(log, buf_f);
2212 return 0; 2152 return 0;
2213 } 2153 }
2214 } 2154 }
2215 trace_xfs_log_recover_buf_recover(log, buf_f); 2155 trace_xfs_log_recover_buf_recover(log, buf_f);
2216 switch (buf_f->blf_type) {
2217 case XFS_LI_BUF:
2218 blkno = buf_f->blf_blkno;
2219 len = buf_f->blf_len;
2220 flags = buf_f->blf_flags;
2221 break;
2222 default:
2223 xfs_fs_cmn_err(CE_ALERT, log->l_mp,
2224 "xfs_log_recover: unknown buffer type 0x%x, logdev %s",
2225 buf_f->blf_type, log->l_mp->m_logname ?
2226 log->l_mp->m_logname : "internal");
2227 XFS_ERROR_REPORT("xlog_recover_do_buffer_trans",
2228 XFS_ERRLEVEL_LOW, log->l_mp);
2229 return XFS_ERROR(EFSCORRUPTED);
2230 }
2231 2156
2232 mp = log->l_mp;
2233 buf_flags = XBF_LOCK; 2157 buf_flags = XBF_LOCK;
2234 if (!(flags & XFS_BLF_INODE_BUF)) 2158 if (!(buf_f->blf_flags & XFS_BLF_INODE_BUF))
2235 buf_flags |= XBF_MAPPED; 2159 buf_flags |= XBF_MAPPED;
2236 2160
2237 bp = xfs_buf_read(mp->m_ddev_targp, blkno, len, buf_flags); 2161 bp = xfs_buf_read(mp->m_ddev_targp, buf_f->blf_blkno, buf_f->blf_len,
2162 buf_flags);
2238 if (XFS_BUF_ISERROR(bp)) { 2163 if (XFS_BUF_ISERROR(bp)) {
2239 xfs_ioerror_alert("xlog_recover_do..(read#1)", log->l_mp, 2164 xfs_ioerror_alert("xlog_recover_do..(read#1)", mp,
2240 bp, blkno); 2165 bp, buf_f->blf_blkno);
2241 error = XFS_BUF_GETERROR(bp); 2166 error = XFS_BUF_GETERROR(bp);
2242 xfs_buf_relse(bp); 2167 xfs_buf_relse(bp);
2243 return error; 2168 return error;
2244 } 2169 }
2245 2170
2246 error = 0; 2171 error = 0;
2247 if (flags & XFS_BLF_INODE_BUF) { 2172 if (buf_f->blf_flags & XFS_BLF_INODE_BUF) {
2248 error = xlog_recover_do_inode_buffer(mp, item, bp, buf_f); 2173 error = xlog_recover_do_inode_buffer(mp, item, bp, buf_f);
2249 } else if (flags & 2174 } else if (buf_f->blf_flags &
2250 (XFS_BLF_UDQUOT_BUF|XFS_BLF_PDQUOT_BUF|XFS_BLF_GDQUOT_BUF)) { 2175 (XFS_BLF_UDQUOT_BUF|XFS_BLF_PDQUOT_BUF|XFS_BLF_GDQUOT_BUF)) {
2251 xlog_recover_do_dquot_buffer(mp, log, item, bp, buf_f); 2176 xlog_recover_do_dquot_buffer(mp, log, item, bp, buf_f);
2252 } else { 2177 } else {