Skip to content

Commit

Permalink
UBIFS: TNC / GC race fixes
Browse files Browse the repository at this point in the history
- update GC sequence number if any nodes may have been moved
even if GC did not finish the LEB
- don't ignore error return when reading

Signed-off-by: Adrian Hunter <ext-adrian.hunter@nokia.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
  • Loading branch information
Adrian Hunter authored and Artem Bityutskiy committed Sep 17, 2008
1 parent 0855f31 commit 6dcfac4
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 4 deletions.
14 changes: 11 additions & 3 deletions fs/ubifs/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -334,15 +334,15 @@ int ubifs_garbage_collect_leb(struct ubifs_info *c, struct ubifs_lprops *lp)

err = move_nodes(c, sleb);
if (err)
goto out;
goto out_inc_seq;

err = gc_sync_wbufs(c);
if (err)
goto out;
goto out_inc_seq;

err = ubifs_change_one_lp(c, lnum, c->leb_size, 0, 0, 0, 0);
if (err)
goto out;
goto out_inc_seq;

/* Allow for races with TNC */
c->gced_lnum = lnum;
Expand All @@ -369,6 +369,14 @@ int ubifs_garbage_collect_leb(struct ubifs_info *c, struct ubifs_lprops *lp)
out:
ubifs_scan_destroy(sleb);
return err;

out_inc_seq:
/* We may have moved at least some nodes so allow for races with TNC */
c->gced_lnum = lnum;
smp_wmb();
c->gc_seq += 1;
smp_wmb();
goto out;
}

/**
Expand Down
2 changes: 1 addition & 1 deletion fs/ubifs/tnc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1476,7 +1476,7 @@ int ubifs_tnc_locate(struct ubifs_info *c, const union ubifs_key *key,
}

err = fallible_read_node(c, key, &zbr, node);
if (maybe_leb_gced(c, zbr.lnum, gc_seq1)) {
if (err <= 0 || maybe_leb_gced(c, zbr.lnum, gc_seq1)) {
/*
* The node may have been GC'ed out from under us so try again
* while keeping the TNC mutex locked.
Expand Down

0 comments on commit 6dcfac4

Please sign in to comment.