prune
scan->prune.nelms = 0;
scan->prune.head.flags |= HAMMER_IOC_PRUNE_ALL;
scan->prune.nelms = 0;
scan->filesystem, scan->prune.nelms);
if (scan->prune.nelms == 0 &&
(scan->prune.head.flags & HAMMER_IOC_PRUNE_ALL) == 0) {
(uintmax_t)scan->prune.key_beg.obj_id,
scan->prune.key_beg.localization,
(uintmax_t)scan->prune.key_end.obj_id,
scan->prune.key_end.localization,
if (ioctl(fd, HAMMERIOC_PRUNE, &scan->prune) < 0) {
} else if (scan->prune.head.flags & HAMMER_IOC_HEAD_INTR) {
(uintmax_t)scan->prune.key_cur.obj_id,
scan->prune.key_cur.localization);
hammer_set_cycle(&scan->prune.key_cur, 0);
(uintmax_t)scan->prune.stat_rawrecords,
(uintmax_t)scan->prune.stat_scanrecords,
(uintmax_t)scan->prune.stat_dirrecords,
(uintmax_t)scan->prune.stat_bytes
struct hammer_ioc_prune prune;
scan->prune = *template;
scan->prune.elms = malloc(sizeof(struct hammer_ioc_prune_elm) *
if (scan->prune.nelms >= scan->maxelms - 1) {
scan->prune.elms = realloc(scan->prune.elms,
elm = &scan->prune.elms[scan->prune.nelms];
++scan->prune.nelms;
if (scan->prune.nelms == 0)
qsort(scan->prune.elms, scan->prune.nelms, sizeof(*elm),
for (i = 0; i < scan->prune.nelms; ++i) {
elm = &scan->prune.elms[i];
--scan->prune.nelms;
if (i != scan->prune.nelms) {
(scan->prune.nelms - i) * sizeof(*elm));
for (i = scan->prune.nelms - 1; i >= 0; --i) {
elm = &scan->prune.elms[i];
bcopy(&scan->prune.elms[i], &scan->prune.elms[0],
(scan->prune.nelms - i) * sizeof(scan->prune.elms[0]));
scan->prune.elms[0].end_tid = HAMMER_MAX_TID;
scan->prune.nelms -= i;
if (scan->prune.nelms) {
bcopy(&scan->prune.elms[1], &scan->prune.elms[0],
(scan->prune.nelms - 1) * sizeof(scan->prune.elms[0]));
--scan->prune.nelms;
if (scan->prune.nelms) {
assert(scan->prune.nelms < scan->maxelms);
elm = &scan->prune.elms[scan->prune.nelms];
++scan->prune.nelms;
for (i = 0; i < scan->prune.nelms; ++i) {
elm = &scan->prune.elms[i];
goto prune;
goto prune;
prune:
struct hammer_ioc_prune *prune);
elm_array_size = sizeof(*copy_elms) * prune->nelms;
user_elms = prune->elms;
prune->elms = copy_elms;
cursor.key_beg.obj_id = prune->key_beg.obj_id;
cursor.key_end.localization = prune->key_cur.localization;
cursor.key_end.obj_id = prune->key_cur.obj_id;
cursor.key_end.key = prune->key_cur.key;
prune->key_cur = elm->base;
if (prune->stat_oldest_tid > elm->base.create_tid)
prune->stat_oldest_tid = elm->base.create_tid;
if (prune_should_delete(prune, elm)) {
++prune->stat_dirrecords;
++prune->stat_rawrecords;
prune->stat_bytes += bytes;
++prune->stat_scanrecords;
prune->head.flags |= HAMMER_IOC_HEAD_INTR;
prune->key_cur.localization &= HAMMER_LOCALIZE_MASK;
prune->elms = user_elms;
prune_should_delete(struct hammer_ioc_prune *prune, hammer_btree_leaf_elm_t elm)
if (prune->head.flags & HAMMER_IOC_PRUNE_ALL) {
for (i = 0; i < prune->nelms; ++i) {
scan = &prune->elms[i];
static int prune_should_delete(struct hammer_ioc_prune *prune,
struct hammer_ioc_prune *prune)
if (prune->nelms < 0 || prune->nelms > HAMMER_MAX_PRUNE_ELMS)
if ((prune->key_beg.localization | prune->key_end.localization) &
if (prune->key_beg.localization > prune->key_end.localization)
if (prune->key_beg.localization == prune->key_end.localization) {
if (prune->key_beg.obj_id > prune->key_end.obj_id)
if ((prune->head.flags & HAMMER_IOC_PRUNE_ALL) && prune->nelms)
key_beg_localization = prune->key_beg.localization;
prune->key_cur.localization = prune->key_end.localization;
prune->key_cur.localization &= HAMMER_LOCALIZE_MASK;
prune->key_cur.localization |= ip->obj_localization;
prune->key_cur.obj_id = prune->key_end.obj_id;
prune->key_cur.key = HAMMER_MAX_KEY;
static void prune(void);
prune();