diff options
| author | Soumya Koduri <skoduri@redhat.com> | 2017-10-04 14:34:48 +0530 | 
|---|---|---|
| committer | Soumya Koduri <skoduri@redhat.com> | 2017-10-12 16:12:36 +0530 | 
| commit | c22cec3928be6924fb1026ef969cae897efbd76d (patch) | |
| tree | 60a10e937bab57ed285eda10a122dcffef99e2e7 /api/src/glfs-fops.c | |
| parent | a3767c4ceb527cb0f52b95650c841964cf7faec9 (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.
Change-Id: I67591d6b9a89c20b9617d52616513ff9e6c06b47
BUG: 1499641
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 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)  | 
