diff options
Diffstat (limited to 'api/src/glfs-handleops.c')
| -rw-r--r-- | api/src/glfs-handleops.c | 195 | 
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 */  | 
