return (clearit);
}
-/*
- * freespace map for directory and attribute leaf blocks (1 bit per byte)
- * 1 == used, 0 == free
- */
-size_t ts_attr_freemap_size = sizeof(da_freemap_t) * DA_BMAP_SIZE;
-
/* The block is read in. The magic number and forward / backward
* links are checked by the caller process_leaf_attr.
* If any problems occur the routine returns with non-zero. In
{
xfs_attr_leaf_entry_t *entry;
int i, start, stop, clearit, usedbs, firstb, thissize;
- da_freemap_t *attr_freemap = ts_attr_freemap();
+ da_freemap_t *attr_freemap;
clearit = usedbs = 0;
*repair = 0;
return (1);
}
- init_da_freemap(attr_freemap);
+ attr_freemap = alloc_da_freemap(mp);
(void) set_da_freemap(mp, attr_freemap, 0, stop);
/* go thru each entry checking for problems */
* we can add it then.
*/
}
+
+ free(attr_freemap);
return (clearit); /* and repair */
}
}
/*
- * freespace map for directory leaf blocks (1 bit per byte)
- * 1 == used, 0 == free
+ * Allocate a freespace map for directory or attr leaf blocks (1 bit per byte)
+ * 1 == used, 0 == free.
*/
-size_t ts_dir_freemap_size = sizeof(da_freemap_t) * DA_BMAP_SIZE;
-
-void
-init_da_freemap(da_freemap_t *dir_freemap)
+da_freemap_t *
+alloc_da_freemap(struct xfs_mount *mp)
{
- memset(dir_freemap, 0, sizeof(da_freemap_t) * DA_BMAP_SIZE);
+ return calloc(1, mp->m_sb.sb_blocksize / NBBY);
}
/*
- * sets directory freemap, returns 1 if there is a conflict
- * returns 0 if everything's good. the range [start, stop) is set.
- * right now, we just use the static array since only one directory
- * block will be processed at once even though the interface allows
- * you to pass in arbitrary da_freemap_t array's.
+ * Set the he range [start, stop) in the directory freemap.
+ *
+ * Returns 1 if there is a conflict or 0 if everything's good.
*
* Within a char, the lowest bit of the char represents the byte with
* the smallest address
return(res);
}
-#if 0
-void
-test(xfs_mount_t *mp)
-{
- int i = 0;
- da_hole_map_t holemap;
-
- init_da_freemap(dir_freemap);
- memset(&holemap, 0, sizeof(da_hole_map_t));
-
- set_da_freemap(mp, dir_freemap, 0, 50);
- set_da_freemap(mp, dir_freemap, 100, 126);
- set_da_freemap(mp, dir_freemap, 126, 129);
- set_da_freemap(mp, dir_freemap, 130, 131);
- set_da_freemap(mp, dir_freemap, 150, 160);
- process_da_freemap(mp, dir_freemap, &holemap);
-
- return;
-}
-#endif
-
-
/*
* walk tree from root to the left-most leaf block reading in
* blocks and setting up cursor. passes back file block number of the
return(0);
}
-size_t ts_dirbuf_size = 64*1024;
-
/*
* called by both node dir and leaf dir processing routines
* validates all contents *but* the sibling pointers (forw/back)
char fname[MAXNAMELEN + 1];
da_hole_map_t holemap;
da_hole_map_t bholemap;
- unsigned char *dir_freemap = ts_dir_freemap();
+ da_freemap_t *dir_freemap;
#ifdef XR_DIR_TRACE
fprintf(stderr, "\tprocess_leaf_dir_block - ino %" PRIu64 "\n", ino);
/*
* clear static dir block freespace bitmap
*/
- init_da_freemap(dir_freemap);
+ dir_freemap = alloc_da_freemap(mp);
*buf_dirty = 0;
first_used = mp->m_sb.sb_blocksize;
do_warn(
_("directory block header conflicts with used space in directory inode %" PRIu64 "\n"),
ino);
- return(1);
+ res = 1;
+ goto out;
}
/*
do_warn(
_("bad size, entry #%d in dir inode %" PRIu64 ", block %u -- entry overflows block\n"),
i, ino, da_bno);
-
- return(1);
+ res = 1;
+ goto out;
}
start = (__psint_t)&leaf->entries[i] - (__psint_t)leaf;;
do_warn(
_("dir entry slot %d in block %u conflicts with used space in dir inode %" PRIu64 "\n"),
i, da_bno, ino);
- return(1);
+ res = 1;
+ goto out;
}
/*
_("- compacting block %u in dir inode %" PRIu64 "\n"),
da_bno, ino);
- new_leaf = (xfs_dir_leafblock_t *) ts_dirbuf();
+ new_leaf = malloc(mp->m_sb.sb_blocksize);
/*
* copy leaf block header
do_warn(
_("not enough space in block %u of dir inode %" PRIu64 " for all entries\n"),
da_bno, ino);
+ free(new_leaf);
break;
}
* final step, copy block back
*/
memmove(leaf, new_leaf, mp->m_sb.sb_blocksize);
+ free(new_leaf);
*buf_dirty = 1;
} else {
junk_zerolen_dir_leaf_entries(mp, leaf, ino, buf_dirty);
}
#endif
+
+out:
+ free(dir_freemap);
#ifdef XR_DIR_TRACE
fprintf(stderr, "process_leaf_dir_block returns %d\n", res);
#endif
- return((res > 0) ? 1 : 0);
+ return res > 0 ? 1 : 0;
}
/*
#include "prefetch.h"
#include <sys/resource.h>
-/* TODO: dirbuf/freemap key usage is completely b0rked - only used for dirv1 */
-static pthread_key_t dirbuf_key;
-static pthread_key_t dir_freemap_key;
-static pthread_key_t attr_freemap_key;
-
-static void
-ts_alloc(pthread_key_t key, unsigned n, size_t size)
-{
- void *voidp;
- voidp = calloc(n, size);
- if (voidp == NULL) {
- do_error(_("ts_alloc: cannot allocate thread specific storage\n"));
- /* NO RETURN */
- return;
- }
- pthread_setspecific(key, voidp);
-}
-
static void
ts_create(void)
{
- /* create thread specific keys */
- pthread_key_create(&dirbuf_key, NULL);
- pthread_key_create(&dir_freemap_key, NULL);
- pthread_key_create(&attr_freemap_key, NULL);
-
pthread_key_create(&dblkmap_key, NULL);
pthread_key_create(&ablkmap_key, NULL);
}
-void
-ts_init(void)
-{
-
- /* allocate thread specific storage */
- ts_alloc(dirbuf_key, 1, ts_dirbuf_size);
- ts_alloc(dir_freemap_key, 1, ts_dir_freemap_size);
- ts_alloc(attr_freemap_key, 1, ts_attr_freemap_size);
-}
-
-void *
-ts_dirbuf(void)
-{
- return pthread_getspecific(dirbuf_key);
-}
-
-void *
-ts_dir_freemap(void)
-{
- return pthread_getspecific(dir_freemap_key);
-}
-
-void *
-ts_attr_freemap(void)
-{
- return pthread_getspecific(attr_freemap_key);
-}
-
static void
increase_rlimit(void)
{
do_error(_("couldn't initialize XFS library\n"));
ts_create();
- ts_init();
increase_rlimit();
pftrace_init();
}