diff options
Diffstat (limited to 'api/src/glfs-handleops.c')
-rw-r--r-- | api/src/glfs-handleops.c | 68 |
1 files changed, 62 insertions, 6 deletions
diff --git a/api/src/glfs-handleops.c b/api/src/glfs-handleops.c index 38a9a7ad2a5..a500aae3aee 100644 --- a/api/src/glfs-handleops.c +++ b/api/src/glfs-handleops.c @@ -682,8 +682,6 @@ pub_glfs_h_open (struct glfs *fs, struct glfs_object *object, int flags) DECODE_SYNCOP_ERR (ret); glfd->fd->flags = flags; - fd_bind (glfd->fd); - glfs_fd_bind (glfd); out: loc_wipe (&loc); @@ -695,7 +693,7 @@ out: GF_REF_PUT (glfd); glfd = NULL; } else if (glfd) { - glfd->state = GLFD_OPEN; + glfd_set_state_bind (glfd); } glfs_subvol_done (fs, subvol); @@ -1150,9 +1148,7 @@ out: GF_REF_PUT (glfd); glfd = NULL; } else if (glfd) { - glfd->state = GLFD_OPEN; - fd_bind (glfd->fd); - glfs_fd_bind (glfd); + glfd_set_state_bind (glfd); } glfs_subvol_done (fs, subvol); @@ -2460,3 +2456,63 @@ out: return NULL; } GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_xreaddirplus_get_object, 3.11.0); + +int +pub_glfs_h_lease (struct glfs *fs, struct glfs_object *object, + struct glfs_lease *lease) +{ + int ret = -1; + xlator_t *subvol = NULL; + inode_t *inode = NULL; + loc_t loc = {0, }; + struct gf_lease gf_lease = {0, }; + + /* validate in args */ + if ((fs == NULL) || (object == NULL)) { + errno = EINVAL; + return -1; + } + + DECLARE_OLD_THIS; + __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs); + + /* get the active volume */ + subvol = glfs_active_subvol (fs); + if (!subvol) { + ret = -1; + errno = EIO; + goto out; + } + + /* get/refresh the in arg objects inode in correlation to the xlator */ + inode = glfs_resolve_inode (fs, subvol, object); + if (!inode) { + errno = ESTALE; + goto out; + } + + /* populate loc */ + GLFS_LOC_FILL_INODE (inode, loc, out); + + glfs_lease_to_gf_lease (lease, &gf_lease); + + ret = syncop_lease (subvol, &loc, &gf_lease, NULL, NULL); + DECODE_SYNCOP_ERR (ret); + + gf_lease_to_glfs_lease (&gf_lease, lease); + +out: + loc_wipe (&loc); + + if (inode) + inode_unref (inode); + + glfs_subvol_done (fs, subvol); + + __GLFS_EXIT_FS; + +invalid_fs: + return ret; +} + +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_lease, 4.0.0); |