X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Ffd-tracker%2Ffd-tracker.c;fp=src%2Fcommon%2Ffd-tracker%2Ffd-tracker.c;h=eddf5ada6189dedf90cae7b407f1b4bcb2a0b9f8;hp=2cf26f723234a382ae1355468af8a130dc5b61ce;hb=9e3d760f2bf927be2c59d0ccb3b64e2663ae7263;hpb=f5a2cd657eb3a81a8788438d796e906148a1b3b1 diff --git a/src/common/fd-tracker/fd-tracker.c b/src/common/fd-tracker/fd-tracker.c index 2cf26f723..eddf5ada6 100644 --- a/src/common/fd-tracker/fd-tracker.c +++ b/src/common/fd-tracker/fd-tracker.c @@ -305,9 +305,9 @@ int fs_handle_restore(struct fs_handle *handle) 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; @@ -483,10 +483,13 @@ 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 = { @@ -500,6 +503,8 @@ struct fs_handle *fd_tracker_open_fs_handle(struct fd_tracker *tracker, if (tracker->count.suspendable.active > 0) { ret = fd_tracker_suspend_handles(tracker, 1); if (ret) { + ERR("Suspend handled failed"); + ret = EMFILE; goto end; } } else { @@ -510,12 +515,14 @@ struct fs_handle *fd_tracker_open_fs_handle(struct fd_tracker *tracker, */ WARN("Cannot open file system handle, too many unsuspendable file descriptors are opened (%u)", tracker->count.unsuspendable); + ret = EMFILE; goto end; } } handle = zmalloc(sizeof(*handle)); if (!handle) { + ret = ENOMEM; goto end; } handle->tracker = tracker; @@ -523,12 +530,14 @@ struct fs_handle *fd_tracker_open_fs_handle(struct fd_tracker *tracker, ret = pthread_mutex_init(&handle->lock, NULL); if (ret) { PERROR("Failed to initialize handle mutex while creating fs handle"); + 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 contains -errno on error. */ + ret = -ret; goto error; } @@ -537,6 +546,7 @@ struct fs_handle *fd_tracker_open_fs_handle(struct fd_tracker *tracker, 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; @@ -544,6 +554,7 @@ struct fs_handle *fd_tracker_open_fs_handle(struct fd_tracker *tracker, if (fstat(handle->fd, &fd_stat)) { PERROR("Failed to retrieve file descriptor inode while creating fs handle, fstat() returned"); + ret = errno; goto error; } handle->ino = fd_stat.st_ino; @@ -551,6 +562,7 @@ struct fs_handle *fd_tracker_open_fs_handle(struct fd_tracker *tracker, fd_tracker_track(tracker, handle); end: pthread_mutex_unlock(&tracker->lock); + errno = ret; return handle; error: if (handle->inode) {