diff options
Diffstat (limited to 'api/src/glfs.c')
| -rw-r--r-- | api/src/glfs.c | 347 |
1 files changed, 217 insertions, 130 deletions
diff --git a/api/src/glfs.c b/api/src/glfs.c index 2365fac13f9..b4bf1423f6d 100644 --- a/api/src/glfs.c +++ b/api/src/glfs.c @@ -34,17 +34,18 @@ #include <sys/prctl.h> #endif -#include "glusterfs.h" -#include "logging.h" -#include "stack.h" -#include "gf-event.h" +#include <glusterfs/glusterfs.h> +#include <glusterfs/logging.h> +#include <glusterfs/stack.h> +#include <glusterfs/gf-event.h> #include "glfs-mem-types.h" -#include "common-utils.h" -#include "syncop.h" -#include "call-stub.h" -#include "hashfn.h" +#include <glusterfs/common-utils.h> +#include <glusterfs/syncop.h> +#include <glusterfs/call-stub.h> +#include <glusterfs/hashfn.h> #include "rpc-clnt.h" -#include "statedump.h" +#include <glusterfs/statedump.h> +#include <glusterfs/syscall.h> #include "gfapi-messages.h" #include "glfs.h" @@ -68,8 +69,8 @@ glusterfs_ctx_defaults_init(glusterfs_ctx_t *ctx) ret = xlator_mem_acct_init(THIS, glfs_mt_end + 1); if (ret != 0) { - gf_msg(THIS->name, GF_LOG_ERROR, ENOMEM, API_MSG_MEM_ACCT_INIT_FAILED, - "Memory accounting init failed"); + gf_smsg(THIS->name, GF_LOG_ERROR, ENOMEM, API_MSG_MEM_ACCT_INIT_FAILED, + NULL); return ret; } @@ -91,8 +92,8 @@ glusterfs_ctx_defaults_init(glusterfs_ctx_t *ctx) goto err; } - ctx->event_pool = event_pool_new(DEFAULT_EVENT_POOL_SIZE, - STARTING_EVENT_THREADS); + ctx->event_pool = gf_event_pool_new(DEFAULT_EVENT_POOL_SIZE, + STARTING_EVENT_THREADS); if (!ctx->event_pool) { goto err; } @@ -188,23 +189,21 @@ create_master(struct glfs *fs) goto err; if (xlator_set_type(master, "mount/api") == -1) { - gf_msg("glfs", GF_LOG_ERROR, 0, API_MSG_MASTER_XLATOR_INIT_FAILED, - "master xlator " - "for %s initialization failed", - fs->volname); + gf_smsg("glfs", GF_LOG_ERROR, 0, API_MSG_MASTER_XLATOR_INIT_FAILED, + "name=%s", fs->volname, NULL); goto err; } master->ctx = fs->ctx; master->private = fs; - master->options = get_new_dict(); + master->options = dict_new(); if (!master->options) goto err; ret = xlator_init(master); if (ret) { - gf_msg("glfs", GF_LOG_ERROR, 0, API_MSG_GFAPI_XLATOR_INIT_FAILED, - "failed to initialize gfapi translator"); + gf_smsg("glfs", GF_LOG_ERROR, 0, API_MSG_GFAPI_XLATOR_INIT_FAILED, + NULL); goto err; } @@ -230,9 +229,8 @@ get_volfp(struct glfs *fs) cmd_args = &fs->ctx->cmd_args; if ((specfp = fopen(cmd_args->volfile, "r")) == NULL) { - gf_msg("glfs", GF_LOG_ERROR, errno, API_MSG_VOLFILE_OPEN_FAILED, - "volume file %s open failed: %s", cmd_args->volfile, - strerror(errno)); + gf_smsg("glfs", GF_LOG_ERROR, errno, API_MSG_VOLFILE_OPEN_FAILED, + "file=%s", cmd_args->volfile, "err=%s", strerror(errno), NULL); return NULL; } @@ -253,6 +251,11 @@ glfs_volumes_init(struct glfs *fs) if (!vol_assigned(cmd_args)) return -1; + if (sys_access(SECURE_ACCESS_FILE, F_OK) == 0) { + fs->ctx->secure_mgmt = 1; + fs->ctx->ssl_cert_depth = glusterfs_read_secure_access_file(); + } + if (cmd_args->volfile_server) { ret = glfs_mgmt_init(fs); goto out; @@ -261,8 +264,8 @@ glfs_volumes_init(struct glfs *fs) fp = get_volfp(fs); if (!fp) { - gf_msg("glfs", GF_LOG_ERROR, ENOENT, API_MSG_VOL_SPEC_FILE_ERROR, - "Cannot reach volume specification file"); + gf_smsg("glfs", GF_LOG_ERROR, ENOENT, API_MSG_VOL_SPEC_FILE_ERROR, + NULL); ret = -1; goto out; } @@ -277,6 +280,7 @@ out: /////////////////////////////////////////////////////////////////////////////// +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_xlator_option, 3.4.0) int pub_glfs_set_xlator_option(struct glfs *fs, const char *xlator, const char *key, const char *value) @@ -326,8 +330,7 @@ invalid_fs: return -1; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_xlator_option, 3.4.0); - +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_unset_volfile_server, 3.5.1) int pub_glfs_unset_volfile_server(struct glfs *fs, const char *transport, const char *host, const int port) @@ -368,6 +371,8 @@ pub_glfs_unset_volfile_server(struct glfs *fs, const char *transport, list_for_each_entry_safe(server, tmp, &cmd_args->curr_server->list, list) { + if (!server->volfile_server || !server->transport) + continue; if ((!strcmp(server->volfile_server, host) && !strcmp(server->transport, transport_val) && (server->port == port_val))) { @@ -385,8 +390,7 @@ invalid_fs: return ret; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_unset_volfile_server, 3.5.1); - +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_volfile_server, 3.4.0) int pub_glfs_set_volfile_server(struct glfs *fs, const char *transport, const char *host, int port) @@ -419,14 +423,11 @@ pub_glfs_set_volfile_server(struct glfs *fs, const char *transport, server_transport = gf_strdup(transport); } else if (!strcmp(transport, "rdma")) { server_transport = gf_strdup(GF_DEFAULT_VOLFILE_TRANSPORT); - gf_msg("glfs", GF_LOG_WARNING, EINVAL, API_MSG_INVALID_ENTRY, - "transport RDMA is deprecated, " - "falling back to tcp"); + gf_smsg("glfs", GF_LOG_WARNING, EINVAL, API_MSG_TRANS_RDMA_DEP, + NULL); } else { - gf_msg("glfs", GF_LOG_TRACE, EINVAL, API_MSG_INVALID_ENTRY, - "transport %s is not supported, " - "possible values tcp|unix", - transport); + gf_smsg("glfs", GF_LOG_TRACE, EINVAL, API_MSG_TRANS_NOT_SUPPORTED, + "transport=%s", transport, NULL); goto out; } } else { @@ -468,8 +469,6 @@ invalid_fs: return ret; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_volfile_server, 3.4.0); - /* * * Used to free the arguments allocated by glfs_set_volfile_server() */ @@ -512,6 +511,7 @@ glfs_free_xlator_options(cmd_args_t *cmd_args) } } +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setfsuid, 3.4.2) int pub_glfs_setfsuid(uid_t fsuid) { @@ -521,8 +521,7 @@ pub_glfs_setfsuid(uid_t fsuid) return syncopctx_setfsuid(&fsuid); } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setfsuid, 3.4.2); - +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setfsgid, 3.4.2) int pub_glfs_setfsgid(gid_t fsgid) { @@ -532,8 +531,7 @@ pub_glfs_setfsgid(gid_t fsgid) return syncopctx_setfsgid(&fsgid); } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setfsgid, 3.4.2); - +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setfsgroups, 3.4.2) int pub_glfs_setfsgroups(size_t size, const gid_t *list) { @@ -543,8 +541,7 @@ pub_glfs_setfsgroups(size_t size, const gid_t *list) return syncopctx_setfsgroups(size, list); } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setfsgroups, 3.4.2); - +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setfsleaseid, 4.0.0) int pub_glfs_setfsleaseid(glfs_leaseid_t leaseid) { @@ -566,8 +563,6 @@ pub_glfs_setfsleaseid(glfs_leaseid_t leaseid) return ret; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_setfsleaseid, 4.0.0); - int get_fop_attr_glfd(dict_t **fop_attr, struct glfs_fd *glfd) { @@ -583,7 +578,7 @@ get_fop_attr_glfd(dict_t **fop_attr, struct glfs_fd *glfd) dict_create = _gf_true; } GF_CHECK_ALLOC_AND_LOG("gfapi", *fop_attr, ret, "dict_new failed", out); - ret = dict_set_static_bin(*fop_attr, "lease-id", leaseid, LEASE_ID_SIZE); + ret = dict_set_bin(*fop_attr, "lease-id", leaseid, LEASE_ID_SIZE); out: if (ret) { GF_FREE(leaseid); @@ -613,26 +608,32 @@ set_fop_attr_glfd(struct glfs_fd *glfd) int get_fop_attr_thrd_key(dict_t **fop_attr) { - char *lease_id = NULL; + char *existing_leaseid = NULL, *leaseid = NULL; int ret = 0; gf_boolean_t dict_create = _gf_false; - lease_id = gf_existing_leaseid(); - if (lease_id) { + existing_leaseid = gf_existing_leaseid(); + if (existing_leaseid) { + leaseid = GF_MALLOC(LEASE_ID_SIZE, gf_common_mt_char); + GF_CHECK_ALLOC_AND_LOG("gfapi", leaseid, ret, "lease id alloc failed", + out); + memcpy(leaseid, existing_leaseid, LEASE_ID_SIZE); if (*fop_attr == NULL) { *fop_attr = dict_new(); dict_create = _gf_true; } GF_CHECK_ALLOC_AND_LOG("gfapi", *fop_attr, ret, "dict_new failed", out); - ret = dict_set_bin(*fop_attr, "lease-id", gf_strdup(lease_id), - LEASE_ID_SIZE); + ret = dict_set_bin(*fop_attr, "lease-id", leaseid, LEASE_ID_SIZE); } out: - if (ret && dict_create) { - if (*fop_attr) - dict_unref(*fop_attr); - *fop_attr = NULL; + if (ret) { + GF_FREE(leaseid); + if (dict_create) { + if (*fop_attr) + dict_unref(*fop_attr); + *fop_attr = NULL; + } } return ret; } @@ -649,14 +650,19 @@ unset_fop_attr(dict_t **fop_attr) *fop_attr = NULL; } } + +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_from_glfd, 3.4.0) struct glfs * pub_glfs_from_glfd(struct glfs_fd *glfd) { + if (glfd == NULL) { + errno = EBADF; + return NULL; + } + return glfd->fs; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_from_glfd, 3.4.0); - static void glfs_fd_destroy(struct glfs_fd *glfd) { @@ -718,7 +724,7 @@ glfs_poller(void *data) fs = data; - event_dispatch(fs->ctx->event_pool); + gf_event_dispatch(fs->ctx->event_pool); return NULL; } @@ -734,6 +740,7 @@ glfs_new_fs(const char *volname) INIT_LIST_HEAD(&fs->openfds); INIT_LIST_HEAD(&fs->upcall_list); + INIT_LIST_HEAD(&fs->waitq); PTHREAD_MUTEX_INIT(&fs->mutex, NULL, fs->pthread_flags, GLFS_INIT_MUTEX, err); @@ -804,27 +811,45 @@ unlock: return ret; } +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_new, 3.4.0) struct glfs * pub_glfs_new(const char *volname) { + if (!volname) { + errno = EINVAL; + return NULL; + } + struct glfs *fs = NULL; + int i = 0; int ret = -1; glusterfs_ctx_t *ctx = NULL; xlator_t *old_THIS = NULL; char pname[16] = ""; char msg[32] = ""; - if (!volname) { + if (volname[0] == '/' || volname[0] == '-') { + if (strncmp(volname, "/snaps/", 7) == 0) { + goto label; + } errno = EINVAL; return NULL; } + for (i = 0; i < strlen(volname); i++) { + if (!isalnum(volname[i]) && (volname[i] != '_') && + (volname[i] != '-')) { + errno = EINVAL; + return NULL; + } + } + +label: /* * Do this as soon as possible in case something else depends on * pool allocations. */ - mem_pools_init_early(); - mem_pools_init_late(); + mem_pools_init(); fs = glfs_new_fs(volname); if (!fs) @@ -893,8 +918,7 @@ out: return fs; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_new, 3.4.0); - +GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_new_from_ctx, 3.7.0) struct glfs * priv_glfs_new_from_ctx(glusterfs_ctx_t *ctx) { @@ -913,8 +937,7 @@ out: return fs; } -GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_new_from_ctx, 3.7.0); - +GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_free_from_ctx, 3.7.0) void priv_glfs_free_from_ctx(struct glfs *fs) { @@ -950,8 +973,7 @@ priv_glfs_free_from_ctx(struct glfs *fs) FREE(fs); } -GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_free_from_ctx, 3.7.0); - +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_volfile, 3.4.0) int pub_glfs_set_volfile(struct glfs *fs, const char *volfile) { @@ -968,8 +990,7 @@ pub_glfs_set_volfile(struct glfs *fs, const char *volfile) return 0; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_volfile, 3.4.0); - +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_logging, 3.4.0) int pub_glfs_set_logging(struct glfs *fs, const char *logfile, int loglevel) { @@ -1007,8 +1028,6 @@ invalid_fs: return ret; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_logging, 3.4.0); - int glfs_init_wait(struct glfs *fs) { @@ -1027,14 +1046,14 @@ glfs_init_wait(struct glfs *fs) return ret; } +GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_init_done, 3.4.0) void priv_glfs_init_done(struct glfs *fs, int ret) { glfs_init_cbk init_cbk; if (!fs) { - gf_msg("glfs", GF_LOG_ERROR, EINVAL, API_MSG_GLFS_FSOBJ_NULL, - "fs is NULL"); + gf_smsg("glfs", GF_LOG_ERROR, EINVAL, API_MSG_GLFS_FSOBJ_NULL, NULL); goto out; } @@ -1058,8 +1077,6 @@ out: return; } -GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_init_done, 3.4.0); - int glfs_init_common(struct glfs *fs) { @@ -1087,8 +1104,7 @@ glfs_init_async(struct glfs *fs, glfs_init_cbk cbk) int ret = -1; if (!fs || !fs->ctx) { - gf_msg("glfs", GF_LOG_ERROR, EINVAL, API_MSG_INVALID_ENTRY, - "fs is not properly initialized."); + gf_smsg("glfs", GF_LOG_ERROR, EINVAL, API_MSG_FS_NOT_INIT, NULL); errno = EINVAL; return ret; } @@ -1100,6 +1116,7 @@ glfs_init_async(struct glfs *fs, glfs_init_cbk cbk) return ret; } +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_init, 3.4.0) int pub_glfs_init(struct glfs *fs) { @@ -1108,8 +1125,7 @@ pub_glfs_init(struct glfs *fs) DECLARE_OLD_THIS; if (!fs || !fs->ctx) { - gf_msg("glfs", GF_LOG_ERROR, EINVAL, API_MSG_INVALID_ENTRY, - "fs is not properly initialized."); + gf_smsg("glfs", GF_LOG_ERROR, EINVAL, API_MSG_FS_NOT_INIT, NULL); errno = EINVAL; return ret; } @@ -1133,8 +1149,6 @@ invalid_fs: return ret; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_init, 3.4.0); - static int glusterfs_ctx_destroy(glusterfs_ctx_t *ctx) { @@ -1183,7 +1197,7 @@ glusterfs_ctx_destroy(glusterfs_ctx_t *ctx) } /* Free the event pool */ - ret = event_pool_destroy(ctx->event_pool); + ret = gf_event_pool_destroy(ctx->event_pool); /* Free the iobuf pool */ iobuf_pool_destroy(ctx->iobuf_pool); @@ -1206,11 +1220,13 @@ glusterfs_ctx_destroy(glusterfs_ctx_t *ctx) glusterfs_graph_destroy_residual(trav_graph); } + GF_FREE(ctx->statedump_path); FREE(ctx); return ret; } +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fini, 3.4.0) int pub_glfs_fini(struct glfs *fs) { @@ -1222,6 +1238,7 @@ pub_glfs_fini(struct glfs *fs) call_pool_t *call_pool = NULL; int fs_init = 0; int err = -1; + struct synctask *waittask = NULL; DECLARE_OLD_THIS; @@ -1243,6 +1260,13 @@ pub_glfs_fini(struct glfs *fs) call_pool = fs->ctx->pool; + /* Wake up any suspended synctasks */ + while (!list_empty(&fs->waitq)) { + waittask = list_entry(fs->waitq.next, struct synctask, waitq); + list_del_init(&waittask->waitq); + synctask_wake(waittask); + } + while (countdown--) { /* give some time for background frames to finish */ pthread_mutex_lock(&fs->mutex); @@ -1261,7 +1285,7 @@ pub_glfs_fini(struct glfs *fs) } } pthread_mutex_unlock(&fs->mutex); - usleep(100000); + gf_nanosleep(100000 * GF_US_IN_NS); } /* leaked frames may exist, we ignore */ @@ -1294,10 +1318,8 @@ pub_glfs_fini(struct glfs *fs) graph = subvol->graph; err = pthread_mutex_lock(&fs->mutex); if (err != 0) { - gf_msg("glfs", GF_LOG_ERROR, err, API_MSG_FSMUTEX_LOCK_FAILED, - "pthread lock on glfs mutex, " - "returned error: (%s)", - strerror(err)); + gf_smsg("glfs", GF_LOG_ERROR, err, API_MSG_FSMUTEX_LOCK_FAILED, + "error=%s", strerror(err), NULL); goto fail; } /* check and wait for CHILD_DOWN for active subvol*/ @@ -1305,19 +1327,17 @@ pub_glfs_fini(struct glfs *fs) while (graph->used) { err = pthread_cond_wait(&fs->child_down_cond, &fs->mutex); if (err != 0) - gf_msg("glfs", GF_LOG_INFO, err, - API_MSG_COND_WAIT_FAILED, - "%s cond wait failed %s", subvol->name, - strerror(err)); + gf_smsg("glfs", GF_LOG_INFO, err, + API_MSG_COND_WAIT_FAILED, "name=%s", + subvol->name, "err=%s", strerror(err), NULL); } } err = pthread_mutex_unlock(&fs->mutex); if (err != 0) { - gf_msg("glfs", GF_LOG_ERROR, err, API_MSG_FSMUTEX_UNLOCK_FAILED, - "pthread unlock on glfs mutex, " - "returned error: (%s)", - strerror(err)); + gf_smsg("glfs", GF_LOG_ERROR, err, + API_MSG_FSMUTEX_UNLOCK_FAILED, "error=%s", + strerror(err), NULL); goto fail; } } @@ -1352,7 +1372,7 @@ pub_glfs_fini(struct glfs *fs) syncenv_destroy(ctx->env); /* Join the poller thread */ - if (event_dispatch_destroy(ctx->event_pool) < 0) + if (gf_event_dispatch_destroy(ctx->event_pool) < 0) ret = -1; } @@ -1397,8 +1417,7 @@ invalid_fs: return ret; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fini, 3.4.0); - +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_get_volfile, 3.6.0) ssize_t pub_glfs_get_volfile(struct glfs *fs, void *buf, size_t len) { @@ -1424,8 +1443,7 @@ invalid_fs: return res; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_get_volfile, 3.6.0); - +GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_ipc, 3.12.0) int priv_glfs_ipc(struct glfs *fs, int opcode, void *xd_in, void **xd_out) { @@ -1453,107 +1471,118 @@ invalid_fs: return ret; } -GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_ipc, 3.12.0); +GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_setfspid, 6.1) +int +priv_glfs_setfspid(struct glfs *fs, pid_t pid) +{ + cmd_args_t *cmd_args = NULL; + int ret = 0; + + cmd_args = &fs->ctx->cmd_args; + cmd_args->client_pid = pid; + cmd_args->client_pid_set = 1; + ret = syncopctx_setfspid(&pid); + return ret; +} + +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_free, 3.7.16) void pub_glfs_free(void *ptr) { GLFS_FREE(ptr); } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_free, 3.7.16); - +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_get_fs, 3.7.16) struct glfs * pub_glfs_upcall_get_fs(struct glfs_upcall *arg) { return arg->fs; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_get_fs, 3.7.16); +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_get_reason, 3.7.16) enum glfs_upcall_reason pub_glfs_upcall_get_reason(struct glfs_upcall *arg) { return arg->reason; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_get_reason, 3.7.16); +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_get_event, 3.7.16) void * pub_glfs_upcall_get_event(struct glfs_upcall *arg) { return arg->event; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_get_event, 3.7.16); +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_object, 3.7.16) struct glfs_object * pub_glfs_upcall_inode_get_object(struct glfs_upcall_inode *arg) { return arg->object; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_object, 3.7.16); +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_flags, 3.7.16) uint64_t pub_glfs_upcall_inode_get_flags(struct glfs_upcall_inode *arg) { return arg->flags; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_flags, 3.7.16); +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_stat, 3.7.16) struct stat * pub_glfs_upcall_inode_get_stat(struct glfs_upcall_inode *arg) { return &arg->buf; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_stat, 3.7.16); +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_expire, 3.7.16) uint64_t pub_glfs_upcall_inode_get_expire(struct glfs_upcall_inode *arg) { return arg->expire_time_attr; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_expire, 3.7.16); +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_pobject, 3.7.16) struct glfs_object * pub_glfs_upcall_inode_get_pobject(struct glfs_upcall_inode *arg) { return arg->p_object; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_pobject, 3.7.16); +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_pstat, 3.7.16) struct stat * pub_glfs_upcall_inode_get_pstat(struct glfs_upcall_inode *arg) { return &arg->p_buf; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_pstat, 3.7.16); +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_oldpobject, 3.7.16) struct glfs_object * pub_glfs_upcall_inode_get_oldpobject(struct glfs_upcall_inode *arg) { return arg->oldp_object; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_oldpobject, 3.7.16); +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_oldpstat, 3.7.16) struct stat * pub_glfs_upcall_inode_get_oldpstat(struct glfs_upcall_inode *arg) { return &arg->oldp_buf; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_inode_get_oldpstat, 3.7.16); +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_lease_get_object, 4.1.6) struct glfs_object * pub_glfs_upcall_lease_get_object(struct glfs_upcall_lease *arg) { - return arg->object; + return arg->object; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_lease_get_object, 4.1.6); - +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_lease_get_lease_type, 4.1.6) uint32_t pub_glfs_upcall_lease_get_lease_type(struct glfs_upcall_lease *arg) { return arg->lease_type; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_lease_get_lease_type, 4.1.6); /* definitions of the GLFS_SYSRQ_* chars are in glfs.h */ static struct glfs_sysrq_help { @@ -1563,6 +1592,7 @@ static struct glfs_sysrq_help { {GLFS_SYSRQ_STATEDUMP, "(S)tatedump"}, {0, NULL}}; +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_sysrq, 3.10.0) int pub_glfs_sysrq(struct glfs *fs, char sysrq) { @@ -1602,8 +1632,8 @@ pub_glfs_sysrq(struct glfs *fs, char sysrq) gf_proc_dump_info(SIGUSR1, ctx); break; default: - gf_msg("glfs", GF_LOG_ERROR, ENOTSUP, API_MSG_INVALID_ENTRY, - "'%c' is not a valid sysrq", sysrq); + gf_smsg("glfs", GF_LOG_ERROR, ENOTSUP, API_MSG_INVALID_SYSRQ, + "sysrq=%c", sysrq, NULL); errno = ENOTSUP; ret = -1; } @@ -1611,8 +1641,7 @@ out: return ret; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_sysrq, 3.10.0); - +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_register, 3.13.0) int pub_glfs_upcall_register(struct glfs *fs, uint32_t event_list, glfs_upcall_cbk cbk, void *data) @@ -1634,8 +1663,8 @@ pub_glfs_upcall_register(struct glfs *fs, uint32_t event_list, if ((event_list != GLFS_EVENT_ANY) && (event_list & ~up_events)) { errno = EINVAL; ret = -1; - gf_msg(THIS->name, GF_LOG_ERROR, errno, LG_MSG_INVALID_ARG, - "invalid event_list (0x%08x)", event_list); + gf_smsg(THIS->name, GF_LOG_ERROR, errno, API_MSG_INVALID_ARG, + "event_list=(0x%08x)", event_list, NULL); goto out; } @@ -1668,8 +1697,7 @@ invalid_fs: return ret; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_register, 3.13.0); - +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_unregister, 3.13.0) int pub_glfs_upcall_unregister(struct glfs *fs, uint32_t event_list) { @@ -1687,8 +1715,8 @@ pub_glfs_upcall_unregister(struct glfs *fs, uint32_t event_list) if ((event_list != GLFS_EVENT_ANY) && (event_list & ~up_events)) { errno = EINVAL; ret = -1; - gf_msg(THIS->name, GF_LOG_ERROR, errno, LG_MSG_INVALID_ARG, - "invalid event_list (0x%08x)", event_list); + gf_smsg(THIS->name, GF_LOG_ERROR, errno, API_MSG_INVALID_ARG, + "event_list=(0x%08x)", event_list, NULL); goto out; } @@ -1716,4 +1744,63 @@ invalid_fs: return ret; } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_upcall_unregister, 3.13.0); +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_set_statedump_path, 7.0) +int +pub_glfs_set_statedump_path(struct glfs *fs, const char *path) +{ + struct stat st; + int ret; + DECLARE_OLD_THIS; + __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs); + + if (!path) { + gf_log("glfs", GF_LOG_ERROR, "path is NULL"); + errno = EINVAL; + goto err; + } + + /* If path is not present OR, if it is directory AND has enough permission + * to create files, then proceed */ + ret = sys_stat(path, &st); + if (ret && errno != ENOENT) { + gf_log("glfs", GF_LOG_ERROR, "%s: not a valid path (%s)", path, + strerror(errno)); + errno = EINVAL; + goto err; + } + + if (!ret) { + /* file is present, now check other things */ + if (!S_ISDIR(st.st_mode)) { + gf_log("glfs", GF_LOG_ERROR, "%s: path is not directory", path); + errno = EINVAL; + goto err; + } + if (sys_access(path, W_OK | X_OK) < 0) { + gf_log("glfs", GF_LOG_ERROR, + "%s: path doesn't have write permission", path); + errno = EPERM; + goto err; + } + } + + /* If set, it needs to be freed, so we don't have leak */ + GF_FREE(fs->ctx->statedump_path); + + fs->ctx->statedump_path = gf_strdup(path); + if (!fs->ctx->statedump_path) { + gf_log("glfs", GF_LOG_ERROR, + "%s: failed to set statedump path, no memory", path); + errno = ENOMEM; + goto err; + } + + __GLFS_EXIT_FS; + + return 0; +err: + __GLFS_EXIT_FS; + +invalid_fs: + return -1; +} |
