diff options
author | Soumya Koduri <skoduri@redhat.com> | 2017-10-17 16:12:06 +0530 |
---|---|---|
committer | jiffin tony Thottan <jthottan@redhat.com> | 2017-10-25 11:33:39 +0000 |
commit | 19fe3906c13ad360c07bb94db6b7f63024b30ef1 (patch) | |
tree | 4e2cd2fbaf49d3bb26b359c593933b546ba173e9 /api/src/glfs-fops.c | |
parent | 7d929bacbe537ee84964bb8d79f84d6c58a6cb04 (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.c | 51 |
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) |