summaryrefslogtreecommitdiffstats
path: root/api/src
diff options
context:
space:
mode:
Diffstat (limited to 'api/src')
-rw-r--r--api/src/gfapi.aliases2
-rw-r--r--api/src/gfapi.map5
-rw-r--r--api/src/glfs-fops.c51
-rw-r--r--api/src/glfs-internal.h1
-rw-r--r--api/src/glfs.h28
5 files changed, 87 insertions, 0 deletions
diff --git a/api/src/gfapi.aliases b/api/src/gfapi.aliases
index b0facb717b3..00a9e3753af 100644
--- a/api/src/gfapi.aliases
+++ b/api/src/gfapi.aliases
@@ -163,3 +163,5 @@ _pub_glfs_xreaddirplus_r_get_object _glfs_xreaddirplus_r_get_object$GFAPI_3.11.0
_pub_glfs_object_copy _glfs_object_copy$GFAPI_3.11.0
_priv_glfs_ipc _glfs_ipc$GFAPI_3.12.0
+
+_pub_glfd_set_lk_owner _glfd_set_lk_owner$GFAPI_3.13.0
diff --git a/api/src/gfapi.map b/api/src/gfapi.map
index 7f19e1ee4f9..c9ce4d82235 100644
--- a/api/src/gfapi.map
+++ b/api/src/gfapi.map
@@ -209,3 +209,8 @@ GFAPI_PRIVATE_3.12.0 {
global:
glfs_ipc;
} GFAPI_3.11.0;
+
+GFAPI_3.13.0 {
+ global:
+ glfd_set_lk_owner;
+} GFAPI_PRIVATE_3.12.0;
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c
index e6ed07a68a9..f47ef625613 100644
--- a/api/src/glfs-fops.c
+++ b/api/src/glfs-fops.c
@@ -267,6 +267,12 @@ pub_glfs_close (struct glfs_fd *glfd)
goto out;
}
+ if (glfd->lk_owner.len != 0) {
+ ret = syncopctx_setfslkowner (&glfd->lk_owner);
+ if (ret)
+ goto out;
+ }
+
ret = syncop_flush (subvol, fd, NULL, NULL);
DECODE_SYNCOP_ERR (ret);
out:
@@ -4272,6 +4278,14 @@ pub_glfs_posix_lock (struct glfs_fd *glfd, int cmd, struct flock *flock)
gf_flock_from_flock (&gf_flock, flock);
gf_flock_from_flock (&saved_flock, flock);
+
+ if (glfd->lk_owner.len != 0) {
+ ret = syncopctx_setfslkowner (&glfd->lk_owner);
+
+ if (ret)
+ goto out;
+ }
+
ret = syncop_lk (subvol, fd, cmd, &gf_flock, NULL, NULL);
DECODE_SYNCOP_ERR (ret);
gf_flock_to_flock (&gf_flock, flock);
@@ -4294,6 +4308,43 @@ invalid_fs:
GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_posix_lock, 3.4.0);
+int
+pub_glfd_set_lk_owner (glfs_fd_t *glfd, void *data, int len)
+{
+ int ret = -1;
+
+ DECLARE_OLD_THIS;
+ __GLFS_ENTRY_VALIDATE_FD (glfd, invalid_fs);
+
+ if (!GF_REF_GET (glfd)) {
+ goto invalid_fs;
+ }
+
+ GF_VALIDATE_OR_GOTO (THIS->name, data, out);
+
+ if ((len <= 0) || (len > GFAPI_MAX_LOCK_OWNER_LEN)) {
+ errno = EINVAL;
+ gf_msg (THIS->name, GF_LOG_ERROR, errno,
+ LG_MSG_INVALID_ARG,
+ "Invalid lk_owner len (%d)", len);
+ goto out;
+ }
+
+ glfd->lk_owner.len = len;
+
+ memcpy (glfd->lk_owner.data, data, len);
+
+ ret = 0;
+out:
+ if (glfd)
+ GF_REF_PUT (glfd);
+
+ __GLFS_EXIT_FS;
+
+invalid_fs:
+ return ret;
+}
+GFAPI_SYMVER_PUBLIC_DEFAULT(glfd_set_lk_owner, 3.13.0);
struct glfs_fd *
pub_glfs_dup (struct glfs_fd *glfd)
diff --git a/api/src/glfs-internal.h b/api/src/glfs-internal.h
index be2d60a38e0..757bc18eb1d 100644
--- a/api/src/glfs-internal.h
+++ b/api/src/glfs-internal.h
@@ -215,6 +215,7 @@ struct glfs_fd {
struct list_head entries;
gf_dirent_t *next;
struct dirent *readdirbuf;
+ gf_lkowner_t lk_owner;
};
/* glfs object handle introduced for the alternate gfapi implementation based
diff --git a/api/src/glfs.h b/api/src/glfs.h
index 5420a1dde66..acf63c32655 100644
--- a/api/src/glfs.h
+++ b/api/src/glfs.h
@@ -855,6 +855,34 @@ glfs_xreaddirplus_r (struct glfs_fd *glfd, uint32_t flags,
struct dirent *ext, struct dirent **res);
GFAPI_PUBLIC(glfs_xreaddirplus_r, 3.11.0);
+#define GFAPI_MAX_LOCK_OWNER_LEN 255
+
+/*
+ *
+ * DESCRIPTION
+ *
+ * This API allows application to set lk_owner on a fd.
+ * A glfd can be associated with only single lk_owner. In case if there
+ * is need to set another lk_owner, applications can make use of
+ * 'glfs_dup' to get duplicate glfd and set new lk_owner on that second
+ * glfd.
+ *
+ * Also its not recommended to override or clear lk_owner value as the
+ * same shall be used to flush any outstanding locks while closing the fd.
+ *
+ * PARAMETERS
+ *
+ * INPUT:
+ * @glfd: GFAPI file descriptor
+ * @len: Size of lk_owner buffer. Max value can be GFAPI_MAX_LOCK_OWNER_LEN
+ * @data: lk_owner data buffer.
+ *
+ * OUTPUT:
+ * 0: SUCCESS
+ * -1: FAILURE
+ */
+int glfd_set_lk_owner (glfs_fd_t *glfd, void *data, int len);
+ GFAPI_PUBLIC(glfd_set_lk_owner, 3.13.0);
__END_DECLS
#endif /* !_GLFS_H */