ret = open_from_properties(path,
&handle->properties);
if (ret < 0) {
+ errno = -ret;
PERROR("Failed to restore filesystem handle to %s, open() failed",
path);
- ret = -errno;
goto end;
}
fd = ret;
ret = cds_lfht_destroy(tracker->unsuspendable_fds, NULL);
assert(!ret);
}
+
+ lttng_inode_registry_destroy(tracker->inode_registry);
pthread_mutex_destroy(&tracker->lock);
free(tracker);
end:
return ret;
}
+/*
+ * If return NULL check errno for error.
+ */
struct fs_handle *fd_tracker_open_fs_handle(struct fd_tracker *tracker,
const char *path, int flags, mode_t *mode)
{
- int ret;
+ int ret = 0;
struct fs_handle *handle = NULL;
struct stat fd_stat;
struct open_properties properties = {
if (tracker->count.suspendable.active > 0) {
ret = fd_tracker_suspend_handles(tracker, 1);
if (ret) {
- goto error_destroy;
+ ERR("Suspend handled failed");
+ ret = EMFILE;
+ goto end;
}
} else {
/*
* There are not enough active suspendable file
- * descriptors to open a new fd and still accomodate the
- * tracker's capacity.
+ * descriptors to open a new fd and still accommodate
+ * the tracker's capacity.
*/
WARN("Cannot open file system handle, too many unsuspendable file descriptors are opened (%u)",
tracker->count.unsuspendable);
- ret = -EMFILE;
- goto error_destroy;
+ ret = EMFILE;
+ goto end;
}
}
handle = zmalloc(sizeof(*handle));
if (!handle) {
+ ret = ENOMEM;
goto end;
}
+ handle->tracker = tracker;
ret = pthread_mutex_init(&handle->lock, NULL);
if (ret) {
PERROR("Failed to initialize handle mutex while creating fs handle");
- free(handle);
- goto end;
+ ret = errno;
+ goto error_mutex_init;
}
handle->fd = open_from_properties(path, &properties);
if (handle->fd < 0) {
- PERROR("Failed to open fs handle to %s, open() returned", path);
- ret = -errno;
- goto error_destroy;
+ /* ret contains -errno on error. */
+ ret = -ret;
+ goto error;
}
handle->properties = properties;
handle->inode = lttng_inode_registry_get_inode(tracker->inode_registry,
handle->fd, path);
if (!handle->inode) {
+ ret = errno;
ERR("Failed to get lttng_inode corresponding to file %s",
path);
- goto error_destroy;
+ goto error;
}
if (fstat(handle->fd, &fd_stat)) {
PERROR("Failed to retrieve file descriptor inode while creating fs handle, fstat() returned");
- ret = -errno;
- goto error_destroy;
+ ret = errno;
+ goto error;
}
handle->ino = fd_stat.st_ino;
fd_tracker_track(tracker, handle);
- handle->tracker = tracker;
- pthread_mutex_unlock(&tracker->lock);
end:
- return handle;
-error_destroy:
pthread_mutex_unlock(&tracker->lock);
- (void) fs_handle_close(handle);
+ errno = ret;
+ return handle;
+error:
+ if (handle->inode) {
+ lttng_inode_put(handle->inode);
+ }
+ pthread_mutex_destroy(&handle->lock);
+error_mutex_init:
+ free(handle);
handle = NULL;
goto end;
}
int fs_handle_close(struct fs_handle *handle)
{
int ret = 0;
- const char *path;
+ const char *path = NULL;
if (!handle) {
ret = -EINVAL;
pthread_mutex_lock(&handle->tracker->lock);
pthread_mutex_lock(&handle->lock);
- path = lttng_inode_get_path(handle->inode);
+ if (handle->inode) {
+ path = lttng_inode_get_path(handle->inode);
+ }
fd_tracker_untrack(handle->tracker, handle);
if (handle->fd >= 0) {
assert(!handle->in_use);
*/
if (close(handle->fd)) {
PERROR("Failed to close the file descritptor (%d) of fs handle to %s, close() returned",
- handle->fd, path);
+ handle->fd, path ? path : "Unknown");
}
handle->fd = -1;
}