summaryrefslogtreecommitdiffstats
path: root/api/src/glfs-handleops.c
diff options
context:
space:
mode:
authorPoornima G <pgurusid@redhat.com>2015-04-29 13:03:52 +0530
committerNiels de Vos <ndevos@redhat.com>2015-05-08 15:37:54 -0700
commit1162bb36108ab8dba8303b86927a99835b791d79 (patch)
treed5a3261bfd0ed690ecd64a40124d8441e0d498af /api/src/glfs-handleops.c
parent0950e6c29fc51ddcc5bb7e1e4187d54ff7c171d2 (diff)
libgfapi: Store and restore THIS in every API exposed by libgfapi
Storing and restoring THIS: When the APIs exposed by libgfapi are called by other xlators like snapview server etc. the THIS value is overwritten to contain the THIS of libgfapi(viz libgfapi master xlator). Hence using 'THIS' in any xlator after calling libgfapi API will lead to issues. One such issue was uncovered in snapview and the patch http://review.gluster.org/#/c/9469/ was sent to workaround this issue. Hence, storing and restoring THIS, at the entry and exit of every API exposed by libgfapi. Change-Id: I6f330dde25e7700fb26339d667a7ccd193ec6ba0 BUG: 1210934 Signed-off-by: Poornima G <pgurusid@redhat.com> Reviewed-on: http://review.gluster.org/9797 Reviewed-by: Raghavendra Talur <rtalur@redhat.com> Reviewed-by: soumya k <skoduri@redhat.com> Reviewed-by: Niels de Vos <ndevos@redhat.com> Tested-by: Gluster Build System <jenkins@build.gluster.com>
Diffstat (limited to 'api/src/glfs-handleops.c')
-rw-r--r--api/src/glfs-handleops.c195
1 files changed, 155 insertions, 40 deletions
diff --git a/api/src/glfs-handleops.c b/api/src/glfs-handleops.c
index 2793e1cb118..8ff23ecff03 100644
--- a/api/src/glfs-handleops.c
+++ b/api/src/glfs-handleops.c
@@ -72,13 +72,15 @@ pub_glfs_h_lookupat (struct glfs *fs, struct glfs_object *parent,
struct glfs_object *object = NULL;
loc_t loc = {0, };
+ DECLARE_OLD_THIS;
+
/* validate in args */
- if ((fs == NULL) || (path == NULL)) {
+ if (path == NULL) {
errno = EINVAL;
return NULL;
}
- __glfs_entry_fs (fs);
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -116,6 +118,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return object;
}
@@ -130,13 +135,15 @@ pub_glfs_h_statfs (struct glfs *fs, struct glfs_object *object,
inode_t *inode = NULL;
loc_t loc = {0, };
+ DECLARE_OLD_THIS;
+
/* validate in args */
if ((fs == NULL) || (object == NULL || statvfs == NULL)) {
errno = EINVAL;
return -1;
}
- __glfs_entry_fs (fs);
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -168,6 +175,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return ret;
}
@@ -182,13 +192,15 @@ pub_glfs_h_stat (struct glfs *fs, struct glfs_object *object, struct stat *stat)
loc_t loc = {0, };
struct iatt iatt = {0, };
+ DECLARE_OLD_THIS;
+
/* validate in args */
if ((fs == NULL) || (object == NULL)) {
errno = EINVAL;
return -1;
}
- __glfs_entry_fs (fs);
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -224,6 +236,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return ret;
}
@@ -234,7 +249,7 @@ int
pub_glfs_h_getattrs (struct glfs *fs, struct glfs_object *object,
struct stat *stat)
{
- int ret = 0;
+ int ret = -1;
xlator_t *subvol = NULL;
inode_t *inode = NULL;
struct iatt iatt = {0, };
@@ -245,7 +260,8 @@ pub_glfs_h_getattrs (struct glfs *fs, struct glfs_object *object,
return -1;
}
- __glfs_entry_fs (fs);
+ DECLARE_OLD_THIS;
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -258,6 +274,7 @@ pub_glfs_h_getattrs (struct glfs *fs, struct glfs_object *object,
/* get/refresh the in arg objects inode in correlation to the xlator */
inode = glfs_resolve_inode (fs, subvol, object);
if (!inode) {
+ ret = 0;
errno = ESTALE;
goto out;
}
@@ -276,6 +293,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return ret;
}
@@ -297,8 +317,6 @@ glfs_h_getxattrs_common (struct glfs *fs, struct glfs_object *object,
return -1;
}
- __glfs_entry_fs (fs);
-
/* get the active volume */
subvol = glfs_active_subvol (fs);
if (!subvol) {
@@ -336,7 +354,7 @@ int
pub_glfs_h_getxattrs (struct glfs *fs, struct glfs_object *object,
const char *name, void *value, size_t size)
{
- int ret = 0;
+ int ret = -1;
dict_t *xattr = NULL;
/* validate in args */
@@ -345,6 +363,9 @@ pub_glfs_h_getxattrs (struct glfs *fs, struct glfs_object *object,
return -1;
}
+ DECLARE_OLD_THIS;
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
+
ret = glfs_h_getxattrs_common (fs, object, &xattr, name);
if (ret)
goto out;
@@ -358,6 +379,10 @@ pub_glfs_h_getxattrs (struct glfs *fs, struct glfs_object *object,
out:
if (xattr)
dict_unref (xattr);
+
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return ret;
}
@@ -380,7 +405,8 @@ pub_glfs_h_setattrs (struct glfs *fs, struct glfs_object *object,
return -1;
}
- __glfs_entry_fs (fs);
+ DECLARE_OLD_THIS;
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -414,6 +440,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return ret;
}
@@ -438,7 +467,8 @@ pub_glfs_h_setxattrs (struct glfs *fs, struct glfs_object *object,
return -1;
}
- __glfs_entry_fs (fs);
+ DECLARE_OLD_THIS;
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -480,6 +510,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return ret;
}
@@ -501,7 +534,8 @@ pub_glfs_h_removexattrs (struct glfs *fs, struct glfs_object *object,
return -1;
}
- __glfs_entry_fs (fs);
+ DECLARE_OLD_THIS;
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -533,6 +567,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return ret;
}
@@ -554,7 +591,8 @@ pub_glfs_h_open (struct glfs *fs, struct glfs_object *object, int flags)
return NULL;
}
- __glfs_entry_fs (fs);
+ DECLARE_OLD_THIS;
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -622,6 +660,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return glfd;
}
@@ -648,7 +689,8 @@ pub_glfs_h_creat (struct glfs *fs, struct glfs_object *parent, const char *path,
return NULL;
}
- __glfs_entry_fs (fs);
+ DECLARE_OLD_THIS;
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -726,6 +768,7 @@ pub_glfs_h_creat (struct glfs *fs, struct glfs_object *parent, const char *path,
out:
if (ret && object != NULL) {
+ /* Release the held reference */
glfs_h_close (object);
object = NULL;
}
@@ -745,6 +788,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return object;
}
@@ -770,7 +816,8 @@ pub_glfs_h_mkdir (struct glfs *fs, struct glfs_object *parent, const char *path,
return NULL;
}
- __glfs_entry_fs (fs);
+ DECLARE_OLD_THIS;
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -837,6 +884,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return object;
}
@@ -862,7 +912,8 @@ pub_glfs_h_mknod (struct glfs *fs, struct glfs_object *parent, const char *path,
return NULL;
}
- __glfs_entry_fs (fs);
+ DECLARE_OLD_THIS;
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -928,6 +979,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return object;
}
@@ -948,7 +1002,8 @@ pub_glfs_h_unlink (struct glfs *fs, struct glfs_object *parent, const char *path
return -1;
}
- __glfs_entry_fs (fs);
+ DECLARE_OLD_THIS;
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -995,6 +1050,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return ret;
}
@@ -1016,7 +1074,8 @@ pub_glfs_h_opendir (struct glfs *fs, struct glfs_object *object)
return NULL;
}
- __glfs_entry_fs (fs);
+ DECLARE_OLD_THIS;
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -1074,6 +1133,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return glfd;
}
@@ -1094,7 +1156,8 @@ pub_glfs_h_access (struct glfs *fs, struct glfs_object *object, int mask)
goto out;
}
- __glfs_entry_fs (fs);
+ DECLARE_OLD_THIS;
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -1128,6 +1191,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return ret;
}
@@ -1185,7 +1251,8 @@ pub_glfs_h_create_from_handle (struct glfs *fs, unsigned char *handle, int len,
return NULL;
}
- __glfs_entry_fs (fs);
+ DECLARE_OLD_THIS;
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -1255,6 +1322,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return object;
}
@@ -1264,7 +1334,6 @@ GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_h_create_from_handle, 3.4.2);
int
pub_glfs_h_close (struct glfs_object *object)
{
- /* Release the held reference */
inode_unref (object->inode);
GF_FREE (object);
@@ -1282,13 +1351,15 @@ pub_glfs_h_truncate (struct glfs *fs, struct glfs_object *object, off_t offset)
xlator_t *subvol = NULL;
inode_t *inode = NULL;
+ DECLARE_OLD_THIS;
+
/* validate in args */
- if ((fs == NULL) || (object == NULL)) {
+ if (object == NULL) {
errno = EINVAL;
return -1;
}
- __glfs_entry_fs (fs);
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -1323,6 +1394,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return ret;
}
@@ -1342,14 +1416,16 @@ pub_glfs_h_symlink (struct glfs *fs, struct glfs_object *parent,
dict_t *xattr_req = NULL;
struct glfs_object *object = NULL;
+ DECLARE_OLD_THIS;
+
/* validate in args */
- if ((fs == NULL) || (parent == NULL) || (name == NULL) ||
+ if ((parent == NULL) || (name == NULL) ||
(data == NULL)) {
errno = EINVAL;
return NULL;
}
- __glfs_entry_fs (fs);
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -1421,6 +1497,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return object;
}
@@ -1437,13 +1516,15 @@ pub_glfs_h_readlink (struct glfs *fs, struct glfs_object *object, char *buf,
inode_t *inode = NULL;
char *linkval = NULL;
+ DECLARE_OLD_THIS;
+
/* validate in args */
- if ((fs == NULL) || (object == NULL) || (buf == NULL)) {
+ if ((object == NULL) || (buf == NULL)) {
errno = EINVAL;
return -1;
}
- __glfs_entry_fs (fs);
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -1481,6 +1562,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return ret;
}
@@ -1498,14 +1582,16 @@ pub_glfs_h_link (struct glfs *fs, struct glfs_object *linksrc,
loc_t oldloc = {0, };
loc_t newloc = {0, };
+ DECLARE_OLD_THIS;
+
/* validate in args */
- if ((fs == NULL) || (linksrc == NULL) || (parent == NULL) ||
+ if ((linksrc == NULL) || (parent == NULL) ||
(name == NULL)) {
errno = EINVAL;
return -1;
}
- __glfs_entry_fs (fs);
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -1570,6 +1656,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return ret;
}
@@ -1590,14 +1679,16 @@ pub_glfs_h_rename (struct glfs *fs, struct glfs_object *olddir,
struct iatt oldiatt = {0, };
struct iatt newiatt = {0, };
+ DECLARE_OLD_THIS;
+
/* validate in args */
- if ((fs == NULL) || (olddir == NULL) || (oldname == NULL) ||
+ if ((olddir == NULL) || (oldname == NULL) ||
(newdir == NULL) || (newname == NULL)) {
errno = EINVAL;
return -1;
}
- __glfs_entry_fs (fs);
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
/* get the active volume */
subvol = glfs_active_subvol (fs);
@@ -1667,6 +1758,9 @@ out:
glfs_subvol_done (fs, subvol);
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return ret;
}
@@ -1777,19 +1871,21 @@ pub_glfs_h_poll_upcall (struct glfs *fs, struct callback_arg *up_arg)
int ret = -1;
struct gf_upcall *upcall_data = NULL;
- if (!fs || !up_arg) {
+ DECLARE_OLD_THIS;
+
+ if (!up_arg) {
errno = EINVAL;
goto err;
}
- __glfs_entry_fs (fs);
+ __GLFS_ENTRY_VALIDATE_FS (fs, err);
/* get the active volume */
subvol = glfs_active_subvol (fs);
if (!subvol) {
errno = EIO;
- goto err;
+ goto restore;
}
/* Ideally applications should stop polling before calling
@@ -1871,6 +1967,8 @@ out:
glfs_subvol_done (fs, subvol);
+restore:
+ __GLFS_EXIT_FS;
err:
return ret;
}
@@ -1890,23 +1988,32 @@ pub_glfs_h_acl_set (struct glfs *fs, struct glfs_object *object,
const char *acl_key = NULL;
ssize_t acl_len = 0;
- if (!fs || !object || !acl) {
+ DECLARE_OLD_THIS;
+
+ if (!object || !acl) {
errno = EINVAL;
return ret;
}
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
+
acl_key = gf_posix_acl_get_key (type);
if (!acl_key)
- return ret;
+ goto out;
acl_s = acl_to_any_text (acl, NULL, ',',
TEXT_ABBREVIATE | TEXT_NUMERIC_IDS);
if (!acl_s)
- return ret;
+ goto out;
ret = pub_glfs_h_setxattrs (fs, object, acl_key, acl_s, acl_len, 0);
acl_free (acl_s);
+
+out:
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return ret;
}
@@ -1920,18 +2027,22 @@ pub_glfs_h_acl_get (struct glfs *fs, struct glfs_object *object,
dict_t *xattr = NULL;
const char *acl_key = NULL;
- if (!fs || !object) {
+ DECLARE_OLD_THIS;
+
+ if (!object) {
errno = EINVAL;
return NULL;
}
+ __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);
+
acl_key = gf_posix_acl_get_key (type);
if (!acl_key)
- return NULL;
+ goto out;
ret = glfs_h_getxattrs_common (fs, object, &xattr, acl_key);
if (ret)
- return NULL;
+ goto out;
ret = dict_get_str (xattr, (char *)acl_key, &acl_s);
if (ret == -1)
@@ -1941,6 +2052,10 @@ pub_glfs_h_acl_get (struct glfs *fs, struct glfs_object *object,
out:
GF_FREE (acl_s);
+
+ __GLFS_EXIT_FS;
+
+invalid_fs:
return acl;
}
#else /* !HAVE_ACL_LIBACL_H */