X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Fmain.c;h=92d466df7bc34ff2ba73161f37944dd9147b0cb5;hp=537ef877882ad5ac9e006c94f9979e3a928fb925;hb=d77dded285b058e4242c8a3d2233f80e725ceefc;hpb=0c0e3b4112d52fb54a844300b36f1373e3055c8f diff --git a/src/bin/lttng-relayd/main.c b/src/bin/lttng-relayd/main.c index 537ef8778..92d466df7 100644 --- a/src/bin/lttng-relayd/main.c +++ b/src/bin/lttng-relayd/main.c @@ -1248,7 +1248,7 @@ int relay_add_stream(struct lttcomm_relayd_hdr *recv_hdr, struct relay_session *session = conn->session; struct relay_stream *stream = NULL; struct lttcomm_relayd_status_stream reply; - struct ctf_trace *trace; + struct ctf_trace *trace = NULL; if (!session || conn->version_check_done == 0) { ERR("Trying to add a stream before version check"); @@ -1276,7 +1276,6 @@ int relay_add_stream(struct lttcomm_relayd_hdr *recv_hdr, goto err_free_stream; } - rcu_read_lock(); stream->stream_handle = ++last_relay_stream_id; stream->prev_seq = -1ULL; stream->session_id = session->id; @@ -1286,7 +1285,8 @@ int relay_add_stream(struct lttcomm_relayd_hdr *recv_hdr, lttng_ht_node_init_u64(&stream->node, stream->stream_handle); pthread_mutex_init(&stream->lock, NULL); - ret = utils_mkdir_recursive(stream->path_name, S_IRWXU | S_IRWXG); + ret = utils_mkdir_recursive(stream->path_name, S_IRWXU | S_IRWXG, + -1, -1); if (ret < 0) { ERR("relay creating output directory"); goto err_free_stream; @@ -1309,6 +1309,8 @@ int relay_add_stream(struct lttcomm_relayd_hdr *recv_hdr, DBG("Tracefile %s/%s created", stream->path_name, stream->channel_name); } + /* Protect access to "trace" */ + rcu_read_lock(); trace = ctf_trace_find_by_path(session->ctf_traces_ht, stream->path_name); if (!trace) { trace = ctf_trace_create(stream->path_name); @@ -1336,6 +1338,9 @@ int relay_add_stream(struct lttcomm_relayd_hdr *recv_hdr, /* * Both in the ctf_trace object and the global stream ht since the data * side of the relayd does not have the concept of session. + * + * rcu_read_lock() is kept to protect the stream which is now part of + * the relay_streams_ht. */ lttng_ht_add_unique_u64(relay_streams_ht, &stream->node); cds_list_add_tail(&stream->trace_list, &trace->stream_list); @@ -1363,7 +1368,13 @@ end: ERR("Relay sending stream id"); ret = send_ret; } + /* + * rcu_read_lock() was held to protect either "trace" OR the "stream" at + * this point. + */ rcu_read_unlock(); + trace = NULL; + stream = NULL; end_no_session: return ret; @@ -2559,8 +2570,8 @@ restart: nb_fd = ret; /* - * Process control. The control connection is prioritised so we don't - * starve it with high throughout put tracing data on the data + * Process control. The control connection is prioritised so we + * don't starve it with high throughput tracing data on the data * connection. */ for (i = 0; i < nb_fd; i++) { @@ -2818,7 +2829,8 @@ int main(int argc, char **argv) goto exit_options; } - ret = utils_mkdir_recursive(opt_output_path, S_IRWXU | S_IRWXG); + ret = utils_mkdir_recursive(opt_output_path, S_IRWXU | S_IRWXG, + -1, -1); if (ret < 0) { ERR("Unable to create %s", opt_output_path); retval = -1;