X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Ftrace-chunk.cpp;fp=src%2Fcommon%2Ftrace-chunk.cpp;h=9e804ce0197b25c74a66a0b211cce3fa8f77768a;hp=ad7a983fbc78e50ca78db0c038aeae2f4244627e;hb=c26d615c0c49dd994a687c8e1afe670809100765;hpb=531e96a7eef1d108abf83c6df5429c0ae82d32ca diff --git a/src/common/trace-chunk.cpp b/src/common/trace-chunk.cpp index ad7a983fb..9e804ce01 100644 --- a/src/common/trace-chunk.cpp +++ b/src/common/trace-chunk.cpp @@ -1857,7 +1857,6 @@ void free_lttng_trace_chunk_registry_element(struct rcu_head *node) struct lttng_trace_chunk_registry_element *element = container_of(node, typeof(*element), rcu_node); - lttng_trace_chunk_fini(&element->chunk); free(element); } @@ -1879,6 +1878,24 @@ void lttng_trace_chunk_release(struct urcu_ref *ref) if (chunk->in_registry_element) { struct lttng_trace_chunk_registry_element *element; + /* + * Release internal chunk attributes immediately and + * only use the deferred `call_rcu` work to reclaim the + * storage. + * + * This ensures that file handles are released as soon as + * possible which works around a problem we encounter with PRAM fs + * mounts (and possibly other non-POSIX compliant file systems): + * directories that contain files which are open can't be + * rmdir(). + * + * This means that the recording of a snapshot could be + * completed, but that it would be impossible for the user to + * delete it until the deferred clean-up released the file + * handles to its contents. + */ + lttng_trace_chunk_fini(chunk); + element = container_of(chunk, typeof(*element), chunk); if (element->registry) { rcu_read_lock();