X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=lttng-abi.c;h=b51434a17a9e28aee7de71f24437511f31e3bb55;hb=e0577e5fc282e0260214e5c5069342a717dc4068;hp=bc0a0f6e4dd7516c09b280f1b4379c7972624166;hpb=9adb2e2253bdb5edf43efdd75f09df883ab1a7dc;p=lttng-modules.git diff --git a/lttng-abi.c b/lttng-abi.c index bc0a0f6e..b51434a1 100644 --- a/lttng-abi.c +++ b/lttng-abi.c @@ -50,6 +50,7 @@ #include "wrapper/ringbuffer/frontend.h" #include "wrapper/poll.h" #include "wrapper/file.h" +#include "wrapper/kref.h" #include "lttng-abi.h" #include "lttng-abi-old.h" #include "lttng-events.h" @@ -130,10 +131,6 @@ int lttng_abi_tracepoint_list(void) if (ret < 0) goto open_error; fd_install(file_fd, tracepoint_list_file); - if (file_fd < 0) { - ret = file_fd; - goto fd_error; - } return file_fd; open_error: @@ -174,10 +171,6 @@ int lttng_abi_syscall_list(void) if (ret < 0) goto open_error; fd_install(file_fd, syscall_list_file); - if (file_fd < 0) { - ret = file_fd; - goto fd_error; - } return file_fd; open_error: @@ -425,6 +418,10 @@ int lttng_abi_create_channel(struct file *session_file, transport_name = ""; break; } + if (atomic_long_add_unless(&session_file->f_count, + 1, INT_MAX) == INT_MAX) { + goto refcount_error; + } /* * We tolerate no failure path after channel creation. It will stay * invariant for the rest of the session. @@ -442,11 +439,12 @@ int lttng_abi_create_channel(struct file *session_file, chan->file = chan_file; chan_file->private_data = chan; fd_install(chan_fd, chan_file); - atomic_long_inc(&session_file->f_count); return chan_fd; chan_error: + atomic_long_dec(&session_file->f_count); +refcount_error: fput(chan_file); file_error: put_unused_fd(chan_fd); @@ -935,17 +933,20 @@ int lttng_abi_open_metadata_stream(struct file *channel_file) goto notransport; } + if (!lttng_kref_get(&session->metadata_cache->refcount)) + goto kref_error; ret = lttng_abi_create_stream_fd(channel_file, stream_priv, <tng_metadata_ring_buffer_file_operations); if (ret < 0) goto fd_error; - kref_get(&session->metadata_cache->refcount); list_add(&metadata_stream->list, &session->metadata_cache->metadata_stream); return ret; fd_error: + kref_put(&session->metadata_cache->refcount, metadata_cache_destroy); +kref_error: module_put(metadata_stream->transport->owner); notransport: kfree(metadata_stream); @@ -989,6 +990,11 @@ int lttng_abi_create_event(struct file *channel_file, ret = PTR_ERR(event_file); goto file_error; } + /* The event holds a reference on the channel */ + if (atomic_long_add_unless(&channel_file->f_count, + 1, INT_MAX) == INT_MAX) { + goto refcount_error; + } if (event_param->instrumentation == LTTNG_KERNEL_TRACEPOINT || event_param->instrumentation == LTTNG_KERNEL_SYSCALL) { struct lttng_enabler *enabler; @@ -1020,11 +1026,11 @@ int lttng_abi_create_event(struct file *channel_file, } event_file->private_data = priv; fd_install(event_fd, event_file); - /* The event holds a reference on the channel */ - atomic_long_inc(&channel_file->f_count); return event_fd; event_error: + atomic_long_dec(&channel_file->f_count); +refcount_error: fput(event_file); file_error: put_unused_fd(event_fd);