X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Ftrace-chunk.cpp;h=92cbd3c342d6daac671033b49c0262517fd2d28b;hb=1c9a0b0e83c7e073c4e576c0bed95de335b0e502;hp=ad7a983fbc78e50ca78db0c038aeae2f4244627e;hpb=c5c79321eb1937f3d208210365c512f4a186ec2a;p=lttng-tools.git diff --git a/src/common/trace-chunk.cpp b/src/common/trace-chunk.cpp index ad7a983fb..92cbd3c34 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. */ } @@ -1007,6 +1007,7 @@ enum lttng_trace_chunk_status lttng_trace_chunk_set_credentials_current_user( enum lttng_trace_chunk_status status = LTTNG_TRACE_CHUNK_STATUS_OK; const struct chunk_credentials credentials = { .use_current_user = true, + .user = {}, }; pthread_mutex_lock(&chunk->lock); @@ -1639,7 +1640,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 +1858,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 +1879,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();