projects
/
lttng-modules.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: make clean does not include dot-config
[lttng-modules.git]
/
lttng-abi.c
diff --git
a/lttng-abi.c
b/lttng-abi.c
index 93cdce3e0f00ec37e007ae17a54bce290ee035df..9845930d9ebc87bd7e86f0c0bd06eb95317d66da 100644
(file)
--- 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/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"
#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 (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:
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 (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:
return file_fd;
open_error:
@@
-425,6
+418,10
@@
int lttng_abi_create_channel(struct file *session_file,
transport_name = "<unknown>";
break;
}
transport_name = "<unknown>";
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.
/*
* 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);
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:
return chan_fd;
chan_error:
+ atomic_long_dec(&session_file->f_count);
+refcount_error:
fput(chan_file);
file_error:
put_unused_fd(chan_fd);
fput(chan_file);
file_error:
put_unused_fd(chan_fd);
@@
-622,9
+620,11
@@
unsigned int lttng_metadata_ring_buffer_poll(struct file *filp,
if (finalized)
mask |= POLLHUP;
if (finalized)
mask |= POLLHUP;
+ mutex_lock(&stream->metadata_cache->lock);
if (stream->metadata_cache->metadata_written >
stream->metadata_out)
mask |= POLLIN;
if (stream->metadata_cache->metadata_written >
stream->metadata_out)
mask |= POLLIN;
+ mutex_unlock(&stream->metadata_cache->lock);
}
return mask;
}
return mask;
@@
-922,7
+922,6
@@
int lttng_abi_open_metadata_stream(struct file *channel_file)
metadata_stream->priv = buf;
stream_priv = metadata_stream;
metadata_stream->transport = channel->transport;
metadata_stream->priv = buf;
stream_priv = metadata_stream;
metadata_stream->transport = channel->transport;
- mutex_init(&metadata_stream->lock);
/*
* Since life-time of metadata cache differs from that of
/*
* Since life-time of metadata cache differs from that of
@@
-934,17
+933,20
@@
int lttng_abi_open_metadata_stream(struct file *channel_file)
goto notransport;
}
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;
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:
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);
module_put(metadata_stream->transport->owner);
notransport:
kfree(metadata_stream);
@@
-988,6
+990,12
@@
int lttng_abi_create_event(struct file *channel_file,
ret = PTR_ERR(event_file);
goto file_error;
}
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) {
+ ret = -EOVERFLOW;
+ goto refcount_error;
+ }
if (event_param->instrumentation == LTTNG_KERNEL_TRACEPOINT
|| event_param->instrumentation == LTTNG_KERNEL_SYSCALL) {
struct lttng_enabler *enabler;
if (event_param->instrumentation == LTTNG_KERNEL_TRACEPOINT
|| event_param->instrumentation == LTTNG_KERNEL_SYSCALL) {
struct lttng_enabler *enabler;
@@
-1019,11
+1027,11
@@
int lttng_abi_create_event(struct file *channel_file,
}
event_file->private_data = priv;
fd_install(event_fd, event_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:
return event_fd;
event_error:
+ atomic_long_dec(&channel_file->f_count);
+refcount_error:
fput(event_file);
file_error:
put_unused_fd(event_fd);
fput(event_file);
file_error:
put_unused_fd(event_fd);
@@
-1285,8
+1293,8
@@
int lttng_metadata_channel_release(struct inode *inode, struct file *file)
struct lttng_channel *channel = file->private_data;
if (channel) {
struct lttng_channel *channel = file->private_data;
if (channel) {
- lttng_metadata_channel_destroy(channel);
fput(channel->session->file);
fput(channel->session->file);
+ lttng_metadata_channel_destroy(channel);
}
return 0;
}
return 0;
This page took
0.02846 seconds
and
4
git commands to generate.