diff options
Diffstat (limited to 'api/src')
| -rw-r--r-- | api/src/gfapi.aliases | 2 | ||||
| -rw-r--r-- | api/src/gfapi.map | 5 | ||||
| -rw-r--r-- | api/src/glfs-fops.c | 51 | ||||
| -rw-r--r-- | api/src/glfs-internal.h | 1 | ||||
| -rw-r--r-- | api/src/glfs.h | 28 | 
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 */  | 
