diff options
Diffstat (limited to 'api/src/glfs.c')
| -rw-r--r-- | api/src/glfs.c | 119 | 
1 files changed, 88 insertions, 31 deletions
diff --git a/api/src/glfs.c b/api/src/glfs.c index 23377f651d1..d6a6fe9c850 100644 --- a/api/src/glfs.c +++ b/api/src/glfs.c @@ -303,6 +303,9 @@ pub_glfs_set_xlator_option (struct glfs *fs, const char *xlator,  {  	xlator_cmdline_option_t *option = NULL; +        DECLARE_OLD_THIS; +        __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs); +  	option = GF_CALLOC (1, sizeof (*option),  			    glfs_mt_xlator_cmdline_option_t);  	if (!option) @@ -322,18 +325,25 @@ pub_glfs_set_xlator_option (struct glfs *fs, const char *xlator,  	list_add (&option->cmd_args, &fs->ctx->cmd_args.xlator_options); +        __GLFS_EXIT_FS; +  	return 0;  enomem:  	errno = ENOMEM; -	if (!option) +	if (!option) { +                __GLFS_EXIT_FS;  		return -1; +        }  	GF_FREE (option->volume);  	GF_FREE (option->key);  	GF_FREE (option->value);  	GF_FREE (option); +        __GLFS_EXIT_FS; + +invalid_fs:  	return -1;  } @@ -353,6 +363,9 @@ pub_glfs_unset_volfile_server (struct glfs *fs, const char *transport,                  return ret;          } +        DECLARE_OLD_THIS; +        __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs); +          cmd_args = &fs->ctx->cmd_args;          list_for_each_entry(server, &cmd_args->curr_server->list, list) {                  if ((!strcmp(server->volfile_server, host) && @@ -365,6 +378,9 @@ pub_glfs_unset_volfile_server (struct glfs *fs, const char *transport,          }  out: +        __GLFS_EXIT_FS; + +invalid_fs:          return ret;  } @@ -385,6 +401,9 @@ pub_glfs_set_volfile_server (struct glfs *fs, const char *transport,                  return ret;          } +        DECLARE_OLD_THIS; +        __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs); +          cmd_args = &fs->ctx->cmd_args;          cmd_args->max_connect_attempts = 1; @@ -444,6 +463,9 @@ out:                  }          } +        __GLFS_EXIT_FS; + +invalid_fs:          return ret;  } @@ -453,6 +475,9 @@ GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_volfile_server, 3.4.0);  int  pub_glfs_setfsuid (uid_t fsuid)  { +         /* TODO: +         * - Set the THIS and restore it appropriately +         */  	return syncopctx_setfsuid (&fsuid);  } @@ -462,6 +487,9 @@ GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setfsuid, 3.4.2);  int  pub_glfs_setfsgid (gid_t fsgid)  { +         /* TODO: +         * - Set the THIS and restore it appropriately +         */  	return syncopctx_setfsgid (&fsgid);  } @@ -471,6 +499,9 @@ GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setfsgid, 3.4.2);  int  pub_glfs_setfsgroups (size_t size, const gid_t *list)  { +         /* TODO: +         * - Set the THIS and restore it appropriately +         */  	return syncopctx_setfsgroups(size, list);  } @@ -563,7 +594,7 @@ pub_glfs_new (const char *volname)  	struct glfs     *fs             = NULL;  	int              ret            = -1;  	glusterfs_ctx_t *ctx            = NULL; -        gf_boolean_t     cleanup_fini   = _gf_false; +        xlator_t        *old_THIS       = NULL;          if (!volname) {                  errno = EINVAL; @@ -590,47 +621,49 @@ pub_glfs_new (const char *volname)          if (ret != 0)                  goto cond_child_destroy; -        cleanup_fini = _gf_true; -          ctx = glusterfs_ctx_new ();          if (!ctx) -                goto freefs; +                goto fini;          /* first globals init, for gf_mem_acct_enable_set () */          ret = glusterfs_globals_init (ctx);          if (ret) -                goto freefs; +                goto fini; -        if (!THIS->ctx) -                THIS->ctx = ctx; +        old_THIS = THIS; +        /* THIS is set to NULL so that we do not modify the caller xlators' +         * ctx, instead we set the global_xlator->ctx +         */ +        THIS = NULL; +        THIS->ctx = ctx;          /* then ctx_defaults_init, for xlator_mem_acct_init(THIS) */          ret = glusterfs_ctx_defaults_init (ctx);          if (ret) -                goto freefs; +                goto fini;          fs->ctx = ctx;          ret = glfs_set_logging (fs, "/dev/null", 0);          if (ret) -                goto freefs; +                goto fini;          fs->ctx->cmd_args.volfile_id = gf_strdup (volname);          if (!(fs->ctx->cmd_args.volfile_id)) -                goto freefs; +                goto fini;          fs->volname = strdup (volname);          if (!fs->volname) -                goto freefs; +                goto fini;          INIT_LIST_HEAD (&fs->openfds);          INIT_LIST_HEAD (&fs->upcall_list);          fs->pin_refcnt = 0; -        return fs; +        goto out;  cond_child_destroy:          pthread_cond_destroy (&fs->child_down_cond); @@ -642,7 +675,10 @@ mutex_destroy:          pthread_mutex_destroy (&fs->mutex);  freefs: - +        FREE (fs); +        fs = NULL; +        goto out; +fini:          /*           * When pthread_*init() fails there is no way for other cleanup           * funtions (glfs_fini/glfs_free_from_ctx) to know which of them succeded @@ -651,14 +687,13 @@ freefs:           * directly call glfs_fini() to cleanup the resources.           */ -        if (!cleanup_fini) -                FREE(fs); -        else -                glfs_fini (fs); -        fs = NULL; +         glfs_fini (fs); +         fs = NULL; +out: +        if (old_THIS) +                THIS = old_THIS;          return fs; -  }  GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_new, 3.4.0); @@ -750,9 +785,12 @@ GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_volfile, 3.4.0);  int  pub_glfs_set_logging (struct glfs *fs, const char *logfile, int loglevel)  { -        int  ret = 0; +        int  ret = -1;          char *tmplog = NULL; +        DECLARE_OLD_THIS; +        __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs); +          if (!logfile) {                  ret = gf_set_log_file_path (&fs->ctx->cmd_args);                  if (ret) @@ -775,6 +813,9 @@ pub_glfs_set_logging (struct glfs *fs, const char *logfile, int loglevel)                  goto out;  out: +        __GLFS_EXIT_FS; + +invalid_fs:          return ret;  } @@ -882,6 +923,8 @@ pub_glfs_init (struct glfs *fs)  {  	int  ret = -1; +        DECLARE_OLD_THIS; +  	if (!fs || !fs->ctx) {  		gf_msg ("glfs", GF_LOG_ERROR, EINVAL, API_MSG_INVALID_ENTRY,  			"fs is not properly initialized."); @@ -889,17 +932,22 @@ pub_glfs_init (struct glfs *fs)  		return ret;  	} +        __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs); +  	ret = glfs_init_common (fs);  	if (ret) -		return ret; +		goto out;  	ret = glfs_init_wait (fs); +out: +        __GLFS_EXIT_FS;          /* Set the initial current working directory to "/" */          if (ret >= 0) {                  ret = glfs_chdir (fs, "/");          } +invalid_fs:  	return ret;  } @@ -985,19 +1033,15 @@ pub_glfs_fini (struct glfs *fs)          int                fs_init = 0;          int                err = -1; +        DECLARE_OLD_THIS; -        if (!fs) { -                errno = EINVAL; -                return 0; -        } +        __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);          ctx = fs->ctx;          if (!ctx) {                  goto free_fs;          } -        __glfs_entry_fs (fs); -          if (ctx->mgmt) {                  rpc_clnt_disable (ctx->mgmt);                  ctx->mgmt = NULL; @@ -1141,6 +1185,9 @@ fail:          if (!ret)                  ret = err; +        __GLFS_EXIT_FS; + +invalid_fs:          return ret;  } @@ -1150,7 +1197,10 @@ GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fini, 3.4.0);  ssize_t  pub_glfs_get_volfile (struct glfs *fs, void *buf, size_t len)  { -        ssize_t         res; +        ssize_t         res = -1; + +        DECLARE_OLD_THIS; +        __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);          glfs_lock(fs);          if (len >= fs->oldvollen) { @@ -1164,6 +1214,9 @@ pub_glfs_get_volfile (struct glfs *fs, void *buf, size_t len)          }          glfs_unlock(fs); +        __GLFS_EXIT_FS; + +invalid_fs:          return res;  } @@ -1173,9 +1226,10 @@ int  pub_glfs_ipc (struct glfs *fs, int opcode)  {  	xlator_t        *subvol = NULL; -        int             ret; +        int             ret = -1; -	__glfs_entry_fs (fs); +	DECLARE_OLD_THIS; +        __GLFS_ENTRY_VALIDATE_FS (fs, invalid_fs);  	subvol = glfs_active_subvol (fs);  	if (!subvol) { @@ -1189,6 +1243,9 @@ pub_glfs_ipc (struct glfs *fs, int opcode)  out:          glfs_subvol_done (fs, subvol); +        __GLFS_EXIT_FS; + +invalid_fs:          return ret;  }  | 
