Skip to content

Commit

Permalink
bftw: Fix to_close list corruption with !BFS_USE_UNWRAPDIR
Browse files Browse the repository at this point in the history
It's possible for pincount to drop to zero, then get incremented and
drop back to zero again.  If this happens, we shouldn't add it to the
to_close list twice.

This should fix the intermittent hang on the macOS CI.

Fixes: 815798e
  • Loading branch information
tavianator committed Oct 12, 2023
1 parent 1addab1 commit 773f4a4
Showing 1 changed file with 13 additions and 6 deletions.
19 changes: 13 additions & 6 deletions src/bftw.c
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,17 @@ static int bftw_state_init(struct bftw_state *state, const struct bftw_args *arg
return 0;
}

/** Unpin a directory, and possibly queue it for unwrapping. */
static void bftw_unpin_dir(struct bftw_state *state, struct bftw_file *file, bool force) {
bftw_cache_unpin(&state->cache, file);

if (file->dir && (force || file->pincount == 0)) {
if (!SLIST_ATTACHED(&state->to_close, file)) {
SLIST_APPEND(&state->to_close, file);
}
}
}

/** Pop a response from the I/O queue. */
static int bftw_ioq_pop(struct bftw_state *state, bool block) {
struct ioq *ioq = state->ioq;
Expand Down Expand Up @@ -582,10 +593,7 @@ static int bftw_ioq_pop(struct bftw_state *state, bool block) {
++cache->capacity;
parent = file->parent;
if (parent) {
bftw_cache_unpin(cache, parent);
if (parent->pincount == 0 && parent->dir) {
SLIST_APPEND(&state->to_close, parent);
}
bftw_unpin_dir(state, parent, false);
}

dir = ent->opendir.dir;
Expand Down Expand Up @@ -1285,8 +1293,7 @@ static int bftw_gc(struct bftw_state *state, enum bftw_gc_flags flags) {

struct bftw_file *file = state->file;
if (file && file->dir) {
bftw_cache_unpin(&state->cache, file);
SLIST_APPEND(&state->to_close, file);
bftw_unpin_dir(state, file, true);
}
state->dir = NULL;
state->de = NULL;
Expand Down

0 comments on commit 773f4a4

Please sign in to comment.