#include "err_protos.h"
#include "threads.h"
-/* ba bmap setupstuff. setting/getting state is in incore.h */
-void
-setup_bmap(xfs_agnumber_t agno, xfs_agblock_t numblocks, xfs_drtbno_t rtblocks)
-{
- int i;
- size_t size = 0;
-
- ba_bmap = (__uint64_t**)malloc(agno*sizeof(__uint64_t *));
- if (!ba_bmap)
- do_error(_("couldn't allocate block map pointers\n"));
- ag_locks = malloc(agno * sizeof(pthread_mutex_t));
- if (!ag_locks)
- do_error(_("couldn't allocate block map locks\n"));
-
- for (i = 0; i < agno; i++) {
- size = roundup((numblocks+(NBBY/XR_BB)-1) / (NBBY/XR_BB),
- sizeof(__uint64_t));
+static size_t rt_bmap_size;
- ba_bmap[i] = (__uint64_t*)memalign(sizeof(__uint64_t), size);
- if (!ba_bmap[i]) {
- do_error(_("couldn't allocate block map, size = %d\n"),
- numblocks);
- return;
- }
- memset(ba_bmap[i], 0, size);
- pthread_mutex_init(&ag_locks[i], NULL);
- }
+static void
+reset_rt_bmap(void)
+{
+ if (rt_ba_bmap)
+ memset(rt_ba_bmap, 0x22, rt_bmap_size); /* XR_E_FREE */
+}
- if (rtblocks == 0) {
- rt_ba_bmap = NULL;
+static void
+init_rt_bmap(
+ xfs_mount_t *mp)
+{
+ if (mp->m_sb.sb_rextents == 0)
return;
- }
- size = roundup(rtblocks / (NBBY/XR_BB), sizeof(__uint64_t));
+ rt_bmap_size = roundup(mp->m_sb.sb_rextents / (NBBY / XR_BB),
+ sizeof(__uint64_t));
- rt_ba_bmap=(__uint64_t*)memalign(sizeof(__uint64_t), size);
+ rt_ba_bmap = memalign(sizeof(__uint64_t), rt_bmap_size);
if (!rt_ba_bmap) {
- do_error(
+ do_error(
_("couldn't allocate realtime block map, size = %llu\n"),
- rtblocks);
- return;
- }
-
- /*
- * start all real-time as free blocks
- */
- set_bmap_rt(rtblocks);
-
- return;
-}
-
-/* ARGSUSED */
-void
-teardown_rt_bmap(xfs_mount_t *mp)
-{
- if (rt_ba_bmap != NULL) {
- free(rt_ba_bmap);
- rt_ba_bmap = NULL;
+ mp->m_sb.sb_rextents);
+ return;
}
-
- return;
}
-/* ARGSUSED */
-void
-teardown_ag_bmap(xfs_mount_t *mp, xfs_agnumber_t agno)
+static void
+free_rt_bmap(xfs_mount_t *mp)
{
- ASSERT(ba_bmap[agno] != NULL);
-
- free(ba_bmap[agno]);
- ba_bmap[agno] = NULL;
-
- return;
+ free(rt_ba_bmap);
+ rt_ba_bmap = NULL;
}
-/* ARGSUSED */
-void
-teardown_bmap_finish(xfs_mount_t *mp)
-{
- free(ba_bmap);
- ba_bmap = NULL;
-
- return;
-}
void
-teardown_bmap(xfs_mount_t *mp)
+reset_bmaps(xfs_mount_t *mp)
{
- xfs_agnumber_t i;
-
- for (i = 0; i < mp->m_sb.sb_agcount; i++) {
- teardown_ag_bmap(mp, i);
+ xfs_agnumber_t agno;
+ int ag_hdr_block;
+ int i;
+
+ ag_hdr_block = howmany(4 * mp->m_sb.sb_sectsize, mp->m_sb.sb_blocksize);
+
+ for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) {
+ memset(ba_bmap[agno], 0,
+ roundup((mp->m_sb.sb_agblocks + (NBBY / XR_BB) - 1) /
+ (NBBY / XR_BB), sizeof(__uint64_t)));
+ for (i = 0; i < ag_hdr_block; i++)
+ set_bmap(agno, i, XR_E_INUSE_FS);
}
- teardown_rt_bmap(mp);
- teardown_bmap_finish(mp);
+ if (mp->m_sb.sb_logstart != 0) {
+ xfs_dfsbno_t logend;
- return;
-}
-
-/*
- * block map initialization routines -- realtime, log, fs
- */
-void
-set_bmap_rt(xfs_drtbno_t num)
-{
- xfs_drtbno_t j;
- xfs_drtbno_t size;
-
- /*
- * for now, initialize all realtime blocks to be free
- * (state == XR_E_FREE)
- */
- size = howmany(num / (NBBY/XR_BB), sizeof(__uint64_t));
-
- for (j = 0; j < size; j++)
- rt_ba_bmap[j] = 0x2222222222222222LL;
-
- return;
-}
-
-void
-set_bmap_log(xfs_mount_t *mp)
-{
- xfs_dfsbno_t logend, i;
-
- if (mp->m_sb.sb_logstart == 0)
- return;
-
- logend = mp->m_sb.sb_logstart + mp->m_sb.sb_logblocks;
+ logend = mp->m_sb.sb_logstart + mp->m_sb.sb_logblocks;
- for (i = mp->m_sb.sb_logstart; i < logend ; i++) {
- set_bmap(XFS_FSB_TO_AGNO(mp, i),
- XFS_FSB_TO_AGBNO(mp, i), XR_E_INUSE_FS);
+ for (i = mp->m_sb.sb_logstart; i < logend ; i++) {
+ set_bmap(XFS_FSB_TO_AGNO(mp, i),
+ XFS_FSB_TO_AGBNO(mp, i), XR_E_INUSE_FS);
+ }
}
- return;
+ reset_rt_bmap();
}
void
-set_bmap_fs(xfs_mount_t *mp)
+init_bmaps(xfs_mount_t *mp)
{
- xfs_agnumber_t i;
- xfs_agblock_t j;
- xfs_agblock_t end;
+ xfs_agblock_t numblocks = mp->m_sb.sb_agblocks;
+ int agcount = mp->m_sb.sb_agcount;
+ int i;
+ size_t size = 0;
- /*
- * AG header is 4 sectors
- */
- end = howmany(4 * mp->m_sb.sb_sectsize, mp->m_sb.sb_blocksize);
+ ba_bmap = calloc(agcount, sizeof(__uint64_t *));
+ if (!ba_bmap)
+ do_error(_("couldn't allocate block map pointers\n"));
- for (i = 0; i < mp->m_sb.sb_agcount; i++)
- for (j = 0; j < end; j++)
- set_bmap(i, j, XR_E_INUSE_FS);
+ ag_locks = calloc(agcount, sizeof(pthread_mutex_t));
+ if (!ag_locks)
+ do_error(_("couldn't allocate block map locks\n"));
- return;
-}
+ for (i = 0; i < agcount; i++) {
+ size = roundup((numblocks+(NBBY/XR_BB)-1) / (NBBY/XR_BB),
+ sizeof(__uint64_t));
-#if 0
-void
-set_bmap_fs_bt(xfs_mount_t *mp)
-{
- xfs_agnumber_t i;
- xfs_agblock_t j;
- xfs_agblock_t begin;
- xfs_agblock_t end;
-
- begin = bnobt_root;
- end = inobt_root + 1;
-
- for (i = 0; i < mp->m_sb.sb_agcount; i++) {
- /*
- * account for btree roots
- */
- for (j = begin; j < end; j++)
- set_bmap(i, j, XR_E_INUSE_FS);
+ ba_bmap[i] = memalign(sizeof(__uint64_t), size);
+ if (!ba_bmap[i]) {
+ do_error(_("couldn't allocate block map, size = %d\n"),
+ numblocks);
+ return;
+ }
+ memset(ba_bmap[i], 0, size);
+ pthread_mutex_init(&ag_locks[i], NULL);
}
- return;
+ init_rt_bmap(mp);
+ reset_bmaps(mp);
}
-#endif
void
-incore_init(xfs_mount_t *mp)
+free_bmaps(xfs_mount_t *mp)
{
- int agcount = mp->m_sb.sb_agcount;
- extern void incore_ino_init(xfs_mount_t *);
- extern void incore_ext_init(xfs_mount_t *);
-
- /* init block alloc bmap */
-
- setup_bmap(agcount, mp->m_sb.sb_agblocks, mp->m_sb.sb_rextents);
- incore_ino_init(mp);
- incore_ext_init(mp);
-
- /* initialize random globals now that we know the fs geometry */
+ xfs_agnumber_t i;
- inodes_per_block = mp->m_sb.sb_inopblock;
+ for (i = 0; i < mp->m_sb.sb_agcount; i++)
+ free(ba_bmap[i]);
+ free(ba_bmap);
+ ba_bmap = NULL;
- return;
+ free_rt_bmap(mp);
}