#include <urcu/list.h>
#include <urcu/rculfhash.h>
-#include <sys/stat.h>
-#include <sys/types.h>
#include <fcntl.h>
-#include <stdbool.h>
-#include <pthread.h>
#include <inttypes.h>
+#include <pthread.h>
+#include <stdbool.h>
+#include <sys/stat.h>
+#include <sys/types.h>
-#include "common/macros.h"
-#include "common/error.h"
#include "common/defaults.h"
-#include "common/hashtable/utils.h"
+#include "common/error.h"
#include "common/hashtable/hashtable.h"
+#include "common/hashtable/utils.h"
+#include "common/macros.h"
#include "fd-tracker.h"
#include "inode.h"
/* Tracker lock must be taken by the user. */
-#define TRACKED_COUNT(tracker) \
- (tracker->count.suspendable.active + \
- tracker->count.suspendable.suspended + \
- tracker->count.unsuspendable)
+#define TRACKED_COUNT(tracker) \
+ (tracker->count.suspendable.active + \
+ tracker->count.suspendable.suspended + \
+ tracker->count.unsuspendable)
/* Tracker lock must be taken by the user. */
-#define ACTIVE_COUNT(tracker) \
- (tracker->count.suspendable.active + \
- tracker->count.unsuspendable)
+#define ACTIVE_COUNT(tracker) \
+ (tracker->count.suspendable.active + tracker->count.unsuspendable)
/* Tracker lock must be taken by the user. */
-#define SUSPENDED_COUNT(tracker) \
- (tracker->count.suspendable.suspended)
+#define SUSPENDED_COUNT(tracker) (tracker->count.suspendable.suspended)
/* Tracker lock must be taken by the user. */
-#define SUSPENDABLE_COUNT(tracker) \
- (tracker->count.suspendable.active + \
- tracker->count.suspendable.suspended)
+#define SUSPENDABLE_COUNT(tracker) \
+ (tracker->count.suspendable.active + \
+ tracker->count.suspendable.suspended)
/* Tracker lock must be taken by the user. */
-#define UNSUSPENDABLE_COUNT(tracker) \
- (tracker->count.unsuspendable)
+#define UNSUSPENDABLE_COUNT(tracker) (tracker->count.unsuspendable)
struct fd_tracker {
pthread_mutex_t lock;
struct {
- struct {
+ struct {
unsigned int active;
unsigned int suspended;
} suspendable;
static int match_fd(struct cds_lfht_node *node, const void *key);
static void unsuspendable_fd_destroy(struct unsuspendable_fd *entry);
-static struct unsuspendable_fd *unsuspendable_fd_create(const char *name,
- int fd);
-static int open_from_properties(const char *path,
- struct open_properties *properties);
+static struct unsuspendable_fd *unsuspendable_fd_create(
+ const char *name, int fd);
+static int open_from_properties(
+ const char *path, struct open_properties *properties);
static void fs_handle_log(struct fs_handle *handle);
static int fs_handle_suspend(struct fs_handle *handle);
static int fs_handle_restore(struct fs_handle *handle);
-static void fd_tracker_track(struct fd_tracker *tracker,
- struct fs_handle *handle);
-static void fd_tracker_untrack(struct fd_tracker *tracker,
- struct fs_handle *handle);
-static int fd_tracker_suspend_handles(struct fd_tracker *tracker,
- unsigned int count);
-static int fd_tracker_restore_handle(struct fd_tracker *tracker,
- struct fs_handle *handle);
+static void fd_tracker_track(
+ struct fd_tracker *tracker, struct fs_handle *handle);
+static void fd_tracker_untrack(
+ struct fd_tracker *tracker, struct fs_handle *handle);
+static int fd_tracker_suspend_handles(
+ struct fd_tracker *tracker, unsigned int count);
+static int fd_tracker_restore_handle(
+ struct fd_tracker *tracker, struct fs_handle *handle);
/* Match function of the tracker's unsuspendable_fds hash table. */
-static
-int match_fd(struct cds_lfht_node *node, const void *key)
+static int match_fd(struct cds_lfht_node *node, const void *key)
{
- struct unsuspendable_fd *entry =
- caa_container_of(node, struct unsuspendable_fd, tracker_node);
+ struct unsuspendable_fd *entry = caa_container_of(
+ node, struct unsuspendable_fd, tracker_node);
- return hash_match_key_ulong((void *) (unsigned long) entry->fd,
- (void *) key);
+ return hash_match_key_ulong(
+ (void *) (unsigned long) entry->fd, (void *) key);
}
-static
-void delete_unsuspendable_fd(struct rcu_head *head)
+static void delete_unsuspendable_fd(struct rcu_head *head)
{
- struct unsuspendable_fd *fd = caa_container_of(head,
- struct unsuspendable_fd, rcu_head);
+ struct unsuspendable_fd *fd = caa_container_of(
+ head, struct unsuspendable_fd, rcu_head);
free(fd->name);
free(fd);
}
-static
-void unsuspendable_fd_destroy(struct unsuspendable_fd *entry)
+static void unsuspendable_fd_destroy(struct unsuspendable_fd *entry)
{
if (!entry) {
return;
call_rcu(&entry->rcu_head, delete_unsuspendable_fd);
}
-static
-struct unsuspendable_fd *unsuspendable_fd_create(const char *name, int fd)
+static struct unsuspendable_fd *unsuspendable_fd_create(
+ const char *name, int fd)
{
- struct unsuspendable_fd *entry =
- zmalloc(sizeof(*entry));
+ struct unsuspendable_fd *entry = zmalloc(sizeof(*entry));
if (!entry) {
goto error;
return NULL;
}
-static
-void fs_handle_log(struct fs_handle *handle)
+static void fs_handle_log(struct fs_handle *handle)
{
const char *path;
path = lttng_inode_get_path(handle->inode);
if (handle->fd >= 0) {
- DBG_NO_LOC(" %s [active, fd %d%s]",
- path,
- handle->fd,
+ DBG_NO_LOC(" %s [active, fd %d%s]", path, handle->fd,
handle->in_use ? ", in use" : "");
} else {
DBG_NO_LOC(" %s [suspended]", path);
}
/* Tracker lock must be held by the caller. */
-static
-int fs_handle_suspend(struct fs_handle *handle)
+static int fs_handle_suspend(struct fs_handle *handle)
{
int ret = 0;
struct stat fs_stat;
ret = stat(path, &fs_stat);
if (ret) {
- PERROR("Filesystem handle to %s cannot be suspended as stat() failed",
+ PERROR("Filesystem handle to %s cannot be suspended as stat() failed",
path);
ret = -errno;
goto end;
goto end;
}
- handle->offset = lseek(handle->fd, 0, SEEK_CUR);
+ handle->offset = lseek(handle->fd, 0, SEEK_CUR);
if (handle->offset == -1) {
WARN("Filesystem handle to %s cannot be suspended as lseek() failed to sample its current position",
path);
ret = close(handle->fd);
if (ret) {
- PERROR("Filesystem handle to %s cannot be suspended as close() failed",
+ PERROR("Filesystem handle to %s cannot be suspended as close() failed",
path);
ret = -errno;
goto end;
}
/* Caller must hold the tracker and handle's locks. */
-static
-int fs_handle_restore(struct fs_handle *handle)
+static int fs_handle_restore(struct fs_handle *handle)
{
int ret, fd = -1;
const char *path = lttng_inode_get_path(handle->inode);
assert(handle->fd == -1);
assert(path);
- ret = open_from_properties(path,
- &handle->properties);
+ ret = open_from_properties(path, &handle->properties);
if (ret < 0) {
- PERROR("Failed to restore filesystem handle to %s, open() failed",
+ PERROR("Failed to restore filesystem handle to %s, open() failed",
path);
ret = -errno;
goto end;
ret = lseek(fd, handle->offset, SEEK_SET);
if (ret < 0) {
- PERROR("Failed to restore filesystem handle to %s, lseek() failed",
+ PERROR("Failed to restore filesystem handle to %s, lseek() failed",
path);
ret = -errno;
goto end;
return ret;
}
-static
-int open_from_properties(const char *path, struct open_properties *properties)
+static int open_from_properties(
+ const char *path, struct open_properties *properties)
{
int ret;
* thus it is ignored here.
*/
if ((properties->flags & O_CREAT) && properties->mode.is_set) {
- ret = open(path, properties->flags,
- properties->mode.value);
+ ret = open(path, properties->flags, properties->mode.value);
} else {
ret = open(path, properties->flags);
}
DBG_NO_LOC(" capacity: %u", tracker->capacity);
DBG_NO_LOC(" Tracked suspendable file descriptors");
- cds_list_for_each_entry(handle, &tracker->active_handles,
- handles_list_node) {
+ cds_list_for_each_entry (
+ handle, &tracker->active_handles, handles_list_node) {
fs_handle_log(handle);
}
- cds_list_for_each_entry(handle, &tracker->suspended_handles,
+ cds_list_for_each_entry (handle, &tracker->suspended_handles,
handles_list_node) {
fs_handle_log(handle);
}
DBG_NO_LOC(" Tracked unsuspendable file descriptors");
rcu_read_lock();
- cds_lfht_for_each_entry(tracker->unsuspendable_fds, &iter,
+ cds_lfht_for_each_entry (tracker->unsuspendable_fds, &iter,
unsuspendable_fd, tracker_node) {
- DBG_NO_LOC(" %s [active, fd %d]", unsuspendable_fd->name ? : "Unnamed",
+ DBG_NO_LOC(" %s [active, fd %d]",
+ unsuspendable_fd->name ?: "Unnamed",
unsuspendable_fd->fd);
}
rcu_read_unlock();
}
struct fs_handle *fd_tracker_open_fs_handle(struct fd_tracker *tracker,
- const char *path, int flags, mode_t *mode)
+ const char *path,
+ int flags,
+ mode_t *mode)
{
int ret;
struct fs_handle *handle = NULL;
handle->properties = properties;
- handle->inode = lttng_inode_registry_get_inode(tracker->inode_registry,
- handle->fd, path);
+ handle->inode = lttng_inode_registry_get_inode(
+ tracker->inode_registry, handle->fd, path);
if (!handle->inode) {
- ERR("Failed to get lttng_inode corresponding to file %s",
- path);
+ ERR("Failed to get lttng_inode corresponding to file %s", path);
goto error;
}
}
/* Caller must hold the tracker's lock. */
-static
-int fd_tracker_suspend_handles(struct fd_tracker *tracker,
- unsigned int count)
+static int fd_tracker_suspend_handles(
+ struct fd_tracker *tracker, unsigned int count)
{
unsigned int left_to_close = count;
struct fs_handle *handle, *tmp;
- cds_list_for_each_entry_safe(handle, tmp, &tracker->active_handles,
+ cds_list_for_each_entry_safe (handle, tmp, &tracker->active_handles,
handles_list_node) {
int ret;
}
int fd_tracker_open_unsuspendable_fd(struct fd_tracker *tracker,
- int *out_fds, const char **names, unsigned int fd_count,
- fd_open_cb open, void *user_data)
+ int *out_fds,
+ const char **names,
+ unsigned int fd_count,
+ fd_open_cb open,
+ void *user_data)
{
int ret, user_ret, i, fds_to_suspend;
unsigned int active_fds;
pthread_mutex_lock(&tracker->lock);
active_fds = ACTIVE_COUNT(tracker);
- fds_to_suspend = (int) active_fds + (int) fd_count - (int) tracker->capacity;
+ fds_to_suspend = (int) active_fds + (int) fd_count -
+ (int) tracker->capacity;
if (fds_to_suspend > 0) {
if (fds_to_suspend <= tracker->count.suspendable.active) {
- ret = fd_tracker_suspend_handles(tracker, fds_to_suspend);
+ ret = fd_tracker_suspend_handles(
+ tracker, fds_to_suspend);
if (ret) {
goto end;
}
* of unsuspendable fds.
*/
for (i = 0; i < fd_count; i++) {
- struct unsuspendable_fd *entry =
- unsuspendable_fd_create(names ? names[i] : NULL,
- out_fds[i]);
+ struct unsuspendable_fd *entry = unsuspendable_fd_create(
+ names ? names[i] : NULL, out_fds[i]);
if (!entry) {
ret = -1;
struct cds_lfht_node *node;
struct unsuspendable_fd *entry = entries[i];
- node = cds_lfht_add_unique(
- tracker->unsuspendable_fds,
- hash_key_ulong((void *) (unsigned long) out_fds[i],
+ node = cds_lfht_add_unique(tracker->unsuspendable_fds,
+ hash_key_ulong((void *) (unsigned long)
+ out_fds[i],
seed.value),
- match_fd,
- (void *) (unsigned long) out_fds[i],
+ match_fd, (void *) (unsigned long) out_fds[i],
&entry->tracker_node);
if (node != &entry->tracker_node) {
}
int fd_tracker_close_unsuspendable_fd(struct fd_tracker *tracker,
- int *fds_in, unsigned int fd_count, fd_close_cb close,
+ int *fds_in,
+ unsigned int fd_count,
+ fd_close_cb close,
void *user_data)
{
int i, ret, user_ret;
cds_lfht_lookup(tracker->unsuspendable_fds,
hash_key_ulong((void *) (unsigned long) fds[i],
seed.value),
- match_fd,
- (void *) (unsigned long) fds[i],
+ match_fd, (void *) (unsigned long) fds[i],
&iter);
node = cds_lfht_iter_get_node(&iter);
if (!node) {
ret = -EINVAL;
goto end;
}
- entry = caa_container_of(node,
- struct unsuspendable_fd,
- tracker_node);
+ entry = caa_container_of(
+ node, struct unsuspendable_fd, tracker_node);
cds_lfht_del(tracker->unsuspendable_fds, node);
unsuspendable_fd_destroy(entry);
}
/* Caller must have taken the tracker's and handle's locks. */
-static
-void fd_tracker_track(struct fd_tracker *tracker, struct fs_handle *handle)
+static void fd_tracker_track(
+ struct fd_tracker *tracker, struct fs_handle *handle)
{
if (handle->fd >= 0) {
tracker->count.suspendable.active++;
}
/* Caller must have taken the tracker's and handle's locks. */
-static
-void fd_tracker_untrack(struct fd_tracker *tracker, struct fs_handle *handle)
+static void fd_tracker_untrack(
+ struct fd_tracker *tracker, struct fs_handle *handle)
{
if (handle->fd >= 0) {
tracker->count.suspendable.active--;
}
/* Caller must have taken the tracker's and handle's locks. */
-static
-int fd_tracker_restore_handle(struct fd_tracker *tracker,
- struct fs_handle *handle)
+static int fd_tracker_restore_handle(
+ struct fd_tracker *tracker, struct fs_handle *handle)
{
int ret;
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#include <sys/types.h>
+#include <common/defaults.h>
+#include <common/error.h>
+#include <common/hashtable/utils.h>
+#include <common/macros.h>
+#include <inttypes.h>
+#include <lttng/constant.h>
#include <sys/stat.h>
+#include <sys/types.h>
#include <unistd.h>
-#include <inttypes.h>
#include <urcu.h>
-#include <urcu/ref.h>
#include <urcu/rculfhash.h>
-#include <common/hashtable/utils.h>
-#include <common/macros.h>
-#include <common/defaults.h>
-#include <common/error.h>
-#include <lttng/constant.h>
+#include <urcu/ref.h>
#include "inode.h"
bool initialized;
unsigned long value;
} seed = {
- .lock = PTHREAD_MUTEX_INITIALIZER,
+ .lock = PTHREAD_MUTEX_INITIALIZER,
};
-static
-unsigned long lttng_inode_id_hash(struct inode_id *id)
+static unsigned long lttng_inode_id_hash(struct inode_id *id)
{
uint64_t device = id->device, inode_no = id->inode;
- return hash_key_u64(&device, seed.value) ^
- hash_key_u64(&inode_no, seed.value);
+ return hash_key_u64(&device, seed.value) ^
+ hash_key_u64(&inode_no, seed.value);
}
-static
-int lttng_inode_match(struct cds_lfht_node *node, const void *key)
+static int lttng_inode_match(struct cds_lfht_node *node, const void *key)
{
const struct inode_id *id = key;
- struct lttng_inode *inode = caa_container_of(node, struct lttng_inode,
- registry_node);
+ struct lttng_inode *inode = caa_container_of(
+ node, struct lttng_inode, registry_node);
return inode->id.device == id->device && inode->id.inode == id->inode;
}
-static
-void lttng_inode_delete(struct rcu_head *head)
+static void lttng_inode_delete(struct rcu_head *head)
{
- struct lttng_inode *inode = caa_container_of(head,
- struct lttng_inode, rcu_head);
+ struct lttng_inode *inode =
+ caa_container_of(head, struct lttng_inode, rcu_head);
free(inode->path);
free(inode);
}
-static
-void lttng_inode_destroy(struct lttng_inode *inode)
+static void lttng_inode_destroy(struct lttng_inode *inode)
{
if (!inode) {
return;
call_rcu(&inode->rcu_head, lttng_inode_delete);
}
-static
-void lttng_inode_release(struct urcu_ref *ref)
+static void lttng_inode_release(struct urcu_ref *ref)
{
- lttng_inode_destroy(caa_container_of(ref, struct lttng_inode, ref));
+ lttng_inode_destroy(caa_container_of(ref, struct lttng_inode, ref));
}
-static
-void lttng_inode_get(struct lttng_inode *inode)
+static void lttng_inode_get(struct lttng_inode *inode)
{
urcu_ref_get(&inode->ref);
}
return inode->path;
}
-int lttng_inode_rename(struct lttng_inode *inode, const char *new_path,
- bool overwrite)
+int lttng_inode_rename(
+ struct lttng_inode *inode, const char *new_path, bool overwrite)
{
int ret = 0;
char *new_path_copy = NULL;
int p_ret;
if (i != 0) {
- p_ret = snprintf(suffix, sizeof(suffix), "-deleted-%" PRIu16, i);
+ p_ret = snprintf(suffix, sizeof(suffix),
+ "-deleted-%" PRIu16, i);
if (p_ret < 0) {
PERROR("Failed to form suffix to rename file %s",
return ret;
}
-static
-struct lttng_inode *lttng_inode_create(const struct inode_id *id,
- const char *path, struct cds_lfht *ht)
+static struct lttng_inode *lttng_inode_create(const struct inode_id *id,
+ const char *path,
+ struct cds_lfht *ht)
{
struct lttng_inode *inode = zmalloc(sizeof(*inode));
}
struct lttng_inode *lttng_inode_registry_get_inode(
- struct lttng_inode_registry *registry,
- int fd, const char *path)
+ struct lttng_inode_registry *registry, int fd, const char *path)
{
int ret;
struct stat statbuf;
id.inode = statbuf.st_ino;
rcu_read_lock();
- cds_lfht_lookup(registry->inodes,
- lttng_inode_id_hash(&id),
- lttng_inode_match,
- &id,
- &iter);
+ cds_lfht_lookup(registry->inodes, lttng_inode_id_hash(&id),
+ lttng_inode_match, &id, &iter);
node = cds_lfht_iter_get_node(&iter);
if (node) {
- inode = caa_container_of(node, struct lttng_inode, registry_node);
+ inode = caa_container_of(
+ node, struct lttng_inode, registry_node);
/* Renames should happen through the fs-handle interface. */
assert(!strcmp(path, inode->path));
lttng_inode_get(inode);
inode = lttng_inode_create(&id, path, registry->inodes);
node = cds_lfht_add_unique(registry->inodes,
- lttng_inode_id_hash(&inode->id),
- lttng_inode_match,
- &inode->id,
- &inode->registry_node);
+ lttng_inode_id_hash(&inode->id), lttng_inode_match,
+ &inode->id, &inode->registry_node);
assert(node == &inode->registry_node);
end_unlock:
rcu_read_unlock();