X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Fmain.c;h=92d466df7bc34ff2ba73161f37944dd9147b0cb5;hp=2d3714e684bccab1deba3b522de7b7de3333faa0;hb=d77dded285b058e4242c8a3d2233f80e725ceefc;hpb=5eb3e5b8f4fcb95f27f43cd2e7ea436937037d0e diff --git a/src/bin/lttng-relayd/main.c b/src/bin/lttng-relayd/main.c index 2d3714e68..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,10 +1285,11 @@ 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 end; + goto err_free_stream; } /* @@ -1300,7 +1300,7 @@ int relay_add_stream(struct lttcomm_relayd_hdr *recv_hdr, stream->tracefile_size, 0, relayd_uid, relayd_gid, NULL); if (ret < 0) { ERR("Create output file"); - goto end; + goto err_free_stream; } stream->fd = ret; if (stream->tracefile_size) { @@ -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;