From: Jérémie Galarneau Date: Sat, 23 Nov 2019 00:08:18 +0000 (-0500) Subject: fd-tracker: add the unlink operation to fs handles X-Git-Tag: v2.12.0-rc1~223 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=9d16fc7fa401926b800c18124756d75b11b5b806 fd-tracker: add the unlink operation to fs handles The unlink method allows user to unlink the file refered-to by an fs_handle. As indicated in the comments, the unlink operation leverages the lttng_inode to ensure the actual unlink system call is only performed when the last reference to an lttng_inode is released by an fs_handle. Signed-off-by: Jérémie Galarneau --- diff --git a/src/common/fd-tracker/fd-tracker.c b/src/common/fd-tracker/fd-tracker.c index 67da7eab4..a4f4bcba7 100644 --- a/src/common/fd-tracker/fd-tracker.c +++ b/src/common/fd-tracker/fd-tracker.c @@ -801,6 +801,18 @@ void fs_handle_put_fd(struct fs_handle *handle) pthread_mutex_unlock(&handle->lock); } +int fs_handle_unlink(struct fs_handle *handle) +{ + int ret; + + pthread_mutex_lock(&handle->tracker->lock); + pthread_mutex_lock(&handle->lock); + ret = lttng_inode_defer_unlink(handle->inode); + pthread_mutex_unlock(&handle->lock); + pthread_mutex_unlock(&handle->tracker->lock); + return ret; +} + int fs_handle_close(struct fs_handle *handle) { int ret = 0; diff --git a/src/common/fd-tracker/fd-tracker.h b/src/common/fd-tracker/fd-tracker.h index ff5f49a1b..b8082c9a7 100644 --- a/src/common/fd-tracker/fd-tracker.h +++ b/src/common/fd-tracker/fd-tracker.h @@ -156,6 +156,20 @@ int fs_handle_get_fd(struct fs_handle *handle); */ void fs_handle_put_fd(struct fs_handle *handle); +/* + * Unlink the file associated to an fs_handle. Note that the unlink + * operation will not be performed immediately. It will only be performed + * once all references to the underlying file (through other fs_handle objects) + * have been released. + * + * However, note that the file will be renamed so as to provide the observable + * effect of an unlink(), that is removing a name from the filesystem. + * + * Returns 0 on success, otherwise a negative value will be returned + * if the operation failed. + */ +int fs_handle_unlink(struct fs_handle *handle); + /* * Frees the handle and discards the underlying fd. */