session = ltt_session_create();
if (!session)
return -ENOMEM;
- session_fd = get_unused_fd_flags(O_RDWR);
+ session_fd = get_unused_fd();
if (session_fd < 0) {
ret = session_fd;
goto fd_error;
if (copy_from_user(&chan_param, uchan_param, sizeof(chan_param)))
return -EFAULT;
- chan_fd = get_unused_fd_flags(O_RDWR);
+ chan_fd = get_unused_fd();
if (chan_fd < 0) {
ret = chan_fd;
goto fd_error;
chan_param.switch_timer_interval,
chan_param.read_timer_interval);
if (!chan) {
- ret = -ENOMEM;
+ ret = -EINVAL;
goto chan_error;
}
chan->file = chan_file;
chan_file->private_data = chan;
fd_install(chan_fd, chan_file);
/* The channel created holds a reference on the session */
- atomic_inc(&session_file->f_count);
+ atomic_long_inc(&session_file->f_count);
return chan_fd;
int lttng_session_release(struct inode *inode, struct file *file)
{
struct ltt_session *session = file->private_data;
- ltt_session_destroy(session);
+
+ if (session)
+ ltt_session_destroy(session);
return 0;
}
if (!buf)
return -ENOENT;
- stream_fd = get_unused_fd_flags(O_RDWR);
+ stream_fd = get_unused_fd();
if (stream_fd < 0) {
ret = stream_fd;
goto fd_error;
}
fd_install(stream_fd, stream_file);
/* The stream holds a reference on the channel */
- atomic_inc(&channel_file->f_count);
+ atomic_long_inc(&channel_file->f_count);
return stream_fd;
file_error:
event_name = kmalloc(PATH_MAX, GFP_KERNEL);
if (!event_name)
return -ENOMEM;
- if (strncpy_from_user(event_name, uevent_param->name, PATH_MAX)) {
+ if (strncpy_from_user(event_name, uevent_param->name, PATH_MAX) < 0) {
ret = -EFAULT;
goto name_error;
}
event_name[PATH_MAX - 1] = '\0';
- event_fd = get_unused_fd_flags(O_RDWR);
+ event_fd = get_unused_fd();
if (event_fd < 0) {
ret = event_fd;
goto fd_error;
* invariant for the rest of the session.
*/
event = ltt_event_create(channel, event_name, event_param.itype,
- NULL, NULL); /* TODO non-null probe */
+ (void *) 0x1, NULL); /* TODO connect real probe */
if (!event) {
goto event_error;
ret = -EEXIST;
event_file->private_data = event;
fd_install(event_fd, event_file);
/* The event holds a reference on the channel */
- atomic_inc(&channel_file->f_count);
+ atomic_long_inc(&channel_file->f_count);
kfree(event_name);
return event_fd;
int lttng_channel_release(struct inode *inode, struct file *file)
{
struct ltt_channel *channel = file->private_data;
- fput(channel->session->file);
+
+ if (channel)
+ fput(channel->session->file);
return 0;
}
int lttng_event_release(struct inode *inode, struct file *file)
{
struct ltt_event *event = file->private_data;
- fput(event->chan->file);
+
+ if (event)
+ fput(event->chan->file);
return 0;
}
.release = lttng_event_release,
};
-static int __init ltt_debugfs_abi_init(void)
+int __init ltt_debugfs_abi_init(void)
{
int ret = 0;
lttng_dentry = debugfs_create_file("lttng", S_IWUSR, NULL, NULL,
- <tng_session_fops);
+ <tng_fops);
if (IS_ERR(lttng_dentry) || !lttng_dentry) {
printk(KERN_ERR "Error creating LTTng control file\n");
ret = -ENOMEM;
return ret;
}
-module_init(ltt_debugfs_abi_init);
-
-static void __exit ltt_debugfs_abi_exit(void)
+void __exit ltt_debugfs_abi_exit(void)
{
debugfs_remove(lttng_dentry);
}
-
-module_exit(ltt_debugfs_abi_exit);
-
-MODULE_LICENSE("GPL and additional rights");
-MODULE_AUTHOR("Mathieu Desnoyers");
-MODULE_DESCRIPTION("Linux Trace Toolkit Next Generation DebugFS ABI");