summaryrefslogtreecommitdiffstats
path: root/api/src/glfs-fops.c
diff options
context:
space:
mode:
authorSoumya Koduri <skoduri@redhat.com>2017-10-17 16:12:06 +0530
committerjiffin tony Thottan <jthottan@redhat.com>2017-10-25 11:33:39 +0000
commit19fe3906c13ad360c07bb94db6b7f63024b30ef1 (patch)
tree4e2cd2fbaf49d3bb26b359c593933b546ba173e9 /api/src/glfs-fops.c
parent7d929bacbe537ee84964bb8d79f84d6c58a6cb04 (diff)
gfapi: set lkowner in glfd
We need a provision to be able to set lkowner (which is used to distinguish locks maintained by server) in gfapi. Since the same lk_owner need to be used to be able to flush the lock while closing the fd, store the lkowner in the glfd structure itself. A new API has been added to be able to set lkowner in glfd. This is backport of below mainline fix - https://review.gluster.org/#/c/18429 https://review.gluster.org/#/c/18522/ Change-Id: I67591d6b9a89c20b9617d52616513ff9e6c06b47 BUG: 1501956 Signed-off-by: Soumya Koduri <skoduri@redhat.com>
Diffstat (limited to 'api/src/glfs-fops.c')
-rw-r--r--api/src/glfs-fops.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c
index c8ddeea196e..7fb86fc859f 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_glfs_fd_set_lkowner (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(glfs_fd_set_lkowner, 3.10.7);
struct glfs_fd *
pub_glfs_dup (struct glfs_fd *glfd)