mirror of
https://github.com/versity/scoutfs.git
synced 2026-01-05 11:45:09 +00:00
Don't leak alloc blocks on srch compact error
scoutfs_alloc_prepare_commit() is badly named. All it really does is put the references to the two dirty alloc list blocks in the allocator. It must allways be called if allocation was attempted, but it's easier to require that it always be paired with _alloc_init(). If the srch compaction worker in the client sees an error it will send the error back to the server without writing its dirty blocks. In avoiding the write it also avoided putting the two block references, leading to leaked blocks. We've been seeing rare messages with leaked blocks in tests. Signed-off-by: Zach Brown <zab@versity.com>
This commit is contained in:
@@ -2276,12 +2276,11 @@ static void scoutfs_srch_compact_worker(struct work_struct *work)
|
||||
} else {
|
||||
ret = -EINVAL;
|
||||
}
|
||||
if (ret < 0)
|
||||
goto commit;
|
||||
|
||||
ret = scoutfs_alloc_prepare_commit(sb, &alloc, &wri) ?:
|
||||
scoutfs_alloc_prepare_commit(sb, &alloc, &wri);
|
||||
if (ret == 0)
|
||||
scoutfs_block_writer_write(sb, &wri);
|
||||
commit:
|
||||
|
||||
/* the server won't use our partial compact if _ERROR is set */
|
||||
sc->meta_avail = alloc.avail;
|
||||
sc->meta_freed = alloc.freed;
|
||||
|
||||
Reference in New Issue
Block a user