X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcommon%2Ftrace-chunk.cpp;h=3ae804781021ae97595203d922dc9ffc18ec0961;hb=c10f9cdd994258358bb3766c2e92dab71e4ceef2;hp=ad7a983fbc78e50ca78db0c038aeae2f4244627e;hpb=c5c79321eb1937f3d208210365c512f4a186ec2a;p=lttng-tools.git diff --git a/src/common/trace-chunk.cpp b/src/common/trace-chunk.cpp index ad7a983fb..3ae804781 100644 --- a/src/common/trace-chunk.cpp +++ b/src/common/trace-chunk.cpp @@ -171,7 +171,7 @@ const char *lttng_trace_chunk_command_type_str( }; static -const chunk_command close_command_get_post_release_func( +chunk_command close_command_get_post_release_func( lttng_trace_chunk_command_type type) { switch (type) { case LTTNG_TRACE_CHUNK_COMMAND_TYPE_MOVE_TO_COMPLETED: @@ -238,7 +238,7 @@ int fs_handle_untracked_get_fd(struct fs_handle *_handle) } static -void fs_handle_untracked_put_fd(struct fs_handle *_handle) +void fs_handle_untracked_put_fd(struct fs_handle *_handle __attribute__((unused))) { /* no-op. */ } @@ -1639,7 +1639,7 @@ end: } static -int lttng_trace_chunk_no_operation(struct lttng_trace_chunk *trace_chunk) +int lttng_trace_chunk_no_operation(struct lttng_trace_chunk *trace_chunk __attribute__((unused))) { return 0; } @@ -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();