xfs: add CRC checks to the AGI
[linux-2.6-block.git] / fs / xfs / xfs_fsops.c
index 2866b8c78b7adf9f2cfa9d5feed4386d46a4c804..87595b211da10743bbd07c7be8b4fd44d9f8212b 100644 (file)
@@ -247,6 +247,9 @@ xfs_growfs_data_private(
                tmpsize = agsize - XFS_PREALLOC_BLOCKS(mp);
                agf->agf_freeblks = cpu_to_be32(tmpsize);
                agf->agf_longest = cpu_to_be32(tmpsize);
+               if (xfs_sb_version_hascrc(&mp->m_sb))
+                       uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_uuid);
+
                error = xfs_bwrite(bp);
                xfs_buf_relse(bp);
                if (error)
@@ -265,6 +268,11 @@ xfs_growfs_data_private(
                }
 
                agfl = XFS_BUF_TO_AGFL(bp);
+               if (xfs_sb_version_hascrc(&mp->m_sb)) {
+                       agfl->agfl_magicnum = cpu_to_be32(XFS_AGFL_MAGIC);
+                       agfl->agfl_seqno = cpu_to_be32(agno);
+                       uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_uuid);
+               }
                for (bucket = 0; bucket < XFS_AGFL_SIZE(mp); bucket++)
                        agfl->agfl_bno[bucket] = cpu_to_be32(NULLAGBLOCK);
 
@@ -296,8 +304,11 @@ xfs_growfs_data_private(
                agi->agi_freecount = 0;
                agi->agi_newino = cpu_to_be32(NULLAGINO);
                agi->agi_dirino = cpu_to_be32(NULLAGINO);
+               if (xfs_sb_version_hascrc(&mp->m_sb))
+                       uuid_copy(&agi->agi_uuid, &mp->m_sb.sb_uuid);
                for (bucket = 0; bucket < XFS_AGI_UNLINKED_BUCKETS; bucket++)
                        agi->agi_unlinked[bucket] = cpu_to_be32(NULLAGINO);
+
                error = xfs_bwrite(bp);
                xfs_buf_relse(bp);
                if (error)
@@ -316,7 +327,13 @@ xfs_growfs_data_private(
                        goto error0;
                }
 
-               xfs_btree_init_block(mp, bp, XFS_ABTB_MAGIC, 0, 1, 0);
+               if (xfs_sb_version_hascrc(&mp->m_sb))
+                       xfs_btree_init_block(mp, bp, XFS_ABTB_CRC_MAGIC, 0, 1,
+                                               agno, XFS_BTREE_CRC_BLOCKS);
+               else
+                       xfs_btree_init_block(mp, bp, XFS_ABTB_MAGIC, 0, 1,
+                                               agno, 0);
+
                arec = XFS_ALLOC_REC_ADDR(mp, XFS_BUF_TO_BLOCK(bp), 1);
                arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp));
                arec->ar_blockcount = cpu_to_be32(
@@ -339,7 +356,13 @@ xfs_growfs_data_private(
                        goto error0;
                }
 
-               xfs_btree_init_block(mp, bp, XFS_ABTC_MAGIC, 0, 1, 0);
+               if (xfs_sb_version_hascrc(&mp->m_sb))
+                       xfs_btree_init_block(mp, bp, XFS_ABTC_CRC_MAGIC, 0, 1,
+                                               agno, XFS_BTREE_CRC_BLOCKS);
+               else
+                       xfs_btree_init_block(mp, bp, XFS_ABTC_MAGIC, 0, 1,
+                                               agno, 0);
+
                arec = XFS_ALLOC_REC_ADDR(mp, XFS_BUF_TO_BLOCK(bp), 1);
                arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp));
                arec->ar_blockcount = cpu_to_be32(
@@ -363,7 +386,12 @@ xfs_growfs_data_private(
                        goto error0;
                }
 
-               xfs_btree_init_block(mp, bp, XFS_IBT_MAGIC, 0, 0, 0);
+               if (xfs_sb_version_hascrc(&mp->m_sb))
+                       xfs_btree_init_block(mp, bp, XFS_IBT_CRC_MAGIC, 0, 0,
+                                               agno, XFS_BTREE_CRC_BLOCKS);
+               else
+                       xfs_btree_init_block(mp, bp, XFS_IBT_MAGIC, 0, 0,
+                                               agno, 0);
 
                error = xfs_bwrite(bp);
                xfs_buf_relse(bp);