diff options
Diffstat (limited to 'xlators')
33 files changed, 4 insertions, 13759 deletions
diff --git a/xlators/cluster/afr/src/Makefile.am b/xlators/cluster/afr/src/Makefile.am index 7317846cbb1..610819b28fc 100644 --- a/xlators/cluster/afr/src/Makefile.am +++ b/xlators/cluster/afr/src/Makefile.am @@ -1,4 +1,4 @@ -xlator_LTLIBRARIES = afr.la pump.la +xlator_LTLIBRARIES = afr.la xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/cluster afr_common_source = afr-dir-read.c afr-dir-write.c afr-inode-read.c \ @@ -14,13 +14,9 @@ afr_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS) afr_la_SOURCES = $(afr_common_source) $(AFR_SELFHEAL_SOURCES) afr.c afr_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la -pump_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS) -pump_la_SOURCES = $(afr_common_source) $(AFR_SELFHEAL_SOURCES) pump.c -pump_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la - noinst_HEADERS = afr.h afr-transaction.h afr-inode-write.h afr-inode-read.h \ afr-dir-read.h afr-dir-write.h afr-self-heal.h afr-mem-types.h \ - afr-common.c afr-self-heald.h pump.h \ + afr-common.c afr-self-heald.h \ $(top_builddir)/xlators/lib/src/libxlator.h afr-messages.h AM_CPPFLAGS = $(GF_CPPFLAGS) \ diff --git a/xlators/cluster/afr/src/pump.c b/xlators/cluster/afr/src/pump.c deleted file mode 100644 index d322a9d67b5..00000000000 --- a/xlators/cluster/afr/src/pump.c +++ /dev/null @@ -1,2472 +0,0 @@ -/* - Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ - -#include <unistd.h> -#include <sys/time.h> -#include <stdlib.h> -#include <fnmatch.h> - -#include "afr-common.c" -#include "defaults.h" -#include "glusterfs.h" -#include "pump.h" -#include "afr-messages.h" - - -static int -afr_set_dict_gfid (dict_t *dict, uuid_t gfid) -{ - int ret = 0; - uuid_t *pgfid = NULL; - - GF_ASSERT (gfid); - - pgfid = GF_CALLOC (1, sizeof (uuid_t), gf_common_mt_char); - if (!pgfid) { - ret = -1; - goto out; - } - - gf_uuid_copy (*pgfid, gfid); - - ret = dict_set_dynptr (dict, "gfid-req", pgfid, sizeof (uuid_t)); - if (ret) - gf_msg (THIS->name, GF_LOG_ERROR, -ret, - AFR_MSG_DICT_SET_FAILED, "gfid set failed"); - -out: - if (ret && pgfid) - GF_FREE (pgfid); - return ret; -} - -static int -afr_set_root_gfid (dict_t *dict) -{ - uuid_t gfid; - int ret = 0; - - memset (gfid, 0, 16); - gfid[15] = 1; - - ret = afr_set_dict_gfid (dict, gfid); - - return ret; -} - -static int -afr_build_child_loc (xlator_t *this, loc_t *child, loc_t *parent, char *name) -{ - int ret = -1; - uuid_t pargfid = {0}; - - if (!child) - goto out; - - if (!gf_uuid_is_null (parent->inode->gfid)) - gf_uuid_copy (pargfid, parent->inode->gfid); - else if (!gf_uuid_is_null (parent->gfid)) - gf_uuid_copy (pargfid, parent->gfid); - - if (gf_uuid_is_null (pargfid)) - goto out; - - if (strcmp (parent->path, "/") == 0) - ret = gf_asprintf ((char **)&child->path, "/%s", name); - else - ret = gf_asprintf ((char **)&child->path, "%s/%s", parent->path, - name); - - if (-1 == ret) { - } - - child->name = strrchr (child->path, '/'); - if (child->name) - child->name++; - - child->parent = inode_ref (parent->inode); - child->inode = inode_new (parent->inode->table); - gf_uuid_copy (child->pargfid, pargfid); - - if (!child->inode) { - ret = -1; - goto out; - } - - ret = 0; -out: - if ((ret == -1) && child) - loc_wipe (child); - - return ret; -} - -static void -afr_build_root_loc (xlator_t *this, loc_t *loc) -{ - afr_private_t *priv = NULL; - - priv = this->private; - loc->path = gf_strdup ("/"); - loc->name = ""; - loc->inode = inode_ref (priv->root_inode); - gf_uuid_copy (loc->gfid, loc->inode->gfid); -} - -static void -afr_update_loc_gfids (loc_t *loc, struct iatt *buf, struct iatt *postparent) -{ - GF_ASSERT (loc); - GF_ASSERT (buf); - - gf_uuid_copy (loc->gfid, buf->ia_gfid); - if (postparent) - gf_uuid_copy (loc->pargfid, postparent->ia_gfid); -} - -static uint64_t pump_pid = 0; -static void -pump_fill_loc_info (loc_t *loc, struct iatt *iatt, struct iatt *parent) -{ - afr_update_loc_gfids (loc, iatt, parent); - gf_uuid_copy (loc->inode->gfid, iatt->ia_gfid); -} - -static int -pump_mark_start_pending (xlator_t *this) -{ - afr_private_t *priv = NULL; - pump_private_t *pump_priv = NULL; - - priv = this->private; - pump_priv = priv->pump_private; - - pump_priv->pump_start_pending = 1; - - return 0; -} - -static int -is_pump_start_pending (xlator_t *this) -{ - afr_private_t *priv = NULL; - pump_private_t *pump_priv = NULL; - - priv = this->private; - pump_priv = priv->pump_private; - - return (pump_priv->pump_start_pending); -} - -static int -pump_remove_start_pending (xlator_t *this) -{ - afr_private_t *priv = NULL; - pump_private_t *pump_priv = NULL; - - priv = this->private; - pump_priv = priv->pump_private; - - pump_priv->pump_start_pending = 0; - - return 0; -} - -static pump_state_t -pump_get_state () -{ - xlator_t *this = NULL; - afr_private_t *priv = NULL; - pump_private_t *pump_priv = NULL; - - pump_state_t ret; - - this = THIS; - priv = this->private; - pump_priv = priv->pump_private; - - LOCK (&pump_priv->pump_state_lock); - { - ret = pump_priv->pump_state; - } - UNLOCK (&pump_priv->pump_state_lock); - - return ret; -} - -int -pump_change_state (xlator_t *this, pump_state_t state) -{ - afr_private_t *priv = NULL; - pump_private_t *pump_priv = NULL; - - pump_state_t state_old; - pump_state_t state_new; - - - priv = this->private; - pump_priv = priv->pump_private; - - GF_ASSERT (pump_priv); - - LOCK (&pump_priv->pump_state_lock); - { - state_old = pump_priv->pump_state; - state_new = state; - - pump_priv->pump_state = state; - - } - UNLOCK (&pump_priv->pump_state_lock); - - gf_msg_debug (this->name, 0, - "Pump changing state from %d to %d", - state_old, state_new); - - return 0; -} - -static int -pump_set_resume_path (xlator_t *this, const char *path) -{ - int ret = 0; - - afr_private_t *priv = NULL; - pump_private_t *pump_priv = NULL; - - priv = this->private; - pump_priv = priv->pump_private; - - GF_ASSERT (pump_priv); - - LOCK (&pump_priv->resume_path_lock); - { - strncpy (pump_priv->resume_path, path, strlen (path) + 1); - } - UNLOCK (&pump_priv->resume_path_lock); - - return ret; -} - -static int -pump_save_path (xlator_t *this, const char *path) -{ - afr_private_t *priv = NULL; - pump_state_t state; - dict_t *dict = NULL; - loc_t loc = {0}; - int dict_ret = 0; - int ret = -1; - - state = pump_get_state (); - if (state == PUMP_STATE_RESUME) - return 0; - - priv = this->private; - - GF_ASSERT (priv->root_inode); - - afr_build_root_loc (this, &loc); - - dict = dict_new (); - dict_ret = dict_set_str (dict, PUMP_PATH, (char *)path); - if (dict_ret) - gf_msg (this->name, GF_LOG_WARNING, - -dict_ret, AFR_MSG_DICT_SET_FAILED, - "%s: failed to set the key %s", path, PUMP_PATH); - - ret = syncop_setxattr (PUMP_SOURCE_CHILD (this), &loc, dict, 0, NULL, - NULL); - - if (ret < 0) { - gf_msg (this->name, GF_LOG_INFO, -ret, AFR_MSG_INFO_COMMON, - "setxattr failed - could not save path=%s", path); - } else { - gf_msg_debug (this->name, 0, - "setxattr succeeded - saved path=%s", path); - } - - dict_unref (dict); - - loc_wipe (&loc); - return 0; -} - -static int -pump_check_and_update_status (xlator_t *this) -{ - pump_state_t state; - int ret = -1; - - state = pump_get_state (); - - switch (state) { - - case PUMP_STATE_RESUME: - case PUMP_STATE_RUNNING: - { - ret = 0; - break; - } - case PUMP_STATE_PAUSE: - { - ret = -1; - break; - } - case PUMP_STATE_ABORT: - { - pump_save_path (this, "/"); - ret = -1; - break; - } - default: - { - gf_msg_debug (this->name, 0, - "Unknown pump state"); - ret = -1; - break; - } - - } - - return ret; -} - -static const char * -pump_get_resume_path (xlator_t *this) -{ - afr_private_t *priv = NULL; - pump_private_t *pump_priv = NULL; - - const char *resume_path = NULL; - - priv = this->private; - pump_priv = priv->pump_private; - - resume_path = pump_priv->resume_path; - - return resume_path; -} - -static int -pump_update_resume_state (xlator_t *this, const char *path) -{ - pump_state_t state; - const char *resume_path = NULL; - - state = pump_get_state (); - - if (state == PUMP_STATE_RESUME) { - resume_path = pump_get_resume_path (this); - if (strcmp (resume_path, "/") == 0) { - gf_msg_debug (this->name, 0, - "Reached the resume path (/). Proceeding to change state" - " to running"); - - pump_change_state (this, PUMP_STATE_RUNNING); - } else if (strcmp (resume_path, path) == 0) { - gf_msg_debug (this->name, 0, - "Reached the resume path. Proceeding to change state" - " to running"); - - pump_change_state (this, PUMP_STATE_RUNNING); - } else { - gf_msg_debug (this->name, 0, - "Not yet hit the resume path:res-path=%s,path=%s", - resume_path, path); - } - } - - return 0; -} - -static gf_boolean_t -is_pump_traversal_allowed (xlator_t *this, const char *path) -{ - pump_state_t state; - const char *resume_path = NULL; - gf_boolean_t ret = _gf_true; - - state = pump_get_state (); - - if (state == PUMP_STATE_RESUME) { - resume_path = pump_get_resume_path (this); - if (strstr (resume_path, path)) { - gf_msg_debug (this->name, 0, - "On the right path to resumption path"); - ret = _gf_true; - } else { - gf_msg_debug (this->name, 0, - "Not the right path to resuming=> ignoring traverse"); - ret = _gf_false; - } - } - - return ret; -} - -static int -pump_save_file_stats (xlator_t *this, const char *path) -{ - afr_private_t *priv = NULL; - pump_private_t *pump_priv = NULL; - - priv = this->private; - pump_priv = priv->pump_private; - - LOCK (&pump_priv->resume_path_lock); - { - pump_priv->number_files_pumped++; - - strncpy (pump_priv->current_file, path, - PATH_MAX); - } - UNLOCK (&pump_priv->resume_path_lock); - - return 0; -} - -static int -gf_pump_traverse_directory (loc_t *loc) -{ - xlator_t *this = NULL; - fd_t *fd = NULL; - off_t offset = 0; - loc_t entry_loc = {0}; - gf_dirent_t *entry = NULL; - gf_dirent_t *tmp = NULL; - gf_dirent_t entries; - struct iatt iatt = {0}; - struct iatt parent = {0}; - dict_t *xattr_rsp = NULL; - int ret = 0; - gf_boolean_t is_directory_empty = _gf_true; - gf_boolean_t free_entries = _gf_false; - - INIT_LIST_HEAD (&entries.list); - this = THIS; - - GF_ASSERT (loc->inode); - - fd = fd_create (loc->inode, pump_pid); - if (!fd) { - gf_msg (this->name, GF_LOG_ERROR, 0, AFR_MSG_FD_CREATE_FAILED, - "Failed to create fd for %s", loc->path); - goto out; - } - - ret = syncop_opendir (this, loc, fd, NULL, NULL); - if (ret < 0) { - gf_msg_debug (this->name, 0, - "opendir failed on %s", loc->path); - goto out; - } - - gf_msg_trace (this->name, 0, - "pump opendir on %s returned=%d", - loc->path, ret); - - while (syncop_readdirp (this, fd, 131072, offset, &entries, NULL, - NULL)) { - free_entries = _gf_true; - - if (list_empty (&entries.list)) { - gf_msg_trace (this->name, 0, - "no more entries in directory"); - goto out; - } - - list_for_each_entry_safe (entry, tmp, &entries.list, list) { - gf_msg_debug (this->name, 0, - "found readdir entry=%s", entry->d_name); - - offset = entry->d_off; - if (gf_uuid_is_null (entry->d_stat.ia_gfid)) { - gf_msg (this->name, GF_LOG_WARNING, 0, - AFR_MSG_GFID_NULL, "%s/%s: No " - "gfid present skipping", - loc->path, entry->d_name); - continue; - } - loc_wipe (&entry_loc); - ret = afr_build_child_loc (this, &entry_loc, loc, - entry->d_name); - if (ret) - goto out; - - if ((strcmp (entry->d_name, ".") == 0) || - (strcmp (entry->d_name, "..") == 0)) - continue; - - is_directory_empty = _gf_false; - gf_msg_debug (this->name, 0, - "lookup %s => %"PRId64, - entry_loc.path, - iatt.ia_ino); - - ret = syncop_lookup (this, &entry_loc, &iatt, &parent, - NULL, &xattr_rsp); - - if (ret) { - gf_msg (this->name, GF_LOG_ERROR, - -ret, AFR_MSG_INFO_COMMON, - "%s: lookup failed", entry_loc.path); - continue; - } - - ret = afr_selfheal_name (this, loc->gfid, entry->d_name, - NULL); - if (ret) { - gf_msg (this->name, GF_LOG_ERROR, 0, - AFR_MSG_SELF_HEAL_FAILED, - "%s: name self-heal failed (%s/%s)", - entry_loc.path, uuid_utoa (loc->gfid), - entry->d_name); - continue; - } - - ret = afr_selfheal (this, iatt.ia_gfid); - if (ret < 0) { - gf_msg (this->name, GF_LOG_ERROR, 0, - AFR_MSG_SELF_HEAL_FAILED, - "%s: self-heal failed (%s)", - entry_loc.path, - uuid_utoa (iatt.ia_gfid)); - continue; - } - - pump_fill_loc_info (&entry_loc, &iatt, &parent); - - pump_update_resume_state (this, entry_loc.path); - - pump_save_path (this, entry_loc.path); - pump_save_file_stats (this, entry_loc.path); - - ret = pump_check_and_update_status (this); - if (ret < 0) { - gf_msg_debug (this->name, 0, - "Pump beginning to exit out"); - goto out; - } - - if (IA_ISDIR (iatt.ia_type)) { - if (is_pump_traversal_allowed (this, entry_loc.path)) { - gf_msg_trace (this->name, 0, - "entering dir=%s", - entry->d_name); - gf_pump_traverse_directory (&entry_loc); - } - } - } - - gf_dirent_free (&entries); - free_entries = _gf_false; - gf_msg_trace (this->name, 0, "offset incremented to %d", - (int32_t) offset); - - } - - ret = syncop_close (fd); - if (ret < 0) - gf_msg_debug (this->name, 0, "closing the fd failed"); - - if (is_directory_empty && (strcmp (loc->path, "/") == 0)) { - pump_change_state (this, PUMP_STATE_RUNNING); - gf_msg (this->name, GF_LOG_INFO, 0, AFR_MSG_INFO_COMMON, - "Empty source brick. Nothing to be done."); - } - -out: - if (entry_loc.path) - loc_wipe (&entry_loc); - if (free_entries) - gf_dirent_free (&entries); - return 0; -} - -static int -pump_update_resume_path (xlator_t *this) -{ - const char *resume_path = NULL; - - resume_path = pump_get_resume_path (this); - - if (resume_path) { - gf_msg_debug (this->name, 0, - "Found a path to resume from: %s", - resume_path); - - }else { - gf_msg_debug (this->name, 0, - "Did not find a path=> setting to '/'"); - pump_set_resume_path (this, "/"); - } - - pump_change_state (this, PUMP_STATE_RESUME); - - return 0; -} - -static int32_t -pump_xattr_cleaner (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, dict_t *xdata) -{ - afr_private_t *priv = NULL; - loc_t loc = {0}; - int i = 0; - int ret = 0; - int source = 0; - int sink = 1; - - priv = this->private; - - afr_build_root_loc (this, &loc); - - ret = syncop_removexattr (priv->children[source], &loc, - PUMP_PATH, 0, NULL); - - ret = syncop_removexattr (priv->children[sink], &loc, - PUMP_SINK_COMPLETE, 0, NULL); - - for (i = 0; i < priv->child_count; i++) { - ret = syncop_removexattr (priv->children[i], &loc, - PUMP_SOURCE_COMPLETE, 0, NULL); - if (ret) { - gf_msg_debug (this->name, 0, "removexattr " - "failed with %s", strerror (-ret)); - } - } - - loc_wipe (&loc); - return pump_command_reply (frame, this); -} - -static int -pump_complete_migration (xlator_t *this) -{ - afr_private_t *priv = NULL; - pump_private_t *pump_priv = NULL; - dict_t *dict = NULL; - pump_state_t state; - loc_t loc = {0}; - int dict_ret = 0; - int ret = -1; - - priv = this->private; - pump_priv = priv->pump_private; - - GF_ASSERT (priv->root_inode); - - afr_build_root_loc (this, &loc); - - dict = dict_new (); - - state = pump_get_state (); - if (state == PUMP_STATE_RUNNING) { - gf_msg_debug (this->name, 0, - "Pump finished pumping"); - - pump_priv->pump_finished = _gf_true; - - dict_ret = dict_set_str (dict, PUMP_SOURCE_COMPLETE, "jargon"); - if (dict_ret) - gf_msg (this->name, GF_LOG_WARNING, -dict_ret, - AFR_MSG_DICT_SET_FAILED, - "%s: failed to set the key %s", - loc.path, PUMP_SOURCE_COMPLETE); - - ret = syncop_setxattr (PUMP_SOURCE_CHILD (this), &loc, dict, 0, - NULL, NULL); - if (ret < 0) { - gf_msg_debug (this->name, 0, - "setxattr failed - while " - "notifying source complete"); - } - dict_ret = dict_set_str (dict, PUMP_SINK_COMPLETE, "jargon"); - if (dict_ret) - gf_msg (this->name, GF_LOG_WARNING, -dict_ret, - AFR_MSG_DICT_SET_FAILED, - "%s: failed to set the key %s", - loc.path, PUMP_SINK_COMPLETE); - - ret = syncop_setxattr (PUMP_SINK_CHILD (this), &loc, dict, 0, - NULL, NULL); - if (ret < 0) { - gf_msg_debug (this->name, 0, - "setxattr failed - while " - "notifying sink complete"); - } - - pump_save_path (this, "/"); - - } else if (state == PUMP_STATE_ABORT) { - gf_msg_debug (this->name, 0, "Starting cleanup " - "of pump internal xattrs"); - call_resume (pump_priv->cleaner); - } - - loc_wipe (&loc); - return 0; -} - -static int -pump_lookup_sink (loc_t *loc) -{ - xlator_t *this = NULL; - struct iatt iatt, parent; - dict_t *xattr_rsp; - dict_t *xattr_req = NULL; - int ret = 0; - - this = THIS; - - xattr_req = dict_new (); - - ret = afr_set_root_gfid (xattr_req); - if (ret) - goto out; - - ret = syncop_lookup (PUMP_SINK_CHILD (this), loc, &iatt, &parent, - xattr_req, &xattr_rsp); - - if (ret) { - gf_msg_debug (this->name, 0, - "Lookup on sink child failed"); - ret = -1; - goto out; - } - -out: - if (xattr_req) - dict_unref (xattr_req); - - return ret; -} - -static int -pump_task (void *data) -{ - xlator_t *this = NULL; - afr_private_t *priv = NULL; - - - loc_t loc = {0}; - struct iatt iatt, parent; - dict_t *xattr_rsp = NULL; - dict_t *xattr_req = NULL; - - int ret = -1; - - this = THIS; - priv = this->private; - - GF_ASSERT (priv->root_inode); - - afr_build_root_loc (this, &loc); - xattr_req = dict_new (); - if (!xattr_req) { - gf_msg_debug (this->name, ENOMEM, - "Out of memory"); - ret = -1; - goto out; - } - - afr_set_root_gfid (xattr_req); - ret = syncop_lookup (this, &loc, &iatt, &parent, - xattr_req, &xattr_rsp); - - gf_msg_trace (this->name, 0, - "lookup: path=%s gfid=%s", - loc.path, uuid_utoa (loc.inode->gfid)); - - ret = pump_check_and_update_status (this); - if (ret < 0) { - goto out; - } - - pump_update_resume_path (this); - - afr_set_root_gfid (xattr_req); - ret = pump_lookup_sink (&loc); - if (ret) { - pump_update_resume_path (this); - goto out; - } - - gf_pump_traverse_directory (&loc); - - pump_complete_migration (this); -out: - if (xattr_req) - dict_unref (xattr_req); - - loc_wipe (&loc); - return 0; -} - - -static int -pump_task_completion (int ret, call_frame_t *sync_frame, void *data) -{ - xlator_t *this = NULL; - afr_private_t *priv = NULL; - - this = THIS; - - priv = this->private; - - inode_unref (priv->root_inode); - STACK_DESTROY (sync_frame->root); - - gf_msg_debug (this->name, 0, - "Pump xlator exiting"); - return 0; -} - -int -pump_start (call_frame_t *pump_frame, xlator_t *this) -{ - afr_private_t *priv = NULL; - pump_private_t *pump_priv = NULL; - - int ret = -1; - - priv = this->private; - pump_priv = priv->pump_private; - - afr_set_lk_owner (pump_frame, this, pump_frame->root); - pump_pid = (uint64_t) (unsigned long)pump_frame->root; - - ret = synctask_new (pump_priv->env, pump_task, - pump_task_completion, - pump_frame, NULL); - if (ret == -1) { - goto out; - } - - gf_msg_debug (this->name, 0, - "setting pump as started lk_owner: %s %"PRIu64, - lkowner_utoa (&pump_frame->root->lk_owner), pump_pid); - - priv->use_afr_in_pump = 1; -out: - return ret; -} - -static int -pump_start_synctask (xlator_t *this) -{ - call_frame_t *frame = NULL; - int ret = 0; - - frame = create_frame (this, this->ctx->pool); - if (!frame) { - ret = -1; - goto out; - } - - pump_change_state (this, PUMP_STATE_RUNNING); - - ret = pump_start (frame, this); - -out: - return ret; -} - -int32_t -pump_cmd_start_setxattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, dict_t *xdata) - -{ - call_frame_t *prev = NULL; - afr_local_t *local = NULL; - int ret = 0; - - local = frame->local; - - if (op_ret < 0) { - gf_msg (this->name, GF_LOG_ERROR, 0, - AFR_MSG_INFO_COMMON, - "Could not initiate destination " - "brick connect"); - ret = op_ret; - goto out; - } - - gf_msg_debug (this->name, 0, - "Successfully initiated destination " - "brick connect"); - - pump_mark_start_pending (this); - - /* send the PARENT_UP as pump is ready now */ - prev = cookie; - if (prev && prev->this) - prev->this->notify (prev->this, GF_EVENT_PARENT_UP, this); - -out: - local->op_ret = ret; - pump_command_reply (frame, this); - - return 0; -} - -static int -pump_initiate_sink_connect (call_frame_t *frame, xlator_t *this) -{ - afr_local_t *local = NULL; - afr_private_t *priv = NULL; - dict_t *dict = NULL; - data_t *data = NULL; - char *clnt_cmd = NULL; - loc_t loc = {0}; - - int ret = 0; - - priv = this->private; - local = frame->local; - - GF_ASSERT (priv->root_inode); - - afr_build_root_loc (this, &loc); - - data = data_ref (dict_get (local->dict, RB_PUMP_CMD_START)); - if (!data) { - ret = -1; - gf_msg (this->name, GF_LOG_ERROR, ENOMEM, - AFR_MSG_DICT_GET_FAILED, - "Could not get destination brick value"); - goto out; - } - - dict = dict_new (); - if (!dict) { - ret = -1; - goto out; - } - - clnt_cmd = GF_CALLOC (1, data->len+1, gf_common_mt_char); - if (!clnt_cmd) { - ret = -1; - goto out; - } - - memcpy (clnt_cmd, data->data, data->len); - clnt_cmd[data->len] = '\0'; - gf_msg_debug (this->name, 0, "Got destination brick %s\n", - clnt_cmd); - - ret = dict_set_dynstr (dict, CLIENT_CMD_CONNECT, clnt_cmd); - if (ret < 0) { - gf_msg (this->name, GF_LOG_ERROR, -ret, - AFR_MSG_DICT_SET_FAILED, - "Could not inititiate destination brick " - "connect"); - goto out; - } - - STACK_WIND (frame, - pump_cmd_start_setxattr_cbk, - PUMP_SINK_CHILD(this), - PUMP_SINK_CHILD(this)->fops->setxattr, - &loc, - dict, - 0, NULL); - - ret = 0; - -out: - if (dict) - dict_unref (dict); - - if (data) - data_unref (data); - - if (ret && clnt_cmd) - GF_FREE (clnt_cmd); - - loc_wipe (&loc); - return ret; -} - -static int -is_pump_aborted (xlator_t *this) -{ - pump_state_t state; - - state = pump_get_state (); - - return ((state == PUMP_STATE_ABORT)); -} - -int32_t -pump_cmd_start_getxattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - dict_t *dict, dict_t *xdata) -{ - afr_local_t *local = NULL; - char *path = NULL; - - pump_state_t state; - int ret = 0; - int need_unwind = 0; - int dict_ret = -1; - - local = frame->local; - - if (op_ret < 0) { - gf_msg_debug (this->name, 0, - "getxattr failed - changing pump " - "state to RUNNING with '/'"); - path = "/"; - ret = op_ret; - } else { - gf_msg_trace (this->name, 0, - "getxattr succeeded"); - - dict_ret = dict_get_str (dict, PUMP_PATH, &path); - if (dict_ret < 0) - path = "/"; - } - - state = pump_get_state (); - if ((state == PUMP_STATE_RUNNING) || - (state == PUMP_STATE_RESUME)) { - gf_msg (this->name, GF_LOG_ERROR, - 0, AFR_MSG_PUMP_XLATOR_ERROR, - "Pump is already started"); - ret = -1; - goto out; - } - - pump_set_resume_path (this, path); - - if (is_pump_aborted (this)) - /* We're re-starting pump afresh */ - ret = pump_initiate_sink_connect (frame, this); - else { - /* We're re-starting pump from a previous - pause */ - gf_msg_debug (this->name, 0, - "about to start synctask"); - ret = pump_start_synctask (this); - need_unwind = 1; - } - -out: - if ((ret < 0) || (need_unwind == 1)) { - local->op_ret = ret; - pump_command_reply (frame, this); - } - return 0; -} - -int -pump_execute_status (call_frame_t *frame, xlator_t *this) -{ - afr_private_t *priv = NULL; - pump_private_t *pump_priv = NULL; - - uint64_t number_files = 0; - - char filename[PATH_MAX]; - char summary[PATH_MAX+256]; - char *dict_str = NULL; - - int32_t op_ret = 0; - int32_t op_errno = 0; - - dict_t *dict = NULL; - int ret = -1; - - priv = this->private; - pump_priv = priv->pump_private; - - LOCK (&pump_priv->resume_path_lock); - { - number_files = pump_priv->number_files_pumped; - strncpy (filename, pump_priv->current_file, PATH_MAX); - } - UNLOCK (&pump_priv->resume_path_lock); - - dict_str = GF_CALLOC (1, PATH_MAX + 256, gf_afr_mt_char); - if (!dict_str) { - op_ret = -1; - op_errno = ENOMEM; - goto out; - } - - if (pump_priv->pump_finished) { - snprintf (summary, PATH_MAX+256, - "no_of_files=%"PRIu64, number_files); - } else { - snprintf (summary, PATH_MAX+256, - "no_of_files=%"PRIu64":current_file=%s", - number_files, filename); - } - snprintf (dict_str, PATH_MAX+256, "status=%d:%s", - (pump_priv->pump_finished)?1:0, summary); - - dict = dict_new (); - - ret = dict_set_dynstr (dict, RB_PUMP_CMD_STATUS, dict_str); - if (ret < 0) { - gf_msg_debug (this->name, 0, - "dict_set_dynstr returned negative value"); - } else { - dict_str = NULL; - } - - op_ret = 0; - -out: - - AFR_STACK_UNWIND (getxattr, frame, op_ret, op_errno, dict, NULL); - - if (dict) - dict_unref (dict); - - GF_FREE (dict_str); - - return 0; -} - -int -pump_execute_pause (call_frame_t *frame, xlator_t *this) -{ - afr_local_t *local = NULL; - - local = frame->local; - - pump_change_state (this, PUMP_STATE_PAUSE); - - local->op_ret = 0; - pump_command_reply (frame, this); - - return 0; -} - -int -pump_execute_start (call_frame_t *frame, xlator_t *this) -{ - afr_private_t *priv = NULL; - afr_local_t *local = NULL; - - int ret = 0; - loc_t loc = {0}; - - priv = this->private; - local = frame->local; - - if (!priv->root_inode) { - gf_msg (this->name, GF_LOG_ERROR, - 0, AFR_MSG_PUMP_XLATOR_ERROR, - "Pump xlator cannot be started without an initial " - "lookup"); - ret = -1; - goto out; - } - - GF_ASSERT (priv->root_inode); - - afr_build_root_loc (this, &loc); - - STACK_WIND (frame, - pump_cmd_start_getxattr_cbk, - PUMP_SOURCE_CHILD(this), - PUMP_SOURCE_CHILD(this)->fops->getxattr, - &loc, - PUMP_PATH, NULL); - - ret = 0; - -out: - if (ret < 0) { - local->op_ret = ret; - pump_command_reply (frame, this); - } - - loc_wipe (&loc); - return 0; -} - -static int -pump_cleanup_helper (void *data) { - call_frame_t *frame = data; - - pump_xattr_cleaner (frame, 0, frame->this, 0, 0, NULL); - - return 0; -} - -static int -pump_cleanup_done (int ret, call_frame_t *sync_frame, void *data) -{ - STACK_DESTROY (sync_frame->root); - - return 0; -} - -int -pump_execute_commit (call_frame_t *frame, xlator_t *this) -{ - afr_private_t *priv = NULL; - pump_private_t *pump_priv = NULL; - afr_local_t *local = NULL; - call_frame_t *sync_frame = NULL; - int ret = 0; - - priv = this->private; - pump_priv = priv->pump_private; - local = frame->local; - - local->op_ret = 0; - if (pump_priv->pump_finished) { - pump_change_state (this, PUMP_STATE_COMMIT); - sync_frame = create_frame (this, this->ctx->pool); - ret = synctask_new (pump_priv->env, pump_cleanup_helper, - pump_cleanup_done, sync_frame, frame); - if (ret) { - gf_msg_debug (this->name, 0, "Couldn't create " - "synctask for cleaning up xattrs."); - } - - } else { - gf_msg (this->name, GF_LOG_ERROR, EINPROGRESS, - AFR_MSG_MIGRATION_IN_PROGRESS, - "Commit can't proceed. Migration in progress"); - local->op_ret = -1; - local->op_errno = EINPROGRESS; - pump_command_reply (frame, this); - } - - return 0; -} -int -pump_execute_abort (call_frame_t *frame, xlator_t *this) -{ - afr_private_t *priv = NULL; - pump_private_t *pump_priv = NULL; - afr_local_t *local = NULL; - call_frame_t *sync_frame = NULL; - int ret = 0; - - priv = this->private; - pump_priv = priv->pump_private; - local = frame->local; - - pump_change_state (this, PUMP_STATE_ABORT); - - LOCK (&pump_priv->resume_path_lock); - { - pump_priv->number_files_pumped = 0; - pump_priv->current_file[0] = '\0'; - } - UNLOCK (&pump_priv->resume_path_lock); - - local->op_ret = 0; - if (pump_priv->pump_finished) { - sync_frame = create_frame (this, this->ctx->pool); - ret = synctask_new (pump_priv->env, pump_cleanup_helper, - pump_cleanup_done, sync_frame, frame); - if (ret) { - gf_msg_debug (this->name, 0, "Couldn't create " - "synctask for cleaning up xattrs."); - } - - } else { - pump_priv->cleaner = fop_setxattr_cbk_stub (frame, - pump_xattr_cleaner, - 0, 0, NULL); - } - - return 0; -} - -gf_boolean_t -pump_command_status (xlator_t *this, dict_t *dict) -{ - char *cmd = NULL; - int dict_ret = -1; - int ret = _gf_true; - - dict_ret = dict_get_str (dict, RB_PUMP_CMD_STATUS, &cmd); - if (dict_ret < 0) { - gf_msg_debug (this->name, 0, - "Not a pump status command"); - ret = _gf_false; - goto out; - } - - gf_msg_debug (this->name, 0, - "Hit a pump command - status"); - ret = _gf_true; - -out: - return ret; - -} - -gf_boolean_t -pump_command_pause (xlator_t *this, dict_t *dict) -{ - char *cmd = NULL; - int dict_ret = -1; - int ret = _gf_true; - - dict_ret = dict_get_str (dict, RB_PUMP_CMD_PAUSE, &cmd); - if (dict_ret < 0) { - gf_msg_debug (this->name, 0, - "Not a pump pause command"); - ret = _gf_false; - goto out; - } - - gf_msg_debug (this->name, 0, - "Hit a pump command - pause"); - ret = _gf_true; - -out: - return ret; - -} - -gf_boolean_t -pump_command_commit (xlator_t *this, dict_t *dict) -{ - char *cmd = NULL; - int dict_ret = -1; - int ret = _gf_true; - - dict_ret = dict_get_str (dict, RB_PUMP_CMD_COMMIT, &cmd); - if (dict_ret < 0) { - gf_msg_debug (this->name, 0, - "Not a pump commit command"); - ret = _gf_false; - goto out; - } - - gf_msg_debug (this->name, 0, - "Hit a pump command - commit"); - ret = _gf_true; - -out: - return ret; - -} - -gf_boolean_t -pump_command_abort (xlator_t *this, dict_t *dict) -{ - char *cmd = NULL; - int dict_ret = -1; - int ret = _gf_true; - - dict_ret = dict_get_str (dict, RB_PUMP_CMD_ABORT, &cmd); - if (dict_ret < 0) { - gf_msg_debug (this->name, 0, - "Not a pump abort command"); - ret = _gf_false; - goto out; - } - - gf_msg_debug (this->name, 0, - "Hit a pump command - abort"); - ret = _gf_true; - -out: - return ret; - -} - -gf_boolean_t -pump_command_start (xlator_t *this, dict_t *dict) -{ - char *cmd = NULL; - int dict_ret = -1; - int ret = _gf_true; - - dict_ret = dict_get_str (dict, RB_PUMP_CMD_START, &cmd); - if (dict_ret < 0) { - gf_msg_debug (this->name, 0, - "Not a pump start command"); - ret = _gf_false; - goto out; - } - - gf_msg_debug (this->name, 0, - "Hit a pump command - start"); - ret = _gf_true; - -out: - return ret; - -} - -int -pump_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, - const char *name, dict_t *xdata) -{ - afr_private_t *priv = NULL; - int op_errno = 0; - int ret = 0; - - priv = this->private; - - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, default_getxattr_cbk, - FIRST_CHILD (this), - (FIRST_CHILD (this))->fops->getxattr, - loc, name, xdata); - return 0; - } - - if (name) { - if (!strncmp (name, AFR_XATTR_PREFIX, - strlen (AFR_XATTR_PREFIX))) { - - op_errno = ENODATA; - ret = -1; - goto out; - } - - if (!strcmp (name, RB_PUMP_CMD_STATUS)) { - gf_msg_debug (this->name, 0, - "Hit pump command - status"); - pump_execute_status (frame, this); - goto out; - } - } - - afr_getxattr (frame, this, loc, name, xdata); - -out: - if (ret < 0) - AFR_STACK_UNWIND (getxattr, frame, -1, op_errno, NULL, NULL); - return 0; -} - -int -pump_command_reply (call_frame_t *frame, xlator_t *this) -{ - afr_local_t *local = NULL; - - local = frame->local; - - if (local->op_ret < 0) - gf_msg (this->name, GF_LOG_INFO, - 0, AFR_MSG_INFO_COMMON, - "Command failed"); - else - gf_msg (this->name, GF_LOG_INFO, - 0, AFR_MSG_INFO_COMMON, - "Command succeeded"); - - AFR_STACK_UNWIND (setxattr, - frame, - local->op_ret, - local->op_errno, NULL); - - return 0; -} - -int -pump_parse_command (call_frame_t *frame, xlator_t *this, dict_t *dict, - int *op_errno_p) -{ - afr_local_t *local = NULL; - int ret = -1; - int op_errno = 0; - - if (pump_command_start (this, dict)) { - local = AFR_FRAME_INIT (frame, op_errno); - if (!local) - goto out; - local->dict = dict_ref (dict); - ret = pump_execute_start (frame, this); - - } else if (pump_command_pause (this, dict)) { - local = AFR_FRAME_INIT (frame, op_errno); - if (!local) - goto out; - local->dict = dict_ref (dict); - ret = pump_execute_pause (frame, this); - - } else if (pump_command_abort (this, dict)) { - local = AFR_FRAME_INIT (frame, op_errno); - if (!local) - goto out; - local->dict = dict_ref (dict); - ret = pump_execute_abort (frame, this); - - } else if (pump_command_commit (this, dict)) { - local = AFR_FRAME_INIT (frame, op_errno); - if (!local) - goto out; - local->dict = dict_ref (dict); - ret = pump_execute_commit (frame, this); - } -out: - if (op_errno_p) - *op_errno_p = op_errno; - return ret; -} - -int -pump_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict, - int32_t flags, dict_t *xdata) -{ - afr_private_t *priv = NULL; - int ret = -1; - int op_errno = 0; - - GF_IF_INTERNAL_XATTR_GOTO ("trusted.glusterfs.pump*", dict, op_errno, out); - - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, default_setxattr_cbk, - FIRST_CHILD (this), - (FIRST_CHILD (this))->fops->setxattr, - loc, dict, flags, xdata); - return 0; - } - - ret = pump_parse_command (frame, this, dict, &op_errno); - if (ret >= 0) - goto out; - - afr_setxattr (frame, this, loc, dict, flags, xdata); - - ret = 0; -out: - if (ret < 0) { - AFR_STACK_UNWIND (setxattr, frame, -1, op_errno, NULL); - } - - return 0; -} - -/* Defaults */ -static int32_t -pump_lookup (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - dict_t *xattr_req) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_lookup_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->lookup, - loc, - xattr_req); - return 0; - } - - afr_lookup (frame, this, loc, xattr_req); - return 0; -} - - -static int32_t -pump_truncate (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - off_t offset, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_truncate_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->truncate, - loc, - offset, xdata); - return 0; - } - - afr_truncate (frame, this, loc, offset, xdata); - return 0; -} - - -static int32_t -pump_ftruncate (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - off_t offset, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_ftruncate_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->ftruncate, - fd, - offset, xdata); - return 0; - } - - afr_ftruncate (frame, this, fd, offset, xdata); - return 0; -} - - - - -int -pump_mknod (call_frame_t *frame, xlator_t *this, - loc_t *loc, mode_t mode, dev_t rdev, mode_t umask, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, default_mknod_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->mknod, - loc, mode, rdev, umask, xdata); - return 0; - } - afr_mknod (frame, this, loc, mode, rdev, umask, xdata); - return 0; - -} - - - -int -pump_mkdir (call_frame_t *frame, xlator_t *this, - loc_t *loc, mode_t mode, mode_t umask, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, default_mkdir_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->mkdir, - loc, mode, umask, xdata); - return 0; - } - afr_mkdir (frame, this, loc, mode, umask, xdata); - return 0; - -} - - -static int32_t -pump_unlink (call_frame_t *frame, - xlator_t *this, - loc_t *loc, int xflag, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_unlink_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->unlink, - loc, xflag, xdata); - return 0; - } - afr_unlink (frame, this, loc, xflag, xdata); - return 0; - -} - - -static int -pump_rmdir (call_frame_t *frame, xlator_t *this, - loc_t *loc, int flags, dict_t *xdata) -{ - afr_private_t *priv = NULL; - - priv = this->private; - - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, default_rmdir_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->rmdir, - loc, flags, xdata); - return 0; - } - - afr_rmdir (frame, this, loc, flags, xdata); - return 0; - -} - - - -int -pump_symlink (call_frame_t *frame, xlator_t *this, - const char *linkpath, loc_t *loc, mode_t umask, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, default_symlink_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->symlink, - linkpath, loc, umask, xdata); - return 0; - } - afr_symlink (frame, this, linkpath, loc, umask, xdata); - return 0; - -} - - -static int32_t -pump_rename (call_frame_t *frame, - xlator_t *this, - loc_t *oldloc, - loc_t *newloc, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_rename_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->rename, - oldloc, newloc, xdata); - return 0; - } - afr_rename (frame, this, oldloc, newloc, xdata); - return 0; - -} - - -static int32_t -pump_link (call_frame_t *frame, - xlator_t *this, - loc_t *oldloc, - loc_t *newloc, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_link_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->link, - oldloc, newloc, xdata); - return 0; - } - afr_link (frame, this, oldloc, newloc, xdata); - return 0; - -} - - -static int32_t -pump_create (call_frame_t *frame, xlator_t *this, - loc_t *loc, int32_t flags, mode_t mode, - mode_t umask, fd_t *fd, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, default_create_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->create, - loc, flags, mode, umask, fd, xdata); - return 0; - } - afr_create (frame, this, loc, flags, mode, umask, fd, xdata); - return 0; - -} - - -static int32_t -pump_open (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - int32_t flags, fd_t *fd, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_open_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->open, - loc, flags, fd, xdata); - return 0; - } - afr_open (frame, this, loc, flags, fd, xdata); - return 0; - -} - - -static int32_t -pump_writev (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - struct iovec *vector, - int32_t count, - off_t off, uint32_t flags, - struct iobref *iobref, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_writev_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->writev, - fd, - vector, - count, - off, flags, - iobref, xdata); - return 0; - } - - afr_writev (frame, this, fd, vector, count, off, flags, iobref, xdata); - return 0; -} - - -static int32_t -pump_flush (call_frame_t *frame, - xlator_t *this, - fd_t *fd, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_flush_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->flush, - fd, xdata); - return 0; - } - afr_flush (frame, this, fd, xdata); - return 0; - -} - - -static int32_t -pump_fsync (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - int32_t flags, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_fsync_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->fsync, - fd, - flags, xdata); - return 0; - } - afr_fsync (frame, this, fd, flags, xdata); - return 0; - -} - - -static int32_t -pump_opendir (call_frame_t *frame, - xlator_t *this, - loc_t *loc, fd_t *fd, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_opendir_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->opendir, - loc, fd, xdata); - return 0; - } - afr_opendir (frame, this, loc, fd, xdata); - return 0; - -} - - -static int32_t -pump_fsyncdir (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - int32_t flags, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_fsyncdir_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->fsyncdir, - fd, - flags, xdata); - return 0; - } - afr_fsyncdir (frame, this, fd, flags, xdata); - return 0; - -} - - -static int32_t -pump_xattrop (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - gf_xattrop_flags_t flags, - dict_t *dict, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_xattrop_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->xattrop, - loc, - flags, - dict, xdata); - return 0; - } - afr_xattrop (frame, this, loc, flags, dict, xdata); - return 0; - -} - -static int32_t -pump_fxattrop (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - gf_xattrop_flags_t flags, - dict_t *dict, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_fxattrop_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->fxattrop, - fd, - flags, - dict, xdata); - return 0; - } - afr_fxattrop (frame, this, fd, flags, dict, xdata); - return 0; - -} - - -static int32_t -pump_removexattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - const char *name, dict_t *xdata) -{ - afr_private_t *priv = NULL; - int op_errno = -1; - - VALIDATE_OR_GOTO (this, out); - - GF_IF_NATIVE_XATTR_GOTO ("trusted.glusterfs.pump*", - name, op_errno, out); - - op_errno = 0; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_removexattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->removexattr, - loc, - name, xdata); - return 0; - } - afr_removexattr (frame, this, loc, name, xdata); - - out: - if (op_errno) - AFR_STACK_UNWIND (removexattr, frame, -1, op_errno, NULL); - return 0; - -} - - - -static int32_t -pump_readdir (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - size_t size, - off_t off, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_readdir_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->readdir, - fd, size, off, xdata); - return 0; - } - afr_readdir (frame, this, fd, size, off, xdata); - return 0; - -} - - -static int32_t -pump_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, - size_t size, off_t off, dict_t *dict) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_readdirp_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->readdirp, - fd, size, off, dict); - return 0; - } - afr_readdirp (frame, this, fd, size, off, dict); - return 0; - -} - - - -static int32_t -pump_releasedir (xlator_t *this, - fd_t *fd) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (priv->use_afr_in_pump) - afr_releasedir (this, fd); - return 0; - -} - -static int32_t -pump_release (xlator_t *this, - fd_t *fd) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (priv->use_afr_in_pump) - afr_release (this, fd); - return 0; - -} - -static int32_t -pump_forget (xlator_t *this, inode_t *inode) -{ - afr_private_t *priv = NULL; - - priv = this->private; - if (priv->use_afr_in_pump) - afr_forget (this, inode); - - return 0; -} - -static int32_t -pump_setattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - struct iatt *stbuf, - int32_t valid, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_setattr_cbk, - FIRST_CHILD (this), - FIRST_CHILD (this)->fops->setattr, - loc, stbuf, valid, xdata); - return 0; - } - afr_setattr (frame, this, loc, stbuf, valid, xdata); - return 0; - -} - - -static int32_t -pump_fsetattr (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - struct iatt *stbuf, - int32_t valid, dict_t *xdata) -{ - afr_private_t *priv = NULL; - priv = this->private; - if (!priv->use_afr_in_pump) { - STACK_WIND (frame, - default_fsetattr_cbk, - FIRST_CHILD (this), - FIRST_CHILD (this)->fops->fsetattr, - fd, stbuf, valid, xdata); - return 0; - } - afr_fsetattr (frame, this, fd, stbuf, valid, xdata); - return 0; - -} - - -/* End of defaults */ - - -int32_t -mem_acct_init (xlator_t *this) -{ - int ret = -1; - - if (!this) - return ret; - - ret = xlator_mem_acct_init (this, gf_afr_mt_end + 1); - - if (ret != 0) { - return ret; - } - - return ret; -} - -static int -is_xlator_pump_sink (xlator_t *child) -{ - return (child == PUMP_SINK_CHILD(THIS)); -} - -static int -is_xlator_pump_source (xlator_t *child) -{ - return (child == PUMP_SOURCE_CHILD(THIS)); -} - -int32_t -notify (xlator_t *this, int32_t event, - void *data, ...) -{ - int ret = -1; - xlator_t *child_xl = NULL; - - child_xl = (xlator_t *) data; - - ret = afr_notify (this, event, data, NULL); - - switch (event) { - case GF_EVENT_CHILD_DOWN: - if (is_xlator_pump_source (child_xl)) - pump_change_state (this, PUMP_STATE_ABORT); - break; - - case GF_EVENT_CHILD_UP: - if (is_xlator_pump_sink (child_xl)) - if (is_pump_start_pending (this)) { - gf_msg_debug (this->name, 0, - "about to start synctask"); - ret = pump_start_synctask (this); - if (ret < 0) - gf_msg_debug (this->name, 0, - "Could not start pump " - "synctask"); - else - pump_remove_start_pending (this); - } - } - - return ret; -} - -int32_t -init (xlator_t *this) -{ - afr_private_t * priv = NULL; - pump_private_t *pump_priv = NULL; - int child_count = 0; - xlator_list_t * trav = NULL; - int i = 0; - int ret = -1; - GF_UNUSED int op_errno = 0; - - int source_child = 0; - - if (!this->children) { - gf_msg (this->name, GF_LOG_ERROR, - 0, AFR_MSG_CHILD_MISCONFIGURED, - "pump translator needs a source and sink" - "subvolumes defined."); - return -1; - } - - if (!this->parents) { - gf_msg (this->name, GF_LOG_WARNING, 0, - AFR_MSG_VOL_MISCONFIGURED, "Volume is dangling."); - } - - priv = GF_CALLOC (1, sizeof (afr_private_t), gf_afr_mt_afr_private_t); - if (!priv) - goto out; - - LOCK_INIT (&priv->lock); - - child_count = xlator_subvolume_count (this); - if (child_count != 2) { - gf_msg (this->name, GF_LOG_ERROR, - 0, AFR_MSG_CHILD_MISCONFIGURED, - "There should be exactly 2 children - one source " - "and one sink"); - LOCK_DESTROY (&priv->lock); - GF_FREE (priv); - return -1; - } - priv->child_count = child_count; - - priv->read_child = source_child; - priv->favorite_child = source_child; - priv->background_self_heal_count = 0; - - priv->data_self_heal = "on"; - priv->metadata_self_heal = 1; - priv->entry_self_heal = 1; - - priv->data_self_heal_window_size = 16; - - priv->data_change_log = 1; - priv->metadata_change_log = 1; - priv->entry_change_log = 1; - priv->use_afr_in_pump = 1; - priv->sh_readdir_size = 65536; - - /* Locking options */ - - /* Lock server count infact does not matter. Locks are held - on all subvolumes, in this case being the source - and the sink. - */ - - priv->child_up = GF_CALLOC (sizeof (unsigned char), child_count, - gf_afr_mt_char); - if (!priv->child_up) { - op_errno = ENOMEM; - goto out; - } - - priv->children = GF_CALLOC (sizeof (xlator_t *), child_count, - gf_afr_mt_xlator_t); - if (!priv->children) { - op_errno = ENOMEM; - goto out; - } - - priv->pending_key = GF_CALLOC (sizeof (*priv->pending_key), - child_count, - gf_afr_mt_char); - if (!priv->pending_key) { - op_errno = ENOMEM; - goto out; - } - - trav = this->children; - i = 0; - while (i < child_count) { - priv->children[i] = trav->xlator; - - ret = gf_asprintf (&priv->pending_key[i], "%s.%s", - AFR_XATTR_PREFIX, - trav->xlator->name); - if (-1 == ret) { - op_errno = ENOMEM; - goto out; - } - - trav = trav->next; - i++; - } - - ret = gf_asprintf (&priv->sh_domain, "%s-self-heal", this->name); - if (-1 == ret) { - op_errno = ENOMEM; - goto out; - } - - priv->root_inode = NULL; - - priv->last_event = GF_CALLOC (child_count, sizeof (*priv->last_event), - gf_afr_mt_int32_t); - if (!priv->last_event) { - ret = -ENOMEM; - goto out; - } - - pump_priv = GF_CALLOC (1, sizeof (*pump_priv), - gf_afr_mt_pump_priv); - if (!pump_priv) { - op_errno = ENOMEM; - goto out; - } - - LOCK_INIT (&pump_priv->resume_path_lock); - LOCK_INIT (&pump_priv->pump_state_lock); - - pump_priv->resume_path = GF_CALLOC (1, PATH_MAX, - gf_afr_mt_char); - if (!pump_priv->resume_path) { - ret = -1; - goto out; - } - - pump_priv->env = this->ctx->env; - if (!pump_priv->env) { - ret = -1; - goto out; - } - - /* keep more local here as we may need them for self-heal etc */ - this->local_pool = mem_pool_new (afr_local_t, 128); - if (!this->local_pool) { - ret = -1; - goto out; - } - - priv->pump_private = pump_priv; - pump_priv = NULL; - - this->private = priv; - priv = NULL; - - pump_change_state (this, PUMP_STATE_ABORT); - - ret = 0; -out: - - if (pump_priv) { - GF_FREE (pump_priv->resume_path); - LOCK_DESTROY (&pump_priv->resume_path_lock); - LOCK_DESTROY (&pump_priv->pump_state_lock); - GF_FREE (pump_priv); - } - - if (priv) { - GF_FREE (priv->child_up); - GF_FREE (priv->children); - GF_FREE (priv->pending_key); - GF_FREE (priv->last_event); - LOCK_DESTROY (&priv->lock); - GF_FREE (priv); - } - - return ret; -} - -int -fini (xlator_t *this) -{ - afr_private_t * priv = NULL; - pump_private_t *pump_priv = NULL; - - priv = this->private; - this->private = NULL; - if (!priv) - goto out; - - pump_priv = priv->pump_private; - if (!pump_priv) - goto afr_priv; - - GF_FREE (pump_priv->resume_path); - LOCK_DESTROY (&pump_priv->resume_path_lock); - LOCK_DESTROY (&pump_priv->pump_state_lock); - GF_FREE (pump_priv); -afr_priv: - afr_priv_destroy (priv); -out: - return 0; -} - - -struct xlator_fops fops = { - .lookup = pump_lookup, - .open = pump_open, - .flush = pump_flush, - .fsync = pump_fsync, - .fsyncdir = pump_fsyncdir, - .xattrop = pump_xattrop, - .fxattrop = pump_fxattrop, - .getxattr = pump_getxattr, - - /* inode write */ - .writev = pump_writev, - .truncate = pump_truncate, - .ftruncate = pump_ftruncate, - .setxattr = pump_setxattr, - .setattr = pump_setattr, - .fsetattr = pump_fsetattr, - .removexattr = pump_removexattr, - - /* dir read */ - .opendir = pump_opendir, - .readdir = pump_readdir, - .readdirp = pump_readdirp, - - /* dir write */ - .create = pump_create, - .mknod = pump_mknod, - .mkdir = pump_mkdir, - .unlink = pump_unlink, - .rmdir = pump_rmdir, - .link = pump_link, - .symlink = pump_symlink, - .rename = pump_rename, -}; - -struct xlator_dumpops dumpops = { - .priv = afr_priv_dump, -}; - - -struct xlator_cbks cbks = { - .release = pump_release, - .releasedir = pump_releasedir, - .forget = pump_forget, -}; - -struct volume_options options[] = { - { .key = {NULL} }, -}; diff --git a/xlators/cluster/afr/src/pump.h b/xlators/cluster/afr/src/pump.h deleted file mode 100644 index 7d5acd02bf6..00000000000 --- a/xlators/cluster/afr/src/pump.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ - -#ifndef __PUMP_H__ -#define __PUMP_H__ - -#include "syncop.h" - -/* FIXME: Needs to be defined in a common file */ -#define CLIENT_CMD_CONNECT "trusted.glusterfs.client-connect" -#define CLIENT_CMD_DISCONNECT "trusted.glusterfs.client-disconnect" - -#define PUMP_SOURCE_COMPLETE "trusted.glusterfs.pump-source-complete" -#define PUMP_SINK_COMPLETE "trusted.glusterfs.pump-sink-complete" - -#define PUMP_PATH "trusted.glusterfs.pump-path" - -#define PUMP_SOURCE_CHILD(xl) (xl->children->xlator) -#define PUMP_SINK_CHILD(xl) (xl->children->next->xlator) - -typedef enum { - PUMP_STATE_RUNNING, /* Pump is running and migrating files */ - PUMP_STATE_RESUME, /* Pump is resuming from a previous pause */ - PUMP_STATE_PAUSE, /* Pump is paused */ - PUMP_STATE_ABORT, /* Pump is aborted */ - PUMP_STATE_COMMIT, /* Pump is committed */ -} pump_state_t; - -typedef struct _pump_private { - struct syncenv *env; /* The env pointer to the pump synctask */ - char *resume_path; /* path to resume from the last pause */ - gf_lock_t resume_path_lock; /* Synchronize resume_path changes */ - gf_lock_t pump_state_lock; /* Synchronize pump_state changes */ - pump_state_t pump_state; /* State of pump */ - char current_file[PATH_MAX]; /* Current file being pumped */ - uint64_t number_files_pumped; /* Number of files pumped */ - gf_boolean_t pump_finished; /* Boolean to indicate pump termination */ - char pump_start_pending; /* Boolean to mark start pending until - CHILD_UP */ - call_stub_t *cleaner; -} pump_private_t; - -void -build_root_loc (inode_t *inode, loc_t *loc); -int pump_start (call_frame_t *frame, xlator_t *this); - -gf_boolean_t -pump_command_start (xlator_t *this, dict_t *dict); - -int -pump_execute_start (call_frame_t *frame, xlator_t *this); - -gf_boolean_t -pump_command_pause (xlator_t *this, dict_t *dict); - -int -pump_execute_pause (call_frame_t *frame, xlator_t *this); - -gf_boolean_t -pump_command_abort (xlator_t *this, dict_t *dict); - -int -pump_execute_abort (call_frame_t *frame, xlator_t *this); - -gf_boolean_t -pump_command_status (xlator_t *this, dict_t *dict); - -int -pump_execute_status (call_frame_t *frame, xlator_t *this); - -int -pump_command_reply (call_frame_t *frame, xlator_t *this); - -#endif /* __PUMP_H__ */ diff --git a/xlators/cluster/ha/Makefile.am b/xlators/cluster/ha/Makefile.am deleted file mode 100644 index d471a3f9243..00000000000 --- a/xlators/cluster/ha/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -SUBDIRS = src - -CLEANFILES = diff --git a/xlators/cluster/ha/src/Makefile.am b/xlators/cluster/ha/src/Makefile.am deleted file mode 100644 index 740a6b840d7..00000000000 --- a/xlators/cluster/ha/src/Makefile.am +++ /dev/null @@ -1,17 +0,0 @@ -xlator_LTLIBRARIES = ha.la -xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/testing/cluster - -ha_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS) - - -ha_la_SOURCES = ha-helpers.c ha.c -ha_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la - -noinst_HEADERS = ha.h - -AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src - -AM_CFLAGS = -Wall $(GF_CFLAGS) - -CLEANFILES = - diff --git a/xlators/cluster/ha/src/ha-helpers.c b/xlators/cluster/ha/src/ha-helpers.c deleted file mode 100644 index 19be1ed2773..00000000000 --- a/xlators/cluster/ha/src/ha-helpers.c +++ /dev/null @@ -1,194 +0,0 @@ -/* - Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ -#include "xlator.h" -#include "call-stub.h" -#include "defaults.h" -#include "dict.h" -#include "compat-errno.h" -#include "ha.h" - -#define HA_TRANSPORT_NOTCONN(_ret, _errno, _fd) \ - ((_ret == -1) && (_fd ? (_errno == EBADFD):(_errno == ENOTCONN))) - -int ha_alloc_init_fd (call_frame_t *frame, fd_t *fd) -{ - ha_local_t *local = NULL; - int i = -1; - ha_private_t *pvt = NULL; - int child_count = 0; - int ret = -1; - hafd_t *hafdp = NULL; - xlator_t *this = NULL; - uint64_t tmp_hafdp = 0; - - this = frame->this; - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - - if (local == NULL) { - ret = fd_ctx_get (fd, this, &tmp_hafdp); - if (ret < 0) { - goto out; - } - hafdp = (hafd_t *)(long)tmp_hafdp; - local = frame->local = GF_CALLOC (1, sizeof (*local), - gf_ha_mt_ha_local_t); - if (local == NULL) { - ret = -ENOMEM; - goto out; - } - local->state = GF_CALLOC (1, child_count, - gf_ha_mt_child_count); - if (local->state == NULL) { - ret = -ENOMEM; - goto out; - } - - /* take care of the preferred subvolume */ - if (pvt->pref_subvol == -1) - local->active = hafdp->active; - else - local->active = pvt->pref_subvol; - - LOCK (&hafdp->lock); - memcpy (local->state, hafdp->fdstate, child_count); - UNLOCK (&hafdp->lock); - - /* in case the preferred subvolume is down */ - if ((local->active != -1) && (local->state[local->active] == 0)) - local->active = -1; - - for (i = 0; i < child_count; i++) { - if (local->state[i]) { - if (local->active == -1) - local->active = i; - local->tries++; - } - } - if (local->active == -1) { - ret = -ENOTCONN; - goto out; - } - local->fd = fd_ref (fd); - } - ret = 0; -out: - return ret; -} - -int ha_handle_cbk (call_frame_t *frame, void *cookie, int op_ret, int op_errno) -{ - xlator_t *xl = NULL; - ha_private_t *pvt = NULL; - xlator_t **children = NULL; - int prev_child = -1; - hafd_t *hafdp = NULL; - int ret = -1; - call_stub_t *stub = NULL; - ha_local_t *local = NULL; - uint64_t tmp_hafdp = 0; - - xl = frame->this; - pvt = xl->private; - children = pvt->children; - prev_child = (long) cookie; - local = frame->local; - - if (op_ret == -1) { - gf_log (xl->name, GF_LOG_ERROR ,"(child=%s) (op_ret=%d op_errno=%s)", - children[prev_child]->name, op_ret, strerror (op_errno)); - } - - if (HA_TRANSPORT_NOTCONN (op_ret, op_errno, (local->fd))) { - ret = 0; - if (local->fd) { - ret = fd_ctx_get (local->fd, xl, &tmp_hafdp); - } - hafdp = (hafd_t *)(long)tmp_hafdp; - if (ret == 0) { - if (local->fd) { - LOCK(&hafdp->lock); - hafdp->fdstate[prev_child] = 0; - UNLOCK(&hafdp->lock); - } - local->tries--; - if (local->tries != 0) { - while (1) { - local->active = (local->active + 1) % pvt->child_count; - if (local->state[local->active]) - break; - } - stub = local->stub; - local->stub = NULL; - call_resume (stub); - return -1; - } - } - } - if (local->stub) { - call_stub_destroy (local->stub); - local->stub = NULL; - } - - if (local->fd) { - GF_FREE (local->state); - local->state = NULL; - - fd_unref (local->fd); - local->fd = NULL; - } - return 0; -} - -int ha_alloc_init_inode (call_frame_t *frame, inode_t *inode) -{ - int i = -1; - ha_private_t *pvt = NULL; - xlator_t *xl = NULL; - int ret = -1; - ha_local_t *local = NULL; - uint64_t tmp_state = 0; - - xl = frame->this; - pvt = xl->private; - local = frame->local; - - if (local == NULL) { - local = frame->local = GF_CALLOC (1, sizeof (*local), - gf_ha_mt_ha_local_t); - if (local == NULL) { - ret = -ENOMEM; - goto out; - } - local->active = pvt->pref_subvol; - ret = inode_ctx_get (inode, xl, &tmp_state); - if (ret < 0) { - goto out; - } - local->state = (char *)(long)tmp_state; - if (local->active != -1 && local->state[local->active] == 0) - local->active = -1; - for (i = 0; i < pvt->child_count; i++) { - if (local->state[i]) { - if (local->active == -1) - local->active = i; - local->tries++; - } - } - if (local->active == -1) { - ret = -ENOTCONN; - goto out; - } - } - ret = 0; -out: - return ret; -} diff --git a/xlators/cluster/ha/src/ha-mem-types.h b/xlators/cluster/ha/src/ha-mem-types.h deleted file mode 100644 index e5e97d237dc..00000000000 --- a/xlators/cluster/ha/src/ha-mem-types.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ - -#ifndef __HA_MEM_TYPES_H__ -#define __HA_MEM_TYPES_H__ - -#include "mem-types.h" - -enum gf_ha_mem_types_ { - gf_ha_mt_ha_local_t = gf_common_mt_end + 1, - gf_ha_mt_hafd_t, - gf_ha_mt_char, - gf_ha_mt_child_count, - gf_ha_mt_xlator_t, - gf_ha_mt_ha_private_t, - gf_ha_mt_end -}; -#endif - diff --git a/xlators/cluster/ha/src/ha.c b/xlators/cluster/ha/src/ha.c deleted file mode 100644 index 6071eab55ee..00000000000 --- a/xlators/cluster/ha/src/ha.c +++ /dev/null @@ -1,4008 +0,0 @@ -/* - Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ -/* generate errors randomly, code is simple now, better alogorithm - * can be written to decide what error to be returned and when - */ - -#include "xlator.h" -#include "call-stub.h" -#include "defaults.h" -#include "dict.h" -#include "compat-errno.h" -#include "ha.h" - -/* - * TODO: - * - dbench fails if ha over server side afr - * - lock calls - lock on all subvols. - * - support preferred-subvolume option. code already there. - * - do not alloc the call-stub in case only one subvol is up. - */ - -void -ha_local_wipe (ha_local_t *local) -{ - if (local->stub) { - call_stub_destroy (local->stub); - local->stub = NULL; - } - - if (local->state) { - GF_FREE (local->state); - local->state = NULL; - } - - if (local->dict) { - dict_unref (local->dict); - local->dict = NULL; - } - - loc_wipe (&local->loc); - - if (local->fd) { - fd_unref (local->fd); - local->fd = NULL; - } - - if (local->inode) { - inode_unref (local->inode); - local->inode = NULL; - } - - GF_FREE (local); - return; -} - - -int -ha_forget (xlator_t *this, - inode_t *inode) -{ - uint64_t stateino = 0; - char *state = NULL; - if (!inode_ctx_del (inode, this, &stateino)) { - state = ((char *)(long)stateino); - GF_FREE (state); - } - - return 0; - -} - -int32_t -ha_lookup_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - dict_t *dict, - struct iatt *postparent) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - int child_count = 0, i = 0, callcnt = 0; - char *state = NULL; - call_frame_t *prev_frame = NULL; - xlator_t **children = NULL; - uint64_t tmp_state = 0; - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - prev_frame = cookie; - children = pvt->children; - - for (i = 0; i < child_count; i++) { - if (pvt->children[i] == prev_frame->this) - break; - } - if ((op_ret == -1) && (op_errno != ENOENT)) { - gf_log (this->name, GF_LOG_ERROR, "(child=%s) (op_ret=%d op_errno=%s)", - children[i]->name, op_ret, strerror (op_errno)); - } - inode_ctx_get (local->inode, this, &tmp_state); - state = (char *)(long)tmp_state; - - LOCK (&frame->lock); - if (local->revalidate == 1) { - if ((!op_ret) != state[i]) { - local->revalidate_error = 1; - gf_log (this->name, GF_LOG_DEBUG, "revalidate error on %s", - pvt->children[i]->name); - } - } else { - if (op_ret == 0) { - state[i] = 1; - } - } - if (local->op_ret == -1 && op_ret == 0) { - local->op_ret = 0; - local->buf = *buf; - local->postparent = *postparent; - if (dict) - local->dict = dict_ref (dict); - } - if (op_ret == -1 && op_ret != ENOTCONN) - local->op_errno = op_errno; - callcnt = --local->call_count; - UNLOCK (&frame->lock); - - if (callcnt == 0) { - dict_t *ctx = local->dict; - inode_t *inode = local->inode; - if (local->revalidate_error == 1) { - local->op_ret = -1; - local->op_errno = EIO; - gf_log (this->name, GF_LOG_DEBUG, "revalidate error, returning EIO"); - } - STACK_UNWIND (frame, - local->op_ret, - local->op_errno, - inode, - &local->buf, - ctx, - &local->postparent); - if (inode) - inode_unref (inode); - if (ctx) - dict_unref (ctx); - } - return 0; -} - -int32_t -ha_lookup (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - dict_t *xattr_req) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - int child_count = 0, i = 0; - char *state = NULL; - xlator_t **children = NULL; - int ret = -1; - int32_t op_errno = EINVAL; - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - children = pvt->children; - - frame->local = local = GF_CALLOC (1, sizeof (*local), - gf_ha_mt_ha_local_t); - if (!local) { - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - op_errno = ENOMEM; - goto unwind; - } - - child_count = pvt->child_count; - local->inode = inode_ref (loc->inode); - - ret = inode_ctx_get (loc->inode, this, NULL); - if (ret) { - state = GF_CALLOC (1, child_count, gf_ha_mt_child_count); - if (state == NULL) { - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - op_errno = ENOMEM; - goto unwind; - } - - inode_ctx_put (loc->inode, this, (uint64_t)(long)state); - } else - local->revalidate = 1; - - local->op_ret = -1; - local->op_errno = ENOTCONN; - local->call_count = child_count; - - for (i = 0; i < child_count; i++) { - STACK_WIND (frame, - ha_lookup_cbk, - children[i], - children[i]->fops->lookup, - loc, - xattr_req); - } - return 0; - -unwind: - local = frame->local; - frame->local = NULL; - STACK_UNWIND (frame, -1, op_errno, NULL, NULL, NULL, NULL); - - ha_local_wipe (local); - return 0; -} - - int32_t -ha_stat_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *buf) -{ - int ret = -1; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno, - buf); - } - return 0; -} - -int32_t -ha_stat (call_frame_t *frame, - xlator_t *this, - loc_t *loc) -{ - ha_local_t *local = NULL; - int op_errno = ENOTCONN; - - op_errno = ha_alloc_init_inode (frame, loc->inode); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_stat_stub (frame, ha_stat, loc); - - STACK_WIND_COOKIE (frame, - ha_stat_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->stat, - loc); - return 0; -err: - STACK_UNWIND (frame, -1, op_errno, NULL); - return 0; -} - -int32_t -ha_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, struct iatt *statpre, - struct iatt *statpost) -{ - int ret = -1; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - - if (ret == 0) { - STACK_UNWIND (frame, op_ret, op_errno, statpre, statpost); - } - return 0; -} - - -int32_t -ha_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc, struct iatt *stbuf, - int32_t valid) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_inode (frame, loc->inode); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_setattr_stub (frame, ha_setattr, loc, stbuf, valid); - - STACK_WIND_COOKIE (frame, - ha_setattr_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->setattr, - loc, stbuf, valid); - return 0; -err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - return 0; -} - - -int32_t -ha_fsetattr (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iatt *stbuf, - int32_t valid) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_fd (frame, fd); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_fsetattr_stub (frame, ha_fsetattr, fd, stbuf, valid); - - STACK_WIND_COOKIE (frame, - ha_setattr_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->fsetattr, - fd, stbuf, valid); - return 0; -err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - return 0; -} - - -int32_t -ha_truncate_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *prebuf, - struct iatt *postbuf) -{ - int ret = -1; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno, - prebuf, - postbuf); - } - return 0; -} - -int32_t -ha_truncate (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - off_t offset) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_inode (frame, loc->inode); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_truncate_stub (frame, ha_truncate, loc, offset); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_truncate_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->truncate, - loc, - offset); - return 0; -err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - return 0; -} - - int32_t -ha_ftruncate_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *prebuf, - struct iatt *postbuf) -{ - int ret = -1; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno, - prebuf, postbuf); - } - return 0; -} - -int32_t -ha_ftruncate (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - off_t offset) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_fd (frame, fd); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_ftruncate_stub (frame, ha_ftruncate, fd, offset); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_ftruncate_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->ftruncate, - fd, - offset); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - ha_local_wipe (local); - return 0; -} - -int32_t -ha_access_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - int ret = -1; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno); - } - return 0; -} - -int32_t -ha_access (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - int32_t mask) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_inode (frame, loc->inode); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_access_stub (frame, ha_access, loc, mask); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_access_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->access, - loc, - mask); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno); - - ha_local_wipe (local); - return 0; -} - - - int32_t -ha_readlink_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - const char *path, - struct iatt *sbuf) -{ - int ret = -1; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno, - path, - sbuf); - } - return 0; -} - -int32_t -ha_readlink (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - size_t size) -{ - ha_local_t *local = frame->local; - int op_errno = 0; - - op_errno = ha_alloc_init_inode (frame, loc->inode); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_readlink_stub (frame, ha_readlink, loc, size); - - STACK_WIND_COOKIE (frame, - ha_readlink_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->readlink, - loc, - size); - return 0; -err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - return 0; -} - -int -ha_mknod_lookup_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - dict_t *dict, - struct iatt *postparent) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - char *stateino = NULL; - int child_count = 0, i = 0, cnt = 0, ret = 0; - call_frame_t *prev_frame = NULL; - xlator_t **children = NULL; - uint64_t tmp_stateino = 0; - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - prev_frame = cookie; - children = pvt->children; - - for (i = 0; i < child_count; i++) - if (prev_frame->this == children[i]) - break; - - if (op_ret == -1) { - gf_log (this->name, GF_LOG_ERROR, - "(path=%s) (op_ret=%d op_errno=%d)", - local->stub->args.mknod.loc.path, op_ret, op_errno); - } - ret = inode_ctx_get (local->stub->args.mknod.loc.inode, - this, &tmp_stateino); - stateino = (char *)(long)tmp_stateino; - if (ret != 0) { - gf_log (this->name, GF_LOG_ERROR, - "unwind(-1), inode_ctx_get() error"); - /* It is difficult to handle this error at this stage - * as we still expect more cbks, we can't return as - * of now - */ - } else if (op_ret == 0) { - stateino[i] = 1; - } - LOCK (&frame->lock); - cnt = --local->call_count; - UNLOCK (&frame->lock); - - if (cnt == 0) { - call_stub_t *stub = local->stub; - GF_FREE (local->state); - STACK_UNWIND (frame, - local->op_ret, - local->op_errno, - local->stub->args.mknod.loc.inode, - &local->buf, &local->preparent, - &local->postparent); - call_stub_destroy (stub); - } - return 0; -} - -int32_t -ha_mknod_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - char *stateino = NULL; - int child_count = 0, i = 0, cnt = 0, ret = 0; - call_frame_t *prev_frame = NULL; - xlator_t **children = NULL; - uint64_t tmp_stateino = 0; - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - prev_frame = cookie; - children = pvt->children; - - for (i = 0; i < child_count; i++) - if (prev_frame->this == children[i]) - break; - - if (op_ret == -1) { - local->op_errno = op_errno; - gf_log (this->name, GF_LOG_ERROR, "(path=%s) (op_ret=%d op_errno=%d)", local->stub->args.mknod.loc.path, op_ret, op_errno); - } - - ret = inode_ctx_get (local->stub->args.mknod.loc.inode, - this, &tmp_stateino); - stateino = (char *)(long)tmp_stateino; - - if (ret != 0) { - gf_log (this->name, GF_LOG_ERROR, "inode_ctx_get() error"); - /* FIXME: handle the case */ - } - if (op_ret == 0) { - stateino[i] = 1; - local->op_ret = 0; - local->first_success = 1; - local->buf = *buf; - local->preparent = *preparent; - local->postparent = *postparent; - } - cnt = --local->call_count; - for (i = local->active + 1; i < child_count; i++) { - if (local->state[i]) - break; - } - - if (cnt == 0 || i == child_count) { - call_stub_t *stub = local->stub; - GF_FREE (local->state); - stub = local->stub; - STACK_UNWIND (frame, local->op_ret, local->op_errno, - local->stub->args.mknod.loc.inode, &local->buf, - &local->preparent, &local->postparent); - call_stub_destroy (stub); - return 0; - } - - local->active = i; - - if (local->first_success == 0) { - STACK_WIND (frame, - ha_mknod_cbk, - children[i], - children[i]->fops->mknod, - &local->stub->args.mknod.loc, - local->stub->args.mknod.mode, - local->stub->args.mknod.rdev); - return 0; - } - cnt = local->call_count; - - for (; i < child_count; i++) { - if (local->state[i]) { - STACK_WIND (frame, - ha_mknod_lookup_cbk, - children[i], - children[i]->fops->lookup, - &local->stub->args.mknod.loc, - 0); - if (--cnt == 0) - break; - } - } - return 0; -} - -int32_t -ha_mknod (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - mode_t mode, - dev_t rdev) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - int child_count = 0, i = 0; - char *stateino = NULL; - int32_t op_errno = EINVAL; - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - - frame->local = local = GF_CALLOC (1, sizeof (*local), - gf_ha_mt_ha_local_t); - if (!local) { - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - op_errno = ENOMEM; - goto err; - } - - local->stub = fop_mknod_stub (frame, ha_mknod, loc, mode, rdev); - if (!local->stub) { - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - op_errno = ENOMEM; - goto err; - } - - local->op_ret = -1; - local->op_errno = ENOTCONN; - local->state = GF_CALLOC (1, child_count, gf_ha_mt_char); - if (!local->state) { - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - op_errno = ENOMEM; - goto err; - } - - memcpy (local->state, pvt->state, child_count); - local->active = -1; - - stateino = GF_CALLOC (1, child_count, gf_ha_mt_char); - if (!stateino) { - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - op_errno = ENOMEM; - goto err; - } - - inode_ctx_put (loc->inode, this, (uint64_t)(long)stateino); - - for (i = 0; i < child_count; i++) { - if (local->state[i]) { - local->call_count++; - if (local->active == -1) - local->active = i; - } - } - - STACK_WIND (frame, - ha_mknod_cbk, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->mknod, - loc, mode, rdev); - return 0; - -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno, NULL, NULL, NULL, NULL); - ha_local_wipe (local); - return 0; -} - - -int -ha_mkdir_lookup_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - dict_t *dict, - struct iatt *postparent) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - char *stateino = NULL; - int child_count = 0, i = 0, cnt = 0; - call_frame_t *prev_frame = NULL; - xlator_t **children = NULL; - uint64_t tmp_stateino = 0; - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - prev_frame = cookie; - children = pvt->children; - - for (i = 0; i < child_count; i++) - if (prev_frame->this == children[i]) - break; - - if (op_ret == -1) { - gf_log (this->name, GF_LOG_ERROR, "(path=%s) (op_ret=%d op_errno=%d)", local->stub->args.mkdir.loc.path, op_ret, op_errno); - } - inode_ctx_get (local->stub->args.mkdir.loc.inode, - this, &tmp_stateino); - stateino = (char *)(long)tmp_stateino; - - if (op_ret == 0) - stateino[i] = 1; - - LOCK (&frame->lock); - cnt = --local->call_count; - UNLOCK (&frame->lock); - - if (cnt == 0) { - call_stub_t *stub = local->stub; - GF_FREE (local->state); - STACK_UNWIND (frame, - local->op_ret, - local->op_errno, - local->stub->args.mkdir.loc.inode, &local->buf, - &local->preparent, &local->postparent); - call_stub_destroy (stub); - } - return 0; -} - -int32_t -ha_mkdir_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - char *stateino = NULL; - int child_count = 0, i = 0, cnt = 0; - call_frame_t *prev_frame = NULL; - xlator_t **children = NULL; - uint64_t tmp_stateino = 0; - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - prev_frame = cookie; - children = pvt->children; - - for (i = 0; i < child_count; i++) - if (prev_frame->this == children[i]) - break; - - if (op_ret == -1) { - local->op_errno = op_errno; - gf_log (this->name, GF_LOG_ERROR, "(path=%s) (op_ret=%d op_errno=%d)", local->stub->args.mkdir.loc.path, op_ret, op_errno); - } - - inode_ctx_get (local->stub->args.mkdir.loc.inode, - this, &tmp_stateino); - stateino = (char *)(long)tmp_stateino; - - if (op_ret == 0) { - stateino[i] = 1; - local->op_ret = 0; - local->first_success = 1; - local->buf = *buf; - local->preparent = *preparent; - local->postparent = *postparent; - } - cnt = --local->call_count; - for (i = local->active + 1; i < child_count; i++) { - if (local->state[i]) - break; - } - - if (cnt == 0 || i == child_count) { - call_stub_t *stub = local->stub; - GF_FREE (local->state); - stub = local->stub; - STACK_UNWIND (frame, local->op_ret, local->op_errno, - local->stub->args.mkdir.loc.inode, &local->buf, - &local->preparent, &local->postparent); - call_stub_destroy (stub); - return 0; - } - - local->active = i; - - if (local->first_success == 0) { - STACK_WIND (frame, - ha_mkdir_cbk, - children[i], - children[i]->fops->mkdir, - &local->stub->args.mkdir.loc, - local->stub->args.mkdir.mode); - return 0; - } - cnt = local->call_count; - - for (; i < child_count; i++) { - if (local->state[i]) { - STACK_WIND (frame, - ha_mkdir_lookup_cbk, - children[i], - children[i]->fops->lookup, - &local->stub->args.mkdir.loc, - 0); - if (--cnt == 0) - break; - } - } - return 0; -} - -int32_t -ha_mkdir (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - mode_t mode) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - int child_count = 0, i = 0; - char *stateino = NULL; - int32_t op_errno = EINVAL; - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - - frame->local = local = GF_CALLOC (1, sizeof (*local), - gf_ha_mt_ha_local_t); - if (!frame->local) { - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - op_errno = ENOMEM; - goto err; - } - - local->stub = fop_mkdir_stub (frame, ha_mkdir, loc, mode); - if (!local->stub) { - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - op_errno = ENOMEM; - goto err; - } - - local->op_ret = -1; - local->op_errno = ENOTCONN; - local->state = GF_CALLOC (1, child_count, gf_ha_mt_char); - if (!local->state) { - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - op_errno = ENOMEM; - goto err; - } - - memcpy (local->state, pvt->state, child_count); - local->active = -1; - - stateino = GF_CALLOC (1, child_count, gf_ha_mt_char); - if (!stateino) { - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - op_errno = ENOMEM; - goto err; - } - - inode_ctx_put (loc->inode, this, (uint64_t)(long)stateino); - for (i = 0; i < child_count; i++) { - if (local->state[i]) { - local->call_count++; - if (local->active == -1) - local->active = i; - } - } - - STACK_WIND (frame, - ha_mkdir_cbk, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->mkdir, - loc, mode); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno, NULL, NULL, NULL, NULL); - ha_local_wipe (local); - return 0; -} - - int32_t -ha_unlink_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *preparent, - struct iatt *postparent) -{ - int ret = -1; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - if (ret == 0) { - STACK_UNWIND (frame, op_ret, op_errno, preparent, postparent); - } - return 0; -} - -int32_t -ha_unlink (call_frame_t *frame, - xlator_t *this, - loc_t *loc) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_inode (frame, loc->inode); - - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_unlink_stub (frame, ha_unlink, loc); - if (!local->stub) { - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - op_errno = ENOMEM; - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_unlink_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->unlink, - loc); - return 0; -err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - return 0; -} - - int32_t -ha_rmdir_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *preparent, - struct iatt *postparent) -{ - int ret = -1; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno, - preparent, - postparent); - } - return 0; -} - -int32_t -ha_rmdir (call_frame_t *frame, - xlator_t *this, - loc_t *loc) -{ - ha_local_t *local = frame->local; - int op_errno = 0; - - op_errno = ha_alloc_init_inode (frame, loc->inode); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_rmdir_stub (frame, ha_rmdir, loc); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_rmdir_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->rmdir, - loc); - return 0; -err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - return 0; -} - - -int -ha_symlink_lookup_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - dict_t *dict, - struct iatt *postparent) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - char *stateino = NULL; - int child_count = 0, i = 0, cnt = 0; - call_frame_t *prev_frame = NULL; - xlator_t **children = NULL; - uint64_t tmp_stateino = 0; - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - prev_frame = cookie; - children = pvt->children; - - for (i = 0; i < child_count; i++) - if (prev_frame->this == children[i]) - break; - - if (op_ret == -1) { - gf_log (this->name, GF_LOG_ERROR, "(path=%s) (op_ret=%d op_errno=%d)", local->stub->args.symlink.loc.path, op_ret, op_errno); - } - inode_ctx_get (local->stub->args.symlink.loc.inode, - this, &tmp_stateino); - stateino = (char *)(long)tmp_stateino; - - if (op_ret == 0) - stateino[i] = 1; - - LOCK (&frame->lock); - cnt = --local->call_count; - UNLOCK (&frame->lock); - - if (cnt == 0) { - call_stub_t *stub = local->stub; - GF_FREE (local->state); - STACK_UNWIND (frame, - local->op_ret, - local->op_errno, - local->stub->args.symlink.loc.inode, &local->buf, - &local->preparent, &local->postparent); - call_stub_destroy (stub); - } - return 0; -} - -int32_t -ha_symlink_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - char *stateino = NULL; - int child_count = 0, i = 0, cnt = 0; - call_frame_t *prev_frame = NULL; - xlator_t **children = NULL; - uint64_t tmp_stateino = 0; - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - prev_frame = cookie; - children = pvt->children; - - for (i = 0; i < child_count; i++) - if (prev_frame->this == children[i]) - break; - - if (op_ret == -1) { - local->op_errno = op_errno; - gf_log (this->name, GF_LOG_ERROR, "(path=%s) (op_ret=%d op_errno=%d)", local->stub->args.symlink.loc.path, op_ret, op_errno); - } - inode_ctx_get (local->stub->args.symlink.loc.inode, - this, &tmp_stateino); - stateino = (char *)(long)tmp_stateino; - - if (op_ret == 0) { - stateino[i] = 1; - local->op_ret = 0; - local->first_success = 1; - local->buf = *buf; - local->preparent = *preparent; - local->postparent = *postparent; - } - cnt = --local->call_count; - for (i = local->active + 1; i < child_count; i++) { - if (local->state[i]) - break; - } - - if (cnt == 0 || i == child_count) { - call_stub_t *stub = local->stub; - GF_FREE (local->state); - stub = local->stub; - STACK_UNWIND (frame, local->op_ret, local->op_errno, - local->stub->args.symlink.loc.inode, &local->buf, - &local->preparent, &local->postparent); - call_stub_destroy (stub); - return 0; - } - - local->active = i; - - if (local->first_success == 0) { - STACK_WIND (frame, - ha_symlink_cbk, - children[i], - children[i]->fops->symlink, - local->stub->args.symlink.linkname, - &local->stub->args.symlink.loc); - return 0; - } - cnt = local->call_count; - - for (; i < child_count; i++) { - if (local->state[i]) { - STACK_WIND (frame, - ha_symlink_lookup_cbk, - children[i], - children[i]->fops->lookup, - &local->stub->args.symlink.loc, - 0); - if (--cnt == 0) - break; - } - } - return 0; -} - -int32_t -ha_symlink (call_frame_t *frame, - xlator_t *this, - const char *linkname, - loc_t *loc) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - int child_count = 0, i = 0; - char *stateino = NULL; - int32_t op_errno = EINVAL; - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - - frame->local = local = GF_CALLOC (1, sizeof (*local), - gf_ha_mt_ha_local_t); - if (!local) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - local->stub = fop_symlink_stub (frame, ha_symlink, linkname, loc); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - local->op_ret = -1; - local->op_errno = ENOTCONN; - local->state = GF_CALLOC (1, child_count, gf_ha_mt_char); - if (!local->state) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - memcpy (local->state, pvt->state, child_count); - local->active = -1; - - stateino = GF_CALLOC (1, child_count, gf_ha_mt_char); - if (!stateino) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - inode_ctx_put (loc->inode, this, (uint64_t)(long)stateino); - - for (i = 0; i < child_count; i++) { - if (local->state[i]) { - local->call_count++; - if (local->active == -1) { - local->active = i; - } - } - } - - STACK_WIND (frame, - ha_symlink_cbk, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->symlink, - linkname, loc); - return 0; -err: - local = frame->local; - frame->local = NULL; - STACK_UNWIND (frame, -1, op_errno, NULL, NULL, NULL, NULL); - ha_local_wipe (local); - return 0; -} - - int32_t -ha_rename_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *buf, - struct iatt *preoldparent, - struct iatt *postoldparent, - struct iatt *prenewparent, - struct iatt *postnewparent) -{ - int ret = -1; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - - if (ret == 0) { - STACK_UNWIND (frame, op_ret, op_errno, buf, preoldparent, - postoldparent, prenewparent, postnewparent); - } - return 0; -} - -int32_t -ha_rename (call_frame_t *frame, - xlator_t *this, - loc_t *oldloc, - loc_t *newloc) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_inode (frame, oldloc->inode); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_rename_stub (frame, ha_rename, oldloc, newloc); - if (!local->stub) { - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - op_errno = ENOMEM; - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_rename_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->rename, - oldloc, newloc); - return 0; -err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL); - return 0; -} - -int -ha_link_lookup_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - dict_t *dict, - struct iatt *postparent) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - char *stateino = NULL; - int child_count = 0, i = 0, cnt = 0; - call_frame_t *prev_frame = NULL; - xlator_t **children = NULL; - uint64_t tmp_stateino = 0; - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - prev_frame = cookie; - children = pvt->children; - - for (i = 0; i < child_count; i++) - if (prev_frame->this == children[i]) - break; - - if (op_ret == -1) { - gf_log (this->name, GF_LOG_ERROR, "(path=%s) (op_ret=%d op_errno=%d)", local->stub->args.link.newloc.path, op_ret, op_errno); - } - inode_ctx_get (local->stub->args.link.newloc.inode, - this, &tmp_stateino); - stateino = (char *)(long)tmp_stateino; - - if (op_ret == 0) - stateino[i] = 1; - - LOCK (&frame->lock); - cnt = --local->call_count; - UNLOCK (&frame->lock); - - if (cnt == 0) { - call_stub_t *stub = local->stub; - GF_FREE (local->state); - STACK_UNWIND (frame, - local->op_ret, - local->op_errno, - local->stub->args.link.oldloc.inode, &local->buf, - &local->preparent, &local->postparent); - call_stub_destroy (stub); - } - return 0; -} - -int32_t -ha_link_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - char *stateino = NULL; - int child_count = 0, i = 0, cnt = 0; - call_frame_t *prev_frame = NULL; - xlator_t **children = NULL; - uint64_t tmp_stateino = 0; - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - prev_frame = cookie; - children = pvt->children; - - for (i = 0; i < child_count; i++) - if (prev_frame->this == children[i]) - break; - - if (op_ret == -1) { - local->op_errno = op_errno; - gf_log (this->name, GF_LOG_ERROR, "(path=%s) (op_ret=%d op_errno=%d)", local->stub->args.link.newloc.path, op_ret, op_errno); - } - inode_ctx_get (local->stub->args.link.newloc.inode, - this, &tmp_stateino); - stateino = (char *)(long)tmp_stateino; - - if (op_ret == 0) { - stateino[i] = 1; - local->op_ret = 0; - local->first_success = 1; - local->buf = *buf; - local->preparent = *preparent; - local->postparent = *postparent; - } - cnt = --local->call_count; - for (i = local->active + 1; i < child_count; i++) { - if (local->state[i]) - break; - } - - if (cnt == 0 || i == child_count) { - call_stub_t *stub = local->stub; - GF_FREE (local->state); - stub = local->stub; - STACK_UNWIND (frame, local->op_ret, local->op_errno, - local->stub->args.link.oldloc.inode, &local->buf, - &local->preparent, &local->postparent); - call_stub_destroy (stub); - return 0; - } - - local->active = i; - - if (local->first_success == 0) { - STACK_WIND (frame, - ha_link_cbk, - children[i], - children[i]->fops->link, - &local->stub->args.link.oldloc, - &local->stub->args.link.newloc); - return 0; - } - cnt = local->call_count; - - for (; i < child_count; i++) { - if (local->state[i]) { - STACK_WIND (frame, - ha_link_lookup_cbk, - children[i], - children[i]->fops->lookup, - &local->stub->args.link.newloc, - 0); - if (--cnt == 0) - break; - } - } - return 0; -} - -int32_t -ha_link (call_frame_t *frame, - xlator_t *this, - loc_t *oldloc, - loc_t *newloc) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - int child_count = 0, i = 0; - char *stateino = NULL; - int32_t ret = 0, op_errno = 0; - uint64_t tmp_stateino = 0; - - ret = inode_ctx_get (newloc->inode, this, &tmp_stateino); - if (ret != 0) { - gf_log (this->name, GF_LOG_ERROR, "dict_ptr_error()"); - } - stateino = (char *)(long)tmp_stateino; - - if (stateino == NULL) { - gf_log (this->name, GF_LOG_ERROR, - "newloc->inode's ctx is NULL, returning EINVAL"); - STACK_UNWIND (frame, -1, EINVAL, oldloc->inode, NULL, NULL, - NULL); - return 0; - } - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - - frame->local = local = GF_CALLOC (1, sizeof (*local), - gf_ha_mt_ha_local_t); - if (!frame->local) { - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - op_errno = ENOMEM; - goto err; - } - - local->stub = fop_link_stub (frame, ha_link, oldloc, newloc); - if (!local->stub) { - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - op_errno = ENOMEM; - goto err; - } - - local->op_ret = -1; - local->op_errno = ENOTCONN; - local->state = GF_CALLOC (1, child_count, gf_ha_mt_char); - if (!local->state) { - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - op_errno = ENOMEM; - goto err; - } - - memcpy (local->state, pvt->state, child_count); - local->active = -1; - - for (i = 0; i < child_count; i++) { - if (local->state[i]) { - local->call_count++; - if (local->active == -1) - local->active = i; - } - } - - STACK_WIND (frame, - ha_link_cbk, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->link, - oldloc, - newloc); - return 0; -err: - local = frame->local; - frame->local = NULL; - STACK_UNWIND (frame, -1, op_errno, NULL, NULL, NULL, NULL); - return 0; -} - -int32_t -ha_create_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - fd_t *fd, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - int i, child_count = 0, cnt = 0, ret = 0; - char *stateino = NULL; - hafd_t *hafdp = NULL; - call_frame_t *prev_frame = NULL; - xlator_t **children = NULL; - uint64_t tmp_stateino = 0; - uint64_t tmp_hafdp = 0; - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - prev_frame = cookie; - children = pvt->children; - - ret = inode_ctx_get (local->stub->args.create.loc.inode, - this, &tmp_stateino); - stateino = (char *)(long)tmp_stateino; - - if (ret != 0) { - gf_log (this->name, GF_LOG_ERROR, "dict_to_ptr() error"); - /* FIXME: handle */ - } - ret = fd_ctx_get (local->stub->args.create.fd, this, &tmp_hafdp); - if (ret != 0) { - gf_log (this->name, GF_LOG_ERROR, "dict_to_ptr() error"); - /* FIXME: handle */ - } - hafdp = (hafd_t *)(long)tmp_hafdp; - - for (i = 0; i < child_count; i++) { - if (prev_frame->this == children[i]) - break; - } - - if (op_ret == -1) { - local->op_errno = op_errno; - gf_log (this->name, GF_LOG_ERROR, "(path=%s) (op_ret=%d op_errno=%d)", local->stub->args.create.loc.path, op_ret, op_errno); - } - if (op_ret != -1) { - stateino[i] = 1; - hafdp->fdstate[i] = 1; - if (local->op_ret == -1) { - local->op_ret = 0; - local->buf = *buf; - local->preparent = *preparent; - local->postparent = *postparent; - local->first_success = 1; - } - local->stub->args.create.flags &= (~O_EXCL); - } - LOCK (&frame->lock); - cnt = --local->call_count; - UNLOCK (&frame->lock); - - for (i = local->active + 1; i < child_count; i++) { - if (local->state[i]) - break; - } - - if (cnt == 0 || i == child_count) { - char *state = local->state; - call_stub_t *stub = local->stub; - STACK_UNWIND (frame, local->op_ret, local->op_errno, - stub->args.create.fd, - stub->args.create.loc.inode, &local->buf, - &local->preparent, &local->postparent); - GF_FREE (state); - call_stub_destroy (stub); - return 0; - } - local->active = i; - cnt = local->call_count; - for (; i < child_count; i++) { - if (local->state[i]) { - STACK_WIND (frame, - ha_create_cbk, - children[i], - children[i]->fops->create, - &local->stub->args.create.loc, - local->stub->args.create.flags, - local->stub->args.create.mode, - local->stub->args.create.fd); - if ((local->first_success == 0) || (cnt == 0)) - break; - } - } - return 0; -} - -int32_t -ha_create (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - int32_t flags, - mode_t mode, fd_t *fd) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - int i, child_count = 0; - char *stateino = NULL; - xlator_t **children = NULL; - hafd_t *hafdp = NULL; - int32_t op_errno = EINVAL; - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - children = pvt->children; - - if (local == NULL) { - frame->local = local = GF_CALLOC (1, sizeof (*local), - gf_ha_mt_ha_local_t); - if (!local) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - local->stub = fop_create_stub (frame, ha_create, loc, flags, mode, fd); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - local->state = GF_CALLOC (1, child_count, gf_ha_mt_char); - if (!local->state) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - local->active = -1; - local->op_ret = -1; - local->op_errno = ENOTCONN; - memcpy (local->state, pvt->state, child_count); - - for (i = 0; i < pvt->child_count; i++) { - if (local->state[i]) { - local->call_count++; - if (local->active == -1) - local->active = i; - } - } - /* FIXME handle active -1 */ - stateino = GF_CALLOC (1, child_count, gf_ha_mt_char); - if (!stateino) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - hafdp = GF_CALLOC (1, sizeof (*hafdp), gf_ha_mt_hafd_t); - if (!hafdp) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - hafdp->fdstate = GF_CALLOC (1, child_count, gf_ha_mt_char); - if (!hafdp->fdstate) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - hafdp->path = gf_strdup(loc->path); - if (!hafdp->path) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - LOCK_INIT (&hafdp->lock); - fd_ctx_set (fd, this, (uint64_t)(long)hafdp); - inode_ctx_put (loc->inode, this, (uint64_t)(long)stateino); - } - - STACK_WIND (frame, - ha_create_cbk, - children[local->active], - children[local->active]->fops->create, - loc, flags, mode, fd); - return 0; -err: - local = frame->local; - frame->local = NULL; - STACK_UNWIND (frame, -1, op_errno, NULL, NULL, NULL, NULL, NULL); - ha_local_wipe (local); - - if (stateino) { - GF_FREE (stateino); - stateino = NULL; - } - - if (hafdp) { - GF_FREE (hafdp->fdstate); - - GF_FREE (hafdp->path); - - GF_FREE (hafdp); - } - - return 0; -} - - int32_t -ha_open_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - fd_t *fd) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - xlator_t **children = NULL; - int i = 0, child_count = 0, callcnt = 0, ret = 0; - call_frame_t *prev_frame = NULL; - hafd_t *hafdp = NULL; - uint64_t tmp_hafdp = 0; - - local = frame->local; - pvt = this->private; - children = pvt->children; - child_count = pvt->child_count; - prev_frame = cookie; - - ret = fd_ctx_get (local->fd, this, &tmp_hafdp); - if (ret != 0) { - gf_log (this->name, GF_LOG_ERROR, "dict_ptr_error()"); - } - hafdp = (hafd_t *)(long)tmp_hafdp; - - for (i = 0; i < child_count; i++) - if (children[i] == prev_frame->this) - break; - LOCK (&frame->lock); - if (op_ret != -1) { - hafdp->fdstate[i] = 1; - local->op_ret = 0; - } - if (op_ret == -1 && op_errno != ENOTCONN) - local->op_errno = op_errno; - callcnt = --local->call_count; - UNLOCK (&frame->lock); - - if (callcnt == 0) { - STACK_UNWIND (frame, - local->op_ret, - local->op_errno, - local->fd); - } - return 0; -} - -int32_t -ha_open (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - int32_t flags, fd_t *fd, int wbflags) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - char *stateino = NULL; - xlator_t **children = NULL; - int cnt = 0, i, child_count = 0, ret = 0; - hafd_t *hafdp = NULL; - uint64_t tmp_stateino = 0; - int32_t op_errno = ENOMEM; - - local = frame->local; - pvt = this->private; - children = pvt->children; - child_count = pvt->child_count; - - - frame->local = local = GF_CALLOC (1, sizeof (*local), - gf_ha_mt_ha_local_t); - if (!local) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - local->op_ret = -1; - local->op_errno = ENOTCONN; - local->fd = fd; - - hafdp = GF_CALLOC (1, sizeof (*hafdp), gf_ha_mt_hafd_t); - if (!hafdp) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - hafdp->fdstate = GF_CALLOC (1, child_count, gf_ha_mt_char); - if (!hafdp->fdstate) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - hafdp->path = gf_strdup (loc->path); - if (!hafdp->path) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - hafdp->active = -1; - if (pvt->pref_subvol == -1) { - hafdp->active = fd->inode->ino % child_count; - } - - LOCK_INIT (&hafdp->lock); - fd_ctx_set (fd, this, (uint64_t)(long)hafdp); - ret = inode_ctx_get (loc->inode, this, &tmp_stateino); - stateino = (char *)(long)tmp_stateino; - - for (i = 0; i < child_count; i++) - if (stateino[i]) - cnt++; - local->call_count = cnt; - for (i = 0; i < child_count; i++) { - if (stateino[i]) { - STACK_WIND (frame, - ha_open_cbk, - children[i], - children[i]->fops->open, - loc, flags, fd, wbflags); - if (--cnt == 0) - break; - } - } - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno, fd); - if (hafdp) { - if (hafdp->fdstate) { - GF_FREE (hafdp->fdstate); - hafdp->fdstate = NULL; - } - - if (hafdp->path) { - GF_FREE (hafdp->path); - hafdp->path = NULL; - } - - GF_FREE (hafdp); - } - - ha_local_wipe (local); - return 0; -} - - int32_t -ha_readv_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iovec *vector, - int32_t count, - struct iatt *stbuf, - struct iobref *iobref) -{ - int ret = 0; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno, - vector, - count, - stbuf, - iobref); - } - return 0; -} - -int32_t -ha_readv (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - size_t size, - off_t offset) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_fd (frame, fd); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_readv_stub (frame, ha_readv, fd, size, offset); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_readv_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->readv, - fd, - size, - offset); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno, NULL, 0, NULL, NULL); - - ha_local_wipe (local); - return 0; -} - - int32_t -ha_writev_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *prebuf, - struct iatt *postbuf) -{ - int ret = 0; - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno, - prebuf, - postbuf); - } - return 0; -} - -int32_t -ha_writev (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - struct iovec *vector, - int32_t count, - off_t off, - struct iobref *iobref) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_fd (frame, fd); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_writev_stub (frame, ha_writev, fd, vector, count, off, - iobref); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_writev_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->writev, - fd, - vector, - count, - off, - iobref); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - ha_local_wipe (local); - return 0; -} - - int32_t -ha_flush_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - int ret = 0; - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno); - } - return 0; -} - -int32_t -ha_flush (call_frame_t *frame, - xlator_t *this, - fd_t *fd) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_fd (frame, fd); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_flush_stub (frame, ha_flush, fd); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_flush_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->flush, - fd); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno); - - ha_local_wipe (local); - return 0; -} - - - int32_t -ha_fsync_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *prebuf, - struct iatt *postbuf) -{ - int ret = 0; - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno); - } - return 0; -} - -int32_t -ha_fsync (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - int32_t flags) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_fd (frame, fd); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_fsync_stub (frame, ha_fsync, fd, flags); - if (!local->stub) { - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - op_errno = ENOMEM; - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_fsync_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->fsync, - fd, - flags); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno); - - ha_local_wipe (local); - return 0; -} - - int32_t -ha_fstat_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *buf) -{ - int ret = 0; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno, - buf); - } - return 0; -} - -int32_t -ha_fstat (call_frame_t *frame, - xlator_t *this, - fd_t *fd) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_fd (frame, fd); - - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_fstat_stub (frame, ha_fstat, fd); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_fstat_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->fstat, - fd); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno, NULL); - - ha_local_wipe (local); - return 0; -} - -int32_t -ha_opendir_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - fd_t *fd) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - xlator_t **children = NULL; - int i = 0, child_count = 0, callcnt = 0, ret = 0; - call_frame_t *prev_frame = NULL; - hafd_t *hafdp = NULL; - uint64_t tmp_hafdp = 0; - - local = frame->local; - pvt = this->private; - children = pvt->children; - child_count = pvt->child_count; - prev_frame = cookie; - - ret = fd_ctx_get (local->fd, this, &tmp_hafdp); - if (ret != 0) { - gf_log (this->name, GF_LOG_ERROR, "dict_ptr_error()"); - } - hafdp = (hafd_t *)(long)tmp_hafdp; - - for (i = 0; i < child_count; i++) - if (children[i] == prev_frame->this) - break; - LOCK (&frame->lock); - if (op_ret != -1) { - hafdp->fdstate[i] = 1; - local->op_ret = 0; - } - if (op_ret == -1 && op_errno != ENOTCONN) - local->op_errno = op_errno; - callcnt = --local->call_count; - UNLOCK (&frame->lock); - - if (callcnt == 0) { - STACK_UNWIND (frame, - local->op_ret, - local->op_errno, - local->fd); - } - return 0; -} - -int32_t -ha_opendir (call_frame_t *frame, - xlator_t *this, - loc_t *loc, fd_t *fd) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - char *stateino = NULL; - xlator_t **children = NULL; - int cnt = 0, i, child_count = 0, ret = 0; - hafd_t *hafdp = NULL; - uint64_t tmp_stateino = 0; - int32_t op_errno = EINVAL; - - local = frame->local; - pvt = this->private; - children = pvt->children; - child_count = pvt->child_count; - - frame->local = local = GF_CALLOC (1, sizeof (*local), - gf_ha_mt_ha_local_t); - if (!local) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - local->op_ret = -1; - local->op_errno = ENOTCONN; - local->fd = fd; - - hafdp = GF_CALLOC (1, sizeof (*hafdp), gf_ha_mt_hafd_t); - if (!hafdp) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - hafdp->fdstate = GF_CALLOC (1, child_count, gf_ha_mt_char); - if (!hafdp->fdstate) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - hafdp->path = gf_strdup (loc->path); - if (!hafdp->path) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - LOCK_INIT (&hafdp->lock); - fd_ctx_set (fd, this, (uint64_t)(long)hafdp); - ret = inode_ctx_get (loc->inode, this, &tmp_stateino); - stateino = (char *)(long)tmp_stateino; - - if (ret != 0) { - gf_log (this->name, GF_LOG_ERROR, "inode_ctx_get() error"); - } - for (i = 0; i < child_count; i++) - if (stateino[i]) - cnt++; - local->call_count = cnt; - for (i = 0; i < child_count; i++) { - if (stateino[i]) { - STACK_WIND (frame, - ha_opendir_cbk, - children[i], - children[i]->fops->opendir, - loc, fd); - if (--cnt == 0) - break; - } - } - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno, NULL); - ha_local_wipe (local); - if (hafdp) { - if (hafdp->fdstate) { - GF_FREE (hafdp->fdstate); - hafdp->fdstate = NULL; - } - - if (hafdp->path) { - GF_FREE (hafdp->path); - hafdp->path = NULL; - } - - GF_FREE (hafdp); - } - return 0; -} - - int32_t -ha_getdents_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - dir_entry_t *entries, - int32_t count) -{ - int ret = 0; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno, - entries, - count); - } - return 0; -} - -int32_t -ha_getdents (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - size_t size, - off_t offset, - int32_t flag) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_fd (frame, fd); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_getdents_stub (frame, ha_getdents, fd, size, offset, - flag); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_getdents_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->getdents, - fd, - size, - offset, - flag); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno, NULL, 0); - - ha_local_wipe (local); - return 0; -} - - int32_t -ha_setdents_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - int ret = 0; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno); - } - return 0; -} - -int32_t -ha_setdents (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - int32_t flags, - dir_entry_t *entries, - int32_t count) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_fd (frame, fd); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - - local->stub = fop_setdents_stub (frame, ha_setdents, fd, flags, entries, - count); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_setdents_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->setdents, - fd, - flags, - entries, - count); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno); - - ha_local_wipe (local); - return 0; -} - - int32_t -ha_fsyncdir_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - int ret = 0; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno); - } - return 0; -} - -int32_t -ha_fsyncdir (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - int32_t flags) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_fd (frame, fd); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_fsyncdir_stub (frame, ha_fsyncdir, fd, flags); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_fsyncdir_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->fsyncdir, - fd, - flags); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - ha_local_wipe (local); - return 0; -} - - - int32_t -ha_statfs_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct statvfs *buf) -{ - ha_local_t *local = NULL; - ha_private_t *priv = NULL; - - GF_ASSERT (this); - - local = frame->local; - priv = this->private; - GF_ASSERT (priv); - - if (-1 == op_ret) { - local->active = (local->active + 1) % priv->child_count; - local->tries--; - if (!local->tries) - goto out; - - STACK_WIND (frame, ha_statfs_cbk, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->statfs, - &local->loc); - return 0; - } - - out: - loc_wipe (&local->loc); - STACK_UNWIND (frame, op_ret, op_errno, buf); - return 0; -} - -int32_t -ha_statfs (call_frame_t *frame, - xlator_t *this, - loc_t *loc) -{ - ha_private_t *priv = NULL; - ha_local_t *local = NULL; - int op_errno = 0; - - /* The normal way of handling failover doesn't work here - * as loc->inode may be null in this case. - */ - local = GF_CALLOC (1, sizeof (*local), - gf_ha_mt_ha_local_t); - if (!local) { - op_errno = ENOMEM; - goto err; - } - priv = this->private; - frame->local = local; - local->active = priv->pref_subvol; - if (-1 == local->active) - local->active = 0; - local->tries = priv->child_count; - loc_copy (&local->loc, loc); - - STACK_WIND (frame, ha_statfs_cbk, HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->statfs, loc); - return 0; -err: - STACK_UNWIND (frame, -1, op_errno, NULL); - return 0; -} - - int32_t -ha_setxattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - int ret = -1; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno); - } - return 0; -} - -int32_t -ha_setxattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - dict_t *dict, - int32_t flags) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_inode (frame, loc->inode); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_setxattr_stub (frame, ha_setxattr, loc, dict, flags); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_setxattr_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->setxattr, - loc, - dict, - flags); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno); - - ha_local_wipe (local); - return 0; -} - - int32_t -ha_getxattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - dict_t *dict) -{ - int ret = -1; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno, - dict); - } - return 0; -} - -int32_t -ha_getxattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - const char *name) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_inode (frame, loc->inode); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_getxattr_stub (frame, ha_getxattr, loc, name); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_getxattr_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->getxattr, - loc, - name); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno, NULL); - - ha_local_wipe (local); - return 0; -} - -int32_t -ha_xattrop_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - dict_t *dict) -{ - int ret = -1; - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - if (ret == 0) { - STACK_UNWIND (frame, op_ret, op_errno, dict); - } - return 0; -} - - -int32_t -ha_xattrop (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - gf_xattrop_flags_t flags, - dict_t *dict) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_inode (frame, loc->inode); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - - local->stub = fop_xattrop_stub (frame, ha_xattrop, loc, flags, dict); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_xattrop_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->xattrop, - loc, - flags, - dict); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno, dict); - - ha_local_wipe (local); - return 0; -} - -int32_t -ha_fxattrop_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - dict_t *dict) -{ - int ret = -1; - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - if (ret == 0) - STACK_UNWIND (frame, op_ret, op_errno, dict); - return 0; -} - -int32_t -ha_fxattrop (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - gf_xattrop_flags_t flags, - dict_t *dict) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_fd (frame, fd); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_fxattrop_stub (frame, ha_fxattrop, fd, flags, dict); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_fxattrop_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->fxattrop, - fd, - flags, - dict); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno, dict); - - ha_local_wipe (local); - return 0; -} - - int32_t -ha_removexattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - int ret = -1; - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno); - } - return 0; -} - -int32_t -ha_removexattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - const char *name) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_inode (frame, loc->inode); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - - local->stub = fop_removexattr_stub (frame, ha_removexattr, loc, name); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_removexattr_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->removexattr, - loc, - name); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno); - - ha_local_wipe (local); - return 0; -} - -int32_t -ha_lk_setlk_unlck_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct gf_flock *lock) -{ - ha_local_t *local = NULL; - int cnt = 0; - call_stub_t *stub = NULL; - - local = frame->local; - - LOCK (&frame->lock); - cnt = --local->call_count; - if (op_ret == 0) - local->op_ret = 0; - UNLOCK (&frame->lock); - - if (cnt == 0) { - stub = local->stub; - GF_FREE (local->state); - if (stub->args.lk.lock.l_type == F_UNLCK) { - STACK_UNWIND (frame, local->op_ret, local->op_errno, &stub->args.lk.lock); - } else { - STACK_UNWIND (frame, -1, EIO, NULL); - } - call_stub_destroy (stub); - } - return 0; -} - -int32_t -ha_lk_setlk_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct gf_flock *lock) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - xlator_t **children = NULL; - int i = 0, cnt = 0, j = 0; - int child_count = 0; - call_frame_t *prev_frame = NULL; - char *state = NULL; - - local = frame->local; - pvt = this->private; - children = pvt->children; - child_count = pvt->child_count; - prev_frame = cookie; - state = local->state; - - if (op_ret == 0) - local->op_ret = 0; - - if ((op_ret == 0) || (op_ret == -1 && op_errno == ENOTCONN)) { - for (i = 0; i < child_count; i++) { - if (prev_frame->this == cookie) - break; - } - i++; - for (; i < child_count; i++) { - if (local->state[i]) - break; - } - if (i == child_count) { - call_stub_t *stub = local->stub; - GF_FREE (local->state); - STACK_UNWIND (frame, 0, op_errno, &stub->args.lk.lock); - call_stub_destroy (stub); - return 0; - } - STACK_WIND (frame, - ha_lk_setlk_cbk, - children[i], - children[i]->fops->lk, - local->stub->args.lk.fd, - local->stub->args.lk.cmd, - &local->stub->args.lk.lock); - return 0; - } else { - for (i = 0; i < child_count; i++) { - if (prev_frame->this == cookie) - break; - } - cnt = 0; - for (j = 0; j < i; j++) { - if (state[i]) - cnt++; - } - if (cnt) { - struct gf_flock lock; - lock = local->stub->args.lk.lock; - for (i = 0; i < child_count; i++) { - if (state[i]) { - STACK_WIND (frame, - ha_lk_setlk_unlck_cbk, - children[i], - children[i]->fops->lk, - local->stub->args.lk.fd, - local->stub->args.lk.cmd, - &lock); - if (--cnt == 0) - break; - } - } - return 0; - } else { - GF_FREE (local->state); - call_stub_destroy (local->stub); - STACK_UNWIND (frame, - op_ret, - op_errno, - lock); - return 0; - } - } -} - -int32_t -ha_lk_getlk_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct gf_flock *lock) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - fd_t *fd = NULL; - int child_count = 0, i = 0; - xlator_t **children = NULL; - call_frame_t *prev_frame = NULL; - - local = frame->local; - pvt = this->private; - fd = local->stub->args.lk.fd; - child_count = pvt->child_count; - children = pvt->children; - prev_frame = cookie; - - if (op_ret == 0) { - GF_FREE (local->state); - call_stub_destroy (local->stub); - STACK_UNWIND (frame, 0, 0, lock); - return 0; - } - - for (i = 0; i < child_count; i++) { - if (prev_frame->this == children[i]) - break; - } - - for (; i < child_count; i++) { - if (local->state[i]) - break; - } - - if (i == child_count) { - GF_FREE (local->state); - call_stub_destroy (local->stub); - STACK_UNWIND (frame, op_ret, op_errno, lock); - return 0; - } - - STACK_WIND (frame, - ha_lk_getlk_cbk, - children[i], - children[i]->fops->lk, - fd, - local->stub->args.lk.cmd, - &local->stub->args.lk.lock); - return 0; -} - -int32_t -ha_lk (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - int32_t cmd, - struct gf_flock *lock) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - hafd_t *hafdp = NULL; - char *state = NULL; - int child_count = 0, i = 0, cnt = 0, ret = 0; - xlator_t **children = NULL; - uint64_t tmp_hafdp = 0; - int32_t op_errno = EINVAL; - - local = frame->local; - pvt = this->private; - child_count = pvt->child_count; - children = pvt->children; - ret = fd_ctx_get (fd, this, &tmp_hafdp); - if (ret < 0) - gf_log (this->name, GF_LOG_ERROR, "fd_ctx_get failed"); - - if (local == NULL) { - local = frame->local = GF_CALLOC (1, sizeof (*local), - gf_ha_mt_ha_local_t); - if (!local) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - local->active = -1; - local->op_ret = -1; - local->op_errno = ENOTCONN; - } - hafdp = (hafd_t *)(long)tmp_hafdp; - - if (local->active == -1) { - op_errno = ENOTCONN; - goto err; - } - - local->stub = fop_lk_stub (frame, ha_lk, fd, cmd, lock); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - local->state = GF_CALLOC (1, child_count, gf_ha_mt_char); - if (!local->state) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - state = hafdp->fdstate; - LOCK (&hafdp->lock); - memcpy (local->state, state, child_count); - UNLOCK (&hafdp->lock); - if (cmd == F_GETLK) { - for (i = 0; i < child_count; i++) { - if (local->state[i]) - break; - } - STACK_WIND (frame, - ha_lk_getlk_cbk, - children[i], - children[i]->fops->lk, - fd, - cmd, - lock); - } else if (cmd == F_SETLK && lock->l_type == F_UNLCK) { - for (i = 0; i < child_count; i++) { - if (local->state[i]) - local->call_count++; - } - cnt = local->call_count; - for (i = 0; i < child_count; i++) { - if (local->state[i]) { - STACK_WIND (frame, - ha_lk_setlk_unlck_cbk, - children[i], - children[i]->fops->lk, - fd, cmd, lock); - if (--cnt == 0) - break; - } - } - } else { - for (i = 0; i < child_count; i++) { - if (local->state[i]) - break; - } - STACK_WIND (frame, - ha_lk_setlk_cbk, - children[i], - children[i]->fops->lk, - fd, - cmd, - lock); - } - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno, NULL); - - ha_local_wipe (local); - return 0; -} - - int32_t -ha_inode_entry_lk_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - int ret = -1; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno); - } - return 0; -} - -int32_t -ha_inodelk (call_frame_t *frame, - xlator_t *this, - const char *volume, - loc_t *loc, - int32_t cmd, - struct gf_flock *lock) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_inode (frame, loc->inode); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_inodelk_stub (frame, ha_inodelk, volume, - loc, cmd, lock); - STACK_WIND_COOKIE (frame, - ha_inode_entry_lk_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->inodelk, - volume, - loc, - cmd, - lock); - return 0; -err: - STACK_UNWIND (frame, -1, op_errno); - return 0; -} - -int32_t -ha_entrylk (call_frame_t *frame, - xlator_t *this, - const char *volume, - loc_t *loc, - const char *basename, - entrylk_cmd cmd, - entrylk_type type) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_inode (frame, loc->inode); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_entrylk_stub (frame, ha_entrylk, volume, - loc, basename, cmd, type); - STACK_WIND_COOKIE (frame, - ha_inode_entry_lk_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->entrylk, - volume, loc, basename, cmd, type); - return 0; -err: - STACK_UNWIND (frame, -1, op_errno); - return 0; -} - - int32_t -ha_checksum_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - uint8_t *file_checksum, - uint8_t *dir_checksum) -{ - int ret = -1; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - if (ret == 0) { - STACK_UNWIND (frame, - op_ret, - op_errno, - file_checksum, - dir_checksum); - } - return 0; -} - -int32_t -ha_checksum (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - int32_t flag) -{ - int op_errno = 0; - ha_local_t *local = NULL; - - op_errno = ha_alloc_init_inode (frame, loc->inode); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - local->stub = fop_checksum_stub (frame, ha_checksum, loc, flag); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - STACK_WIND_COOKIE (frame, - ha_checksum_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->checksum, - loc, - flag); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - ha_local_wipe (local); - return 0; -} - -int32_t -ha_common_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, gf_dirent_t *entries) -{ - int ret = 0; - - ret = ha_handle_cbk (frame, cookie, op_ret, op_errno); - if (ret == 0) - STACK_UNWIND (frame, op_ret, op_errno, entries); - return 0; -} - -int32_t -ha_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, - off_t off); - -int32_t -ha_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, - off_t off); -int32_t -ha_do_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, - off_t off, int whichop) -{ - ha_local_t *local = NULL; - int op_errno = 0; - - op_errno = ha_alloc_init_fd (frame, fd); - if (op_errno < 0) { - op_errno = -op_errno; - goto err; - } - local = frame->local; - if (whichop == GF_FOP_READDIR) - local->stub = fop_readdir_stub (frame, ha_readdir, fd, size, - off); - else - local->stub = fop_readdirp_stub (frame, ha_readdirp, fd, size, - off); - if (!local->stub) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - if (whichop == GF_FOP_READDIR) - STACK_WIND_COOKIE (frame, ha_common_readdir_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->readdir, - fd, size, off); - else - STACK_WIND_COOKIE (frame, ha_common_readdir_cbk, - (void *)(long)local->active, - HA_ACTIVE_CHILD(this, local), - HA_ACTIVE_CHILD(this, local)->fops->readdirp, - fd, size, off); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, ENOTCONN, NULL); - - ha_local_wipe (local); - return 0; -} - - -int32_t -ha_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, - off_t off) -{ - ha_do_readdir (frame, this, fd, size, off, GF_FOP_READDIR); - return 0; -} - -int32_t -ha_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, - off_t off) -{ - ha_do_readdir (frame, this, fd, size, off, GF_FOP_READDIRP); - return 0; -} - -/* Management operations */ - - int32_t -ha_stats_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct xlator_stats *stats) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - call_frame_t *prev_frame = NULL; - xlator_t **children = NULL; - int i = 0; - - local = frame->local; - pvt = this->private; - prev_frame = cookie; - children = pvt->children; - - if (op_ret == -1 && op_errno == ENOTCONN) { - for (i = 0; i < pvt->child_count; i++) { - if (prev_frame->this == children[i]) - break; - } - i++; - for (; i < pvt->child_count; i++) { - if (pvt->state[i]) - break; - } - - if (i == pvt->child_count) { - STACK_UNWIND (frame, -1, ENOTCONN, NULL); - return 0; - } - STACK_WIND (frame, - ha_stats_cbk, - children[i], - children[i]->mops->stats, - local->flags); - return 0; - } - - STACK_UNWIND (frame, - op_ret, - op_errno, - stats); - return 0; -} - -int32_t -ha_stats (call_frame_t *frame, - xlator_t *this, - int32_t flags) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - xlator_t **children = NULL; - int i = 0; - int32_t op_errno = EINVAL; - - local = frame->local = GF_CALLOC (1, sizeof (*local), - gf_ha_mt_ha_local_t); - if (!local) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - pvt = this->private; - children = pvt->children; - for (i = 0; i < pvt->child_count; i++) { - if (pvt->state[i]) - break; - } - - if (i == pvt->child_count) { - op_errno = ENOTCONN; - goto err; - } - local->flags = flags; - - STACK_WIND (frame, - ha_stats_cbk, - children[i], - children[i]->mops->stats, - flags); - return 0; - -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, ENOTCONN, NULL); - - ha_local_wipe (local); - return 0; - -} - - -int32_t -ha_getspec_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - char *spec_data) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - call_frame_t *prev_frame = NULL; - xlator_t **children = NULL; - int i = 0; - - local = frame->local; - pvt = this->private; - prev_frame = cookie; - children = pvt->children; - - if (op_ret == -1 && op_errno == ENOTCONN) { - for (i = 0; i < pvt->child_count; i++) { - if (prev_frame->this == children[i]) - break; - } - i++; - for (; i < pvt->child_count; i++) { - if (pvt->state[i]) - break; - } - - if (i == pvt->child_count) { - STACK_UNWIND (frame, -1, ENOTCONN, NULL); - return 0; - } - STACK_WIND (frame, - ha_getspec_cbk, - children[i], - children[i]->mops->getspec, - local->pattern, - local->flags); - return 0; - } - - STACK_UNWIND (frame, - op_ret, - op_errno, - spec_data); - return 0; -} - -int32_t -ha_getspec (call_frame_t *frame, - xlator_t *this, - const char *key, - int32_t flags) -{ - ha_local_t *local = NULL; - ha_private_t *pvt = NULL; - xlator_t **children = NULL; - int i = 0; - int32_t op_errno = EINVAL; - - local = frame->local = GF_CALLOC (1, sizeof (*local), - gf_ha_mt_ha_local_t); - if (!local) { - op_errno = ENOMEM; - gf_log (this->name, GF_LOG_ERROR, "out of memory"); - goto err; - } - - pvt = this->private; - children = pvt->children; - - for (i = 0; i < pvt->child_count; i++) { - if (pvt->state[i]) - break; - } - - if (i == pvt->child_count) { - op_errno = ENOTCONN; - goto err; - } - local->flags = flags; - local->pattern = (char *)key; - - STACK_WIND (frame, - ha_getspec_cbk, - children[i], - children[i]->mops->getspec, - key, flags); - return 0; -err: - local = frame->local; - frame->local = NULL; - - STACK_UNWIND (frame, -1, ENOTCONN, NULL); - - ha_local_wipe (local); - return 0; - -} - -int32_t -ha_closedir (xlator_t *this, - fd_t *fd) -{ - hafd_t *hafdp = NULL; - int op_errno = 0; - uint64_t tmp_hafdp = 0; - - op_errno = fd_ctx_del (fd, this, &tmp_hafdp); - if (op_errno != 0) { - gf_log (this->name, GF_LOG_ERROR, "fd_ctx_del() error"); - return 0; - } - hafdp = (hafd_t *)(long)tmp_hafdp; - - GF_FREE (hafdp->fdstate); - GF_FREE (hafdp->path); - LOCK_DESTROY (&hafdp->lock); - return 0; -} - -int32_t -ha_close (xlator_t *this, - fd_t *fd) -{ - hafd_t *hafdp = NULL; - int op_errno = 0; - uint64_t tmp_hafdp = 0; - - op_errno = fd_ctx_del (fd, this, &tmp_hafdp); - if (op_errno != 0) { - gf_log (this->name, GF_LOG_ERROR, "fd_ctx_del() error"); - return 0; - } - hafdp = (hafd_t *)(long)tmp_hafdp; - - GF_FREE (hafdp->fdstate); - GF_FREE (hafdp->path); - LOCK_DESTROY (&hafdp->lock); - return 0; -} - -/* notify */ -int32_t -notify (xlator_t *this, - int32_t event, - void *data, - ...) -{ - ha_private_t *pvt = NULL; - int32_t i = 0, upcnt = 0; - - pvt = this->private; - if (pvt == NULL) { - gf_log (this->name, GF_LOG_DEBUG, "got notify before init()"); - return 0; - } - - switch (event) - { - case GF_EVENT_CHILD_DOWN: - { - for (i = 0; i < pvt->child_count; i++) { - if (data == pvt->children[i]) - break; - } - gf_log (this->name, GF_LOG_DEBUG, "GF_EVENT_CHILD_DOWN from %s", pvt->children[i]->name); - pvt->state[i] = 0; - for (i = 0; i < pvt->child_count; i++) { - if (pvt->state[i]) - break; - } - if (i == pvt->child_count) { - default_notify (this, event, data); - } - } - break; - case GF_EVENT_CHILD_UP: - { - for (i = 0; i < pvt->child_count; i++) { - if (data == pvt->children[i]) - break; - } - - gf_log (this->name, GF_LOG_DEBUG, "GF_EVENT_CHILD_UP from %s", pvt->children[i]->name); - - pvt->state[i] = 1; - - for (i = 0; i < pvt->child_count; i++) { - if (pvt->state[i]) - upcnt++; - } - - if (upcnt == 1) { - default_notify (this, event, data); - } - } - break; - - default: - { - default_notify (this, event, data); - } - } - - return 0; -} - -int32_t -mem_acct_init (xlator_t *this) -{ - int ret = -1; - - if (!this) - return ret; - - ret = xlator_mem_acct_init (this, gf_ha_mt_end + 1); - - if (ret != 0) { - gf_log (this->name, GF_LOG_ERROR, "Memory accounting init" - "failed"); - return ret; - } - - return ret; -} - -int -init (xlator_t *this) -{ - ha_private_t *pvt = NULL; - xlator_list_t *trav = NULL; - int count = 0, ret = 0; - - - if (!this->children) { - gf_log (this->name,GF_LOG_ERROR, - "FATAL: ha should have one or more child defined"); - return -1; - } - - if (!this->parents) { - gf_log (this->name, GF_LOG_WARNING, - "dangling volume. check volfile "); - } - - trav = this->children; - pvt = GF_CALLOC (1, sizeof (ha_private_t), gf_ha_mt_ha_private_t); - - ret = dict_get_int32 (this->options, "preferred-subvolume", - &pvt->pref_subvol); - if (ret < 0) { - pvt->pref_subvol = -1; - } - - trav = this->children; - while (trav) { - count++; - trav = trav->next; - } - - pvt->child_count = count; - pvt->children = GF_CALLOC (count, sizeof (xlator_t*), - gf_ha_mt_xlator_t); - - trav = this->children; - count = 0; - while (trav) { - pvt->children[count] = trav->xlator; - count++; - trav = trav->next; - } - - pvt->state = GF_CALLOC (1, count, gf_ha_mt_char); - this->private = pvt; - return 0; -} - -void -fini (xlator_t *this) -{ - ha_private_t *priv = NULL; - priv = this->private; - GF_FREE (priv); - return; -} - - -struct xlator_fops fops = { - .lookup = ha_lookup, - .stat = ha_stat, - .readlink = ha_readlink, - .mknod = ha_mknod, - .mkdir = ha_mkdir, - .unlink = ha_unlink, - .rmdir = ha_rmdir, - .symlink = ha_symlink, - .rename = ha_rename, - .link = ha_link, - .truncate = ha_truncate, - .create = ha_create, - .open = ha_open, - .readv = ha_readv, - .writev = ha_writev, - .statfs = ha_statfs, - .flush = ha_flush, - .fsync = ha_fsync, - .setxattr = ha_setxattr, - .getxattr = ha_getxattr, - .removexattr = ha_removexattr, - .opendir = ha_opendir, - .readdir = ha_readdir, - .readdirp = ha_readdirp, - .getdents = ha_getdents, - .fsyncdir = ha_fsyncdir, - .access = ha_access, - .ftruncate = ha_ftruncate, - .fstat = ha_fstat, - .lk = ha_lk, - .setdents = ha_setdents, - .lookup_cbk = ha_lookup_cbk, - .checksum = ha_checksum, - .xattrop = ha_xattrop, - .fxattrop = ha_fxattrop, - .setattr = ha_setattr, - .fsetattr = ha_fsetattr, -}; - -struct xlator_cbks cbks = { - .release = ha_close, - .releasedir = ha_closedir, - .forget = ha_forget, -}; diff --git a/xlators/cluster/ha/src/ha.h b/xlators/cluster/ha/src/ha.h deleted file mode 100644 index e2ed7eaa68a..00000000000 --- a/xlators/cluster/ha/src/ha.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ -#ifndef __HA_H_ -#define __HA_H_ - -#include "ha-mem-types.h" - -typedef struct { - call_stub_t *stub; - int32_t op_ret, op_errno; - int32_t active, tries, revalidate, revalidate_error; - int32_t call_count; - char *state, *pattern; - dict_t *dict; - loc_t loc; - struct iatt buf; - struct iatt postparent; - struct iatt preparent; - fd_t *fd; - inode_t *inode; - int32_t flags; - int32_t first_success; -} ha_local_t; - -typedef struct { - char *state; - xlator_t **children; - int child_count, pref_subvol; -} ha_private_t; - -typedef struct { - char *fdstate; - char *path; - gf_lock_t lock; - int active; -} hafd_t; - -#define HA_ACTIVE_CHILD(this, local) (((ha_private_t *)this->private)->children[local->active]) - -extern int ha_alloc_init_fd (call_frame_t *frame, fd_t *fd); - -extern int ha_handle_cbk (call_frame_t *frame, void *cookie, int op_ret, int op_errno) ; - -extern int ha_alloc_init_inode (call_frame_t *frame, inode_t *inode); - -#endif diff --git a/xlators/cluster/map/Makefile.am b/xlators/cluster/map/Makefile.am deleted file mode 100644 index d471a3f9243..00000000000 --- a/xlators/cluster/map/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -SUBDIRS = src - -CLEANFILES = diff --git a/xlators/cluster/map/src/Makefile.am b/xlators/cluster/map/src/Makefile.am deleted file mode 100644 index 209cafa7c1b..00000000000 --- a/xlators/cluster/map/src/Makefile.am +++ /dev/null @@ -1,17 +0,0 @@ -xlator_LTLIBRARIES = map.la -xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/testing/cluster - -map_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS) - - -map_la_SOURCES = map.c map-helper.c -map_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la - -noinst_HEADERS = map.h - -AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src - -AM_CFLAGS = -Wall $(GF_CFLAGS) - -CLEANFILES = - diff --git a/xlators/cluster/map/src/map-helper.c b/xlators/cluster/map/src/map-helper.c deleted file mode 100644 index c5f828ae6d1..00000000000 --- a/xlators/cluster/map/src/map-helper.c +++ /dev/null @@ -1,343 +0,0 @@ -/* - Copyright (c) 2009-2012 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ -#include "xlator.h" -#include "map.h" - - -xlator_t * -map_subvol_next (xlator_t *this, xlator_t *prev) -{ - map_private_t *priv = NULL; - xlator_t *next = NULL; - int i = 0; - - priv = this->private; - - for (i = 0; i < priv->child_count; i++) { - if (priv->xlarray[i].xl == prev) { - if ((i + 1) < priv->child_count) - next = priv->xlarray[i + 1].xl; - break; - } - } - - return next; -} - -int -map_subvol_cnt (xlator_t *this, xlator_t *subvol) -{ - int i = 0; - int ret = -1; - map_private_t *priv = NULL; - - priv = this->private; - - for (i = 0; i < priv->child_count; i++) { - if (subvol == priv->xlarray[i].xl) { - ret = i; - break; - } - } - - return ret; -} - -int -map_itransform (xlator_t *this, xlator_t *subvol, uint64_t x, uint64_t *y_p) -{ - map_private_t *priv = NULL; - int cnt = 0; - int max = 0; - uint64_t y = 0; - - if (x == ((uint64_t) -1)) { - y = (uint64_t) -1; - goto out; - } - - priv = this->private; - - max = priv->child_count; - cnt = map_subvol_cnt (this, subvol); - - y = ((x * max) + cnt); - -out: - if (y_p) - *y_p = y; - - return 0; -} - - -int -map_deitransform (xlator_t *this, uint64_t y, xlator_t **subvol_p, - uint64_t *x_p) -{ - int cnt = 0; - int max = 0; - uint64_t x = 0; - xlator_t *subvol = 0; - map_private_t *priv = NULL; - - priv = this->private; - max = priv->child_count; - - cnt = y % max; - x = y / max; - - subvol = priv->xlarray[cnt].xl; - - if (subvol_p) - *subvol_p = subvol; - - if (x_p) - *x_p = x; - - return 0; -} - - -xlator_t * -get_mapping_subvol_from_path (xlator_t *this, const char *path) -{ - map_private_t *priv = NULL; - struct map_pattern *map = NULL; - - /* To make sure we handle '/' properly */ - if (!strcmp (path, "/")) - return NULL; - - priv = this->private; - - map = priv->map; - while (map) { - if (!strncmp (map->directory, path, map->dir_len)) { - if ((path[map->dir_len] == '/') || - (path[map->dir_len] == '\0')) { - return map->xl; - } - } - - map = map->next; - } - - return priv->default_xl; -} - -xlator_t * -get_mapping_subvol_from_ctx (xlator_t *this, inode_t *inode) -{ - uint64_t subvol = 0; - int ret = -1; - - ret = inode_ctx_get (inode, this, &subvol); - if (ret != 0) - return NULL; - - return (xlator_t *)(long)subvol; -} - -int -check_multiple_volume_entry (xlator_t *this, - xlator_t *subvol) -{ - int ret = -1; - int idx = 0; - map_private_t *priv = NULL; - - priv = this->private; - - for (idx = 0; idx < priv->child_count; idx++) { - if (priv->xlarray[idx].xl == subvol) { - if (priv->xlarray[idx].mapped) { - gf_log (this->name, GF_LOG_ERROR, - "subvolume '%s' is already mapped", - subvol->name); - goto out; - } - priv->xlarray[idx].mapped = 1; - ret = 0; - goto out; - } - } - - gf_log (this->name, GF_LOG_ERROR, - "subvolume '%s' is not found", - subvol->name); - - out: - return ret; -} - -int -verify_dir_and_assign_subvol (xlator_t *this, - const char *directory, - const char *subvol) -{ - int default_flag = 0; - int ret = -1; - int idx = 0; - map_private_t *priv = NULL; - xlator_list_t *trav = NULL; - struct map_pattern *tmp_map = NULL; - - priv = this->private; - - /* check if directory is valid, ie, its a top level dir, and - * not includes a '*' in it. - */ - if (!strcmp ("*", directory)) { - default_flag = 1; - } else { - if (directory[0] != '/') { - gf_log (this->name, GF_LOG_ERROR, - "map takes absolute path, starting with '/'. " - "not '%s'", directory); - goto out; - } - for (idx = 1; idx < (strlen (directory) - 1); idx++) { - if (directory[idx] == '/') { - gf_log (this->name, GF_LOG_ERROR, - "map takes only top level directory, " - "not '%s'", directory); - goto out; - } - } - } - - /* Assign proper subvolume */ - trav = this->children; - while (trav) { - if (!strcmp (trav->xlator->name, subvol)) { - - /* Check if there is another directory for - * same volume, if yes, return error. - */ - ret = check_multiple_volume_entry (this, - trav->xlator); - if (ret != 0) { - goto out; - } - - ret = 0; - if (default_flag) { - if (priv->default_xl) { - ret = -1; - gf_log (this->name, GF_LOG_ERROR, - "'*' specified more than " - "once. don't confuse me!!!"); - } - - priv->default_xl = trav->xlator; - goto out; - } - - tmp_map = GF_CALLOC (1, sizeof (struct map_pattern), - gf_map_mt_map_pattern); - tmp_map->xl = trav->xlator; - tmp_map->dir_len = strlen (directory); - - /* make sure that the top level directory starts - * with '/' and ends without '/' - */ - tmp_map->directory = gf_strdup (directory); - if (directory[tmp_map->dir_len - 1] == '/') { - tmp_map->dir_len--; - } - - if (!priv->map) - priv->map = tmp_map; - else { - struct map_pattern *trav_map = NULL; - trav_map = priv->map; - while (trav_map->next) - trav_map = trav_map->next; - trav_map->next = tmp_map; - } - - goto out; - } - - trav = trav->next; - } - - gf_log (this->name, GF_LOG_ERROR, - "map volume '%s' is not proper subvolume", subvol); - - out: - return ret; -} - -int -assign_default_subvol (xlator_t *this, const char *default_xl) -{ - int ret = -1; - map_private_t *priv = NULL; - xlator_list_t *trav = NULL; - - priv = this->private; - trav = this->children; - - while (trav) { - if (!strcmp (trav->xlator->name, default_xl)) { - ret = check_multiple_volume_entry (this, - trav->xlator); - if (ret != 0) { - goto out; - } - if (priv->default_xl) - gf_log (this->name, GF_LOG_WARNING, - "default-volume option provided, " - "overriding earlier '*' option"); - priv->default_xl = trav->xlator; - return 0; - } - trav = trav->next; - } - - gf_log (this->name, GF_LOG_ERROR, - "default-volume value is not an valid subvolume. check again"); - out: - return -1; -} - -void -verify_if_all_subvolumes_got_used (xlator_t *this) -{ - int idx = 0; - map_private_t *priv = NULL; - - priv = this->private; - - for (idx = 0; idx < priv->child_count; idx++) { - if (!priv->xlarray[idx].mapped) { - if (!priv->default_xl) { - priv->default_xl = priv->xlarray[idx].xl; - priv->xlarray[idx].mapped = 1; - } else { - gf_log (this->name, GF_LOG_WARNING, - "subvolume '%s' is not mapped to " - "any directory", - priv->xlarray[idx].xl->name); - } - } - } - - if (!priv->default_xl) { - gf_log (this->name, GF_LOG_WARNING, - "default subvolume not specified, filesystem " - "may not work properly. Check 'map' translator " - "documentation for more info"); - } - - return ; -} diff --git a/xlators/cluster/map/src/map-mem-types.h b/xlators/cluster/map/src/map-mem-types.h deleted file mode 100644 index 3e89f4736e4..00000000000 --- a/xlators/cluster/map/src/map-mem-types.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ - -#ifndef __MAP_MEM_TYPES_H__ -#define __MAP_MEM_TYPES_H__ - -#include "mem-types.h" - -enum gf_map_mem_types_ { - gf_map_mt_map_private_t = gf_common_mt_end + 1, - gf_map_mt_map_local_t, - gf_map_mt_map_xlator_array, - gf_map_mt_map_pattern, - gf_map_mt_end -}; -#endif - diff --git a/xlators/cluster/map/src/map.c b/xlators/cluster/map/src/map.c deleted file mode 100644 index fbb56dbc554..00000000000 --- a/xlators/cluster/map/src/map.c +++ /dev/null @@ -1,2561 +0,0 @@ -/* - Copyright (c) 2010-2012 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ -#include "xlator.h" -#include "map.h" - -/* TODO : - * -> support for 'get' 'put' API in through xattrs. - * -> define the behavior of notify() - */ - -static int32_t -map_stat_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *buf) - -{ - call_frame_t *prev = NULL; - prev = cookie; - - map_itransform (this, prev->this, buf->ia_ino, &buf->ia_ino); - - STACK_UNWIND (frame, op_ret, op_errno, buf); - return 0; -} - -static int32_t -map_setattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *statpre, - struct iatt *statpost) -{ - call_frame_t *prev = NULL; - prev = cookie; - - map_itransform (this, prev->this, statpre->ia_ino, &statpre->ia_ino); - map_itransform (this, prev->this, statpost->ia_ino, &statpost->ia_ino); - - STACK_UNWIND (frame, op_ret, op_errno, statpre, statpost); - return 0; -} - -static int32_t -map_fsetattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *statpre, - struct iatt *statpost) -{ - call_frame_t *prev = NULL; - prev = cookie; - - map_itransform (this, prev->this, statpre->ia_ino, &statpre->ia_ino); - map_itransform (this, prev->this, statpost->ia_ino, &statpost->ia_ino); - - STACK_UNWIND (frame, op_ret, op_errno, statpre, statpost); - return 0; -} - -static int32_t -map_truncate_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *prebuf, - struct iatt *postbuf) -{ - call_frame_t *prev = NULL; - prev = cookie; - - map_itransform (this, prev->this, postbuf->ia_ino, &postbuf->ia_ino); - - STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf); - return 0; -} - -static int32_t -map_ftruncate_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *prebuf, - struct iatt *postbuf) -{ - call_frame_t *prev = NULL; - prev = cookie; - - map_itransform (this, prev->this, postbuf->ia_ino, &postbuf->ia_ino); - - STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf); - return 0; -} - - -static int32_t -map_access_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - STACK_UNWIND (frame, op_ret, op_errno); - return 0; -} - -static int32_t -map_readlink_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - const char *path, - struct iatt *sbuf) -{ - STACK_UNWIND (frame, op_ret, op_errno, path, sbuf); - return 0; -} - -static int32_t -map_unlink_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *preparent, - struct iatt *postparent) -{ - STACK_UNWIND (frame, op_ret, op_errno, preparent, postparent); - return 0; -} - -static int32_t -map_rmdir_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *preparent, - struct iatt *postparent) -{ - STACK_UNWIND (frame, op_ret, op_errno, preparent, postparent); - return 0; -} - - -static int32_t -map_rename_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *buf, - struct iatt *preoldparent, - struct iatt *postoldparent, - struct iatt *prenewparent, - struct iatt *postnewparent) -{ - call_frame_t *prev = NULL; - prev = cookie; - - map_itransform (this, prev->this, buf->ia_ino, &buf->ia_ino); - - STACK_UNWIND (frame, op_ret, op_errno, buf); - return 0; -} - -static int32_t -map_link_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - call_frame_t *prev = NULL; - prev = cookie; - - map_itransform (this, prev->this, buf->ia_ino, &buf->ia_ino); - - STACK_UNWIND (frame, op_ret, op_errno, inode, buf); - return 0; -} - -static int32_t -map_open_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - fd_t *fd) -{ - STACK_UNWIND (frame, op_ret, op_errno, fd); - return 0; -} - -static int32_t -map_readv_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iovec *vector, - int32_t count, - struct iatt *stbuf, - struct iobref *iobref) -{ - call_frame_t *prev = NULL; - prev = cookie; - - map_itransform (this, prev->this, stbuf->ia_ino, &stbuf->ia_ino); - - STACK_UNWIND (frame, op_ret, op_errno, vector, count, stbuf, iobref); - return 0; -} - -static int32_t -map_writev_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *prebuf, - struct iatt *postbuf) -{ - call_frame_t *prev = NULL; - prev = cookie; - - map_itransform (this, prev->this, postbuf->ia_ino, &postbuf->ia_ino); - - STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf); - return 0; -} - -static int32_t -map_flush_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - STACK_UNWIND (frame, op_ret, op_errno); - return 0; -} - - -static int32_t -map_fsync_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *prebuf, - struct iatt *postbuf) -{ - STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf); - return 0; -} - - -static int32_t -map_fstat_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *buf) -{ - call_frame_t *prev = NULL; - prev = cookie; - - map_itransform (this, prev->this, buf->ia_ino, &buf->ia_ino); - - STACK_UNWIND (frame, op_ret, op_errno, buf); - return 0; -} - - -static int32_t -map_getdents_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - dir_entry_t *entries, - int32_t count) -{ - STACK_UNWIND (frame, op_ret, op_errno, entries, count); - return 0; -} - - -static int32_t -map_setdents_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - STACK_UNWIND (frame, op_ret, op_errno); - return 0; -} - -static int32_t -map_fsyncdir_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - STACK_UNWIND (frame, op_ret, op_errno); - return 0; -} - - -static int32_t -map_setxattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - STACK_UNWIND (frame, op_ret, op_errno); - return 0; -} - - -static int32_t -map_fsetxattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - STACK_UNWIND (frame, op_ret, op_errno); - return 0; -} - - -static int32_t -map_fgetxattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - dict_t *dict) -{ - STACK_UNWIND (frame, op_ret, op_errno, dict); - return 0; -} - - - -static int32_t -map_getxattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - dict_t *dict) -{ - STACK_UNWIND (frame, op_ret, op_errno, dict); - return 0; -} - -int32_t -map_xattrop_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - dict_t *dict) -{ - STACK_UNWIND (frame, op_ret, op_errno, dict); - return 0; -} - -int32_t -map_fxattrop_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - dict_t *dict) -{ - STACK_UNWIND (frame, op_ret, op_errno, dict); - return 0; -} - -static int32_t -map_removexattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - STACK_UNWIND (frame, op_ret, op_errno); - return 0; -} - - -static int32_t -map_lk_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct gf_flock *lock) -{ - STACK_UNWIND (frame, op_ret, op_errno, lock); - return 0; -} - - -static int32_t -map_inodelk_cbk (call_frame_t *frame, void *cookie, - xlator_t *this, int32_t op_ret, int32_t op_errno) - -{ - STACK_UNWIND (frame, op_ret, op_errno); - return 0; -} - - - -static int32_t -map_finodelk_cbk (call_frame_t *frame, void *cookie, - xlator_t *this, int32_t op_ret, int32_t op_errno) - -{ - STACK_UNWIND (frame, op_ret, op_errno); - return 0; -} - - -static int32_t -map_entrylk_cbk (call_frame_t *frame, void *cookie, - xlator_t *this, int32_t op_ret, int32_t op_errno) - -{ - STACK_UNWIND (frame, op_ret, op_errno); - return 0; -} - - -static int32_t -map_fentrylk_cbk (call_frame_t *frame, void *cookie, - xlator_t *this, int32_t op_ret, int32_t op_errno) - -{ - STACK_UNWIND (frame, op_ret, op_errno); - return 0; -} - -static int32_t -map_newentry_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - call_frame_t *prev = NULL; - prev = cookie; - - map_itransform (this, prev->this, buf->ia_ino, &buf->ia_ino); - - STACK_UNWIND (frame, op_ret, op_errno, inode, buf); - return 0; - -} - - -static int32_t -map_create_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - fd_t *fd, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - call_frame_t *prev = NULL; - prev = cookie; - - map_itransform (this, prev->this, buf->ia_ino, &buf->ia_ino); - - STACK_UNWIND (frame, op_ret, op_errno, fd, inode, buf); - return 0; -} - - -/* - * map_normalize_stats - - */ -void -map_normalize_stats (struct statvfs *buf, - unsigned long bsize, - unsigned long frsize) -{ - double factor; - - if (buf->f_bsize != bsize) { - factor = ((double) buf->f_bsize) / bsize; - buf->f_bsize = bsize; - buf->f_bfree = (fsblkcnt_t) (factor * buf->f_bfree); - buf->f_bavail = (fsblkcnt_t) (factor * buf->f_bavail); - } - - if (buf->f_frsize != frsize) { - factor = ((double) buf->f_frsize) / frsize; - buf->f_frsize = frsize; - buf->f_blocks = (fsblkcnt_t) (factor * buf->f_blocks); - } -} - - -int32_t -map_statfs_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct statvfs *stbuf) -{ - struct statvfs *dict_buf = NULL; - map_local_t *local = NULL; - int this_call_cnt = 0; - unsigned long bsize; - unsigned long frsize; - - local = frame->local; - - LOCK (&frame->lock); - { - this_call_cnt = --local->call_count; - - if (op_ret == -1) { - local->op_errno = op_errno; - goto unlock; - } - local->op_ret = 0; - - /* when a call is successful, add it to local->dict */ - dict_buf = &local->statvfs; - - if (dict_buf->f_bsize != 0) { - bsize = max (dict_buf->f_bsize, - stbuf->f_bsize); - - frsize = max (dict_buf->f_frsize, - stbuf->f_frsize); - map_normalize_stats(dict_buf, bsize, frsize); - map_normalize_stats(stbuf, bsize, frsize); - } else { - dict_buf->f_bsize = stbuf->f_bsize; - dict_buf->f_frsize = stbuf->f_frsize; - } - - dict_buf->f_blocks += stbuf->f_blocks; - dict_buf->f_bfree += stbuf->f_bfree; - dict_buf->f_bavail += stbuf->f_bavail; - dict_buf->f_files += stbuf->f_files; - dict_buf->f_ffree += stbuf->f_ffree; - dict_buf->f_favail += stbuf->f_favail; - dict_buf->f_fsid = stbuf->f_fsid; - dict_buf->f_flag = stbuf->f_flag; - dict_buf->f_namemax = stbuf->f_namemax; - } -unlock: - UNLOCK (&frame->lock); - - if (!this_call_cnt) { - STACK_UNWIND (frame, local->op_ret, local->op_errno, - &local->statvfs); - } - - return 0; -} - -int32_t -map_single_lookup_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - dict_t *dict, - struct iatt *postparent) -{ - call_frame_t *prev = NULL; - prev = cookie; - - map_itransform (this, prev->this, buf->ia_ino, &buf->ia_ino); - - STACK_UNWIND (frame, op_ret, op_errno, inode, buf, dict); - - return 0; -} - -int32_t -map_root_lookup_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - dict_t *dict, - struct iatt *postparent) -{ - int callcnt = 0; - map_local_t *local = NULL; - inode_t *tmp_inode = NULL; - dict_t *tmp_dict = NULL; - - local = frame->local; - LOCK (&frame->lock); - { - callcnt = --local->call_count; - if ((op_ret == 0) && (local->op_ret == -1)) { - local->op_ret = 0; - local->stbuf = *buf; - if (dict) - local->dict = dict_ref (dict); - local->inode = inode_ref (inode); - } - if (op_ret == -1) - local->op_errno = op_errno; - - } - UNLOCK (&frame->lock); - - if (!callcnt) { - tmp_dict = local->dict; - tmp_inode = local->inode; - - STACK_UNWIND (frame, local->op_ret, - local->op_errno, local->inode, - &local->stbuf, local->dict); - - inode_unref (local->inode); - if (tmp_dict) - dict_unref (tmp_dict); - } - - return 0; -} - - -int32_t -map_opendir_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - fd_t *fd) -{ - int callcnt = 0; - map_local_t *local = NULL; - fd_t *local_fd = NULL; - - local = frame->local; - LOCK (&frame->lock); - { - callcnt = --local->call_count; - - if (op_ret == -1) { - local->op_errno = op_errno; - goto unlock; - } - - local->op_ret = 0; - } - unlock: - UNLOCK (&frame->lock); - - if (!callcnt) { - local_fd = local->fd; - local->fd = NULL; - - STACK_UNWIND (frame, local->op_ret, - local->op_errno, local_fd); - - fd_unref (local_fd); - } - return 0; -} - -int32_t -map_single_readdir_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - gf_dirent_t *entries) -{ - call_frame_t *prev = NULL; - gf_dirent_t *orig_entry = NULL; - - prev = cookie; - - list_for_each_entry (orig_entry, &entries->list, list) { - map_itransform (this, prev->this, orig_entry->d_ino, - &orig_entry->d_ino); - } - STACK_UNWIND (frame, op_ret, op_errno, entries); - - return 0; -} - - -int32_t -map_single_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, gf_dirent_t *entries) -{ - call_frame_t *prev = NULL; - gf_dirent_t *orig_entry = NULL; - - prev = cookie; - - list_for_each_entry (orig_entry, &entries->list, list) { - map_itransform (this, prev->this, orig_entry->d_ino, - &orig_entry->d_ino); - orig_entry->d_stat.ia_ino = orig_entry->d_ino; - } - STACK_UNWIND (frame, op_ret, op_errno, entries); - return 0; -} - -int -map_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int op_ret, int op_errno, gf_dirent_t *orig_entries); - -int -map_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int op_ret, int op_errno, gf_dirent_t *orig_entries); - -int -map_generic_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int op_ret, int op_errno, gf_dirent_t *orig_entries, - int whichop) -{ - map_local_t *local = NULL; - gf_dirent_t entries; - gf_dirent_t *orig_entry = NULL; - gf_dirent_t *entry = NULL; - call_frame_t *prev = NULL; - xlator_t *subvol = NULL; - xlator_t *next_subvol = NULL; - off_t next_offset = 0; - int count = 0; - fd_t *local_fd = NULL; - - INIT_LIST_HEAD (&entries.list); - prev = cookie; - local = frame->local; - - if (op_ret < 0) - goto done; - - list_for_each_entry (orig_entry, &orig_entries->list, list) { - subvol = prev->this; - - entry = gf_dirent_for_name (orig_entry->d_name); - if (!entry) { - gf_log (this->name, GF_LOG_ERROR, - "memory allocation failed :("); - goto unwind; - } - - map_itransform (this, subvol, orig_entry->d_ino, - &entry->d_ino); - map_itransform (this, subvol, orig_entry->d_off, - &entry->d_off); - - if (whichop == GF_FOP_READDIRP) - entry->d_stat.ia_ino = entry->d_ino; - entry->d_type = orig_entry->d_type; - entry->d_len = orig_entry->d_len; - - list_add_tail (&entry->list, &entries.list); - count++; - next_offset = orig_entry->d_off; - } - - op_ret = count; - -done: - if (count == 0) { - /* non-zero next_offset means that - EOF is not yet hit on the current subvol - */ - if (next_offset == 0) { - next_subvol = map_subvol_next (this, prev->this); - } else { - next_subvol = prev->this; - } - - if (!next_subvol) { - goto unwind; - } - - if (whichop == GF_FOP_READDIR) - STACK_WIND (frame, map_readdir_cbk, next_subvol, - next_subvol->fops->readdir, local->fd, - local->size, 0); - else - STACK_WIND (frame, map_readdirp_cbk, next_subvol, - next_subvol->fops->readdirp, local->fd, - local->size, 0); - return 0; - } - -unwind: - if (op_ret < 0) - op_ret = 0; - - local_fd = local->fd; - local->fd = NULL; - - STACK_UNWIND (frame, op_ret, op_errno, &entries); - - fd_unref (local_fd); - - gf_dirent_free (&entries); - - return 0; -} - - -int -map_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int op_ret, int op_errno, gf_dirent_t *orig_entries) -{ - map_generic_readdir_cbk (frame, cookie, this, op_ret, op_errno, - orig_entries, GF_FOP_READDIR); - return 0; -} - - -int -map_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int op_ret, int op_errno, gf_dirent_t *orig_entries) -{ - map_generic_readdir_cbk (frame, cookie, this, op_ret, op_errno, - orig_entries, GF_FOP_READDIRP); - return 0; -} - - -/* Management operations */ - -static int32_t -map_checksum_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - uint8_t *file_checksum, - uint8_t *dir_checksum) -{ - STACK_UNWIND (frame, op_ret, op_errno, file_checksum, dir_checksum); - return 0; -} - - -/* Fops starts here */ - -int32_t -map_stat (call_frame_t *frame, - xlator_t *this, - loc_t *loc) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->inode, err); - VALIDATE_OR_GOTO (loc->path, err); - - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_stat_cbk, subvol, subvol->fops->stat, loc); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_setattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - struct iatt *stbuf, - int32_t valid) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - GF_VALIDATE_OR_GOTO ("map", this, err); - GF_VALIDATE_OR_GOTO (this->name, frame, err); - GF_VALIDATE_OR_GOTO (this->name, loc, err); - GF_VALIDATE_OR_GOTO (this->name, loc->inode, err); - GF_VALIDATE_OR_GOTO (this->name, loc->path, err); - GF_VALIDATE_OR_GOTO (this->name, stbuf, err); - - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_setattr_cbk, subvol, - subvol->fops->setattr, loc, stbuf, valid); - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_fsetattr (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - struct iatt *stbuf, - int32_t valid) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - GF_VALIDATE_OR_GOTO ("map", this, err); - GF_VALIDATE_OR_GOTO (this->name, frame, err); - GF_VALIDATE_OR_GOTO (this->name, fd, err); - GF_VALIDATE_OR_GOTO (this->name, stbuf, err); - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_fsetattr_cbk, subvol, - subvol->fops->fsetattr, fd, stbuf, valid); - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_truncate (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - off_t offset) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->inode, err); - VALIDATE_OR_GOTO (loc->path, err); - - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_truncate_cbk, subvol, - subvol->fops->truncate, loc, offset); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_ftruncate (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - off_t offset) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_ftruncate_cbk, subvol, - subvol->fops->ftruncate, fd, offset); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_access (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - int32_t mask) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->inode, err); - VALIDATE_OR_GOTO (loc->path, err); - - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_access_cbk, subvol, - subvol->fops->access, loc, mask); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - - -int32_t -map_readlink (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - size_t size) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->inode, err); - VALIDATE_OR_GOTO (loc->path, err); - - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_readlink_cbk, subvol, - subvol->fops->readlink, loc, size); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_unlink (call_frame_t *frame, - xlator_t *this, - loc_t *loc) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->inode, err); - VALIDATE_OR_GOTO (loc->path, err); - - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_unlink_cbk, subvol, subvol->fops->unlink, loc); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_rmdir (call_frame_t *frame, - xlator_t *this, - loc_t *loc) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->inode, err); - VALIDATE_OR_GOTO (loc->path, err); - - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_rmdir_cbk, subvol, subvol->fops->rmdir, loc); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - - -int32_t -map_rename (call_frame_t *frame, - xlator_t *this, - loc_t *oldloc, - loc_t *newloc) -{ - int32_t op_errno = 1; - xlator_t *old_subvol = NULL; - xlator_t *new_subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (oldloc, err); - VALIDATE_OR_GOTO (oldloc->inode, err); - VALIDATE_OR_GOTO (oldloc->path, err); - VALIDATE_OR_GOTO (newloc, err); - - old_subvol = get_mapping_subvol_from_ctx (this, oldloc->inode); - if (!old_subvol) { - op_errno = EINVAL; - goto err; - } - - if (newloc->path) { - new_subvol = get_mapping_subvol_from_path (this, newloc->path); - if (new_subvol && (new_subvol != old_subvol)) { - op_errno = EXDEV; - goto err; - } - } - - STACK_WIND (frame, map_rename_cbk, old_subvol, - old_subvol->fops->rename, oldloc, newloc); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - - -int32_t -map_link (call_frame_t *frame, - xlator_t *this, - loc_t *oldloc, - loc_t *newloc) -{ - int32_t op_errno = 1; - xlator_t *old_subvol = NULL; - xlator_t *new_subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (oldloc, err); - VALIDATE_OR_GOTO (oldloc->inode, err); - VALIDATE_OR_GOTO (oldloc->path, err); - VALIDATE_OR_GOTO (newloc, err); - - old_subvol = get_mapping_subvol_from_ctx (this, oldloc->inode); - if (!old_subvol) { - op_errno = EINVAL; - goto err; - } - - if (newloc->path) { - new_subvol = get_mapping_subvol_from_path (this, newloc->path); - if (new_subvol && (new_subvol != old_subvol)) { - op_errno = EXDEV; - goto err; - } - } - - STACK_WIND (frame, map_link_cbk, old_subvol, - old_subvol->fops->link, oldloc, newloc); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - - -int32_t -map_open (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - int32_t flags, fd_t *fd, int wbflags) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->inode, err); - VALIDATE_OR_GOTO (loc->path, err); - - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_open_cbk, subvol, - subvol->fops->open, loc, flags, fd, wbflags); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_readv (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - size_t size, - off_t offset) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_readv_cbk, subvol, - subvol->fops->readv, fd, size, offset); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, 0, NULL, NULL); - - return 0; -} - -int32_t -map_writev (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - struct iovec *vector, - int32_t count, - off_t off, - struct iobref *iobref) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_writev_cbk, subvol, - subvol->fops->writev, fd, vector, count, off, iobref); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_flush (call_frame_t *frame, - xlator_t *this, - fd_t *fd) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_flush_cbk, subvol, subvol->fops->flush, fd); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - - -int32_t -map_fsync (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - int32_t flags) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_fsync_cbk, subvol, - subvol->fops->fsync, fd, flags); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_fstat (call_frame_t *frame, - xlator_t *this, - fd_t *fd) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_fstat_cbk, subvol, subvol->fops->fstat, fd); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_getdents (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - size_t size, - off_t offset, - int32_t flag) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_getdents_cbk, subvol, - subvol->fops->getdents, fd, size, offset, flag); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_setdents (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - int32_t flags, - dir_entry_t *entries, - int32_t count) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_setdents_cbk, subvol, - subvol->fops->setdents, fd, flags, entries, count); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - - -int32_t -map_fsyncdir (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - int32_t flags) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_fsyncdir_cbk, subvol, - subvol->fops->fsyncdir, fd, flags); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - - - - -int32_t -map_setxattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - dict_t *dict, - int32_t flags) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->inode, err); - VALIDATE_OR_GOTO (loc->path, err); - - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_setxattr_cbk, subvol, - subvol->fops->setxattr, loc, dict, flags); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_getxattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - const char *name) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->inode, err); - VALIDATE_OR_GOTO (loc->path, err); - - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_getxattr_cbk, subvol, - subvol->fops->getxattr, loc, name); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - - -int32_t -map_fsetxattr (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - dict_t *dict, - int32_t flags) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_fsetxattr_cbk, subvol, - subvol->fops->fsetxattr, fd, dict, flags); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_fgetxattr (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - const char *name) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_fgetxattr_cbk, subvol, - subvol->fops->fgetxattr, fd, name); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - - -int32_t -map_xattrop (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - gf_xattrop_flags_t flags, - dict_t *dict) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->inode, err); - VALIDATE_OR_GOTO (loc->path, err); - - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_xattrop_cbk, subvol, - subvol->fops->xattrop, loc, flags, dict); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_fxattrop (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - gf_xattrop_flags_t flags, - dict_t *dict) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_fxattrop_cbk, subvol, - subvol->fops->fxattrop, fd, flags, dict); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_removexattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - const char *name) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->inode, err); - VALIDATE_OR_GOTO (loc->path, err); - - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_removexattr_cbk, subvol, - subvol->fops->removexattr, loc, name); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_lk (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - int32_t cmd, - struct gf_flock *lock) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_lk_cbk, subvol, - subvol->fops->lk, fd, cmd, lock); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - - -int32_t -map_inodelk (call_frame_t *frame, xlator_t *this, - const char *volume, loc_t *loc, int32_t cmd, struct gf_flock *lock) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->inode, err); - VALIDATE_OR_GOTO (loc->path, err); - - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_inodelk_cbk, subvol, - subvol->fops->inodelk, volume, loc, cmd, lock); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - - -int32_t -map_finodelk (call_frame_t *frame, xlator_t *this, - const char *volume, fd_t *fd, int32_t cmd, struct gf_flock *lock) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_finodelk_cbk, subvol, - subvol->fops->finodelk, volume, fd, cmd, lock); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_entrylk (call_frame_t *frame, xlator_t *this, - const char *volume, loc_t *loc, const char *basename, - entrylk_cmd cmd, entrylk_type type) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->inode, err); - VALIDATE_OR_GOTO (loc->path, err); - - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_entrylk_cbk, subvol, - subvol->fops->entrylk, volume, loc, basename, cmd, type); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_fentrylk (call_frame_t *frame, xlator_t *this, - const char *volume, fd_t *fd, const char *basename, - entrylk_cmd cmd, entrylk_type type) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_fentrylk_cbk, subvol, - subvol->fops->fentrylk, volume, fd, basename, cmd, type); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_checksum (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - int32_t flag) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->inode, err); - VALIDATE_OR_GOTO (loc->path, err); - - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - STACK_WIND (frame, map_checksum_cbk, subvol, - subvol->fops->checksum, loc, flag); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - - -int32_t -map_mknod (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - mode_t mode, - dev_t rdev) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->path, err); - VALIDATE_OR_GOTO (loc->inode, err); - - subvol = get_mapping_subvol_from_path (this, loc->path); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - op_errno = inode_ctx_put (loc->inode, this, (uint64_t)(long)subvol); - if (op_errno != 0) { - gf_log (this->name, GF_LOG_ERROR, - "%s: failed to set subvolume ptr in inode ctx", - loc->path); - } - - STACK_WIND (frame, map_newentry_cbk, subvol, - subvol->fops->mknod, loc, mode, rdev); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_mkdir (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - mode_t mode) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->path, err); - VALIDATE_OR_GOTO (loc->inode, err); - - subvol = get_mapping_subvol_from_path (this, loc->path); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - op_errno = inode_ctx_put (loc->inode, this, (uint64_t)(long)subvol); - if (op_errno != 0) { - gf_log (this->name, GF_LOG_ERROR, - "%s: failed to set subvolume ptr in inode ctx", - loc->path); - } - - STACK_WIND (frame, map_newentry_cbk, subvol, - subvol->fops->mkdir, loc, mode); - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - - -int32_t -map_symlink (call_frame_t *frame, - xlator_t *this, - const char *linkpath, - loc_t *loc) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->path, err); - VALIDATE_OR_GOTO (loc->inode, err); - - subvol = get_mapping_subvol_from_path (this, loc->path); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - op_errno = inode_ctx_put (loc->inode, this, (uint64_t)(long)subvol); - if (op_errno != 0) { - gf_log (this->name, GF_LOG_ERROR, - "%s: failed to set subvolume ptr in inode ctx", - loc->path); - } - - STACK_WIND (frame, map_newentry_cbk, subvol, - subvol->fops->symlink, linkpath, loc); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - -int32_t -map_create (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - int32_t flags, - mode_t mode, fd_t *fd) -{ - int32_t op_errno = 1; - xlator_t *subvol = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->path, err); - VALIDATE_OR_GOTO (loc->inode, err); - - subvol = get_mapping_subvol_from_path (this, loc->path); - if (!subvol) { - op_errno = EINVAL; - goto err; - } - - op_errno = inode_ctx_put (loc->inode, this, (uint64_t)(long)subvol); - if (op_errno != 0) { - gf_log (this->name, GF_LOG_ERROR, - "%s: failed to set subvolume ptr in inode ctx", - loc->path); - } - - STACK_WIND (frame, map_create_cbk, subvol, - subvol->fops->create, loc, flags, mode, fd); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - - -int32_t -map_lookup (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - dict_t *xattr_req) -{ - int32_t op_errno = EINVAL; - xlator_t *subvol = NULL; - map_local_t *local = NULL; - map_private_t *priv = NULL; - xlator_list_t *trav = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->path, err); - VALIDATE_OR_GOTO (loc->inode, err); - - priv = this->private; - - if (loc->inode->ino == 1) - goto root_inode; - - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - subvol = get_mapping_subvol_from_path (this, loc->path); - if (!subvol) { - goto err; - } - - op_errno = inode_ctx_put (loc->inode, this, - (uint64_t)(long)subvol); - if (op_errno != 0) { - gf_log (this->name, GF_LOG_ERROR, - "%s: failed to set subvolume in inode ctx", - loc->path); - } - } - - /* Just one callback */ - STACK_WIND (frame, map_single_lookup_cbk, subvol, - subvol->fops->lookup, loc, xattr_req); - - return 0; - - root_inode: - local = GF_CALLOC (1, sizeof (map_local_t), - gf_map_mt_map_local_t); - - frame->local = local; - local->call_count = priv->child_count; - local->op_ret = -1; - - trav = this->children; - while (trav) { - STACK_WIND (frame, map_root_lookup_cbk, trav->xlator, - trav->xlator->fops->lookup, loc, xattr_req); - trav = trav->next; - } - - return 0; - - err: - STACK_UNWIND (frame, -1, op_errno, NULL, NULL); - - return 0; -} - - -int32_t -map_statfs (call_frame_t *frame, - xlator_t *this, - loc_t *loc) -{ - int32_t op_errno = EINVAL; - xlator_t *subvol = NULL; - map_local_t *local = NULL; - map_private_t *priv = NULL; - xlator_list_t *trav = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (loc, err); - VALIDATE_OR_GOTO (loc->path, err); - VALIDATE_OR_GOTO (loc->inode, err); - - if (loc->inode->ino == 1) - goto root_inode; - subvol = get_mapping_subvol_from_ctx (this, loc->inode); - if (!subvol) { - goto err; - } - - /* Just one callback */ - STACK_WIND (frame, map_statfs_cbk, subvol, subvol->fops->statfs, loc); - - return 0; - - root_inode: - local = GF_CALLOC (1, sizeof (map_local_t), - gf_map_mt_map_local_t); - - priv = this->private; - frame->local = local; - local->call_count = priv->child_count; - local->op_ret = -1; - - trav = this->children; - while (trav) { - STACK_WIND (frame, map_statfs_cbk, trav->xlator, - trav->xlator->fops->statfs, loc); - trav = trav->next; - } - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL); - - return 0; -} - -int32_t -map_opendir (call_frame_t *frame, - xlator_t *this, - loc_t *loc, fd_t *fd) -{ - int32_t op_errno = EINVAL; - xlator_t *subvol = NULL; - map_local_t *local = NULL; - map_private_t *priv = NULL; - xlator_list_t *trav = NULL; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - if (loc->inode->ino == 1) - goto root_inode; - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - goto err; - } - - /* Just one callback */ - STACK_WIND (frame, map_opendir_cbk, subvol, - subvol->fops->opendir, loc, fd); - - return 0; - - root_inode: - local = GF_CALLOC (1, sizeof (map_local_t), - gf_map_mt_map_local_t); - - priv = this->private; - frame->local = local; - local->call_count = priv->child_count; - local->op_ret = -1; - local->fd = fd_ref (fd); - - trav = this->children; - while (trav) { - STACK_WIND (frame, map_opendir_cbk, trav->xlator, - trav->xlator->fops->opendir, loc, fd); - trav = trav->next; - } - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL); - - return 0; -} - - -int32_t -map_do_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, - off_t yoff, int whichop) -{ - int32_t op_errno = EINVAL; - xlator_t *subvol = NULL; - map_local_t *local = NULL; - map_private_t *priv = NULL; - xlator_t *xvol = NULL; - off_t xoff = 0; - - VALIDATE_OR_GOTO (frame, err); - VALIDATE_OR_GOTO (this, err); - VALIDATE_OR_GOTO (fd, err); - VALIDATE_OR_GOTO (fd->inode, err); - - if (fd->inode->ino == 1) - goto root_inode; - - subvol = get_mapping_subvol_from_ctx (this, fd->inode); - if (!subvol) { - goto err; - } - - /* Just one callback */ - if (whichop == GF_FOP_READDIR) - STACK_WIND (frame, map_single_readdir_cbk, subvol, - subvol->fops->readdir, fd, size, yoff); - else - STACK_WIND (frame, map_single_readdirp_cbk, subvol, - subvol->fops->readdirp, fd, size, yoff); - - return 0; - - root_inode: - /* readdir on '/' */ - local = GF_CALLOC (1, sizeof (map_local_t), - gf_map_mt_map_local_t); - if (!local) { - gf_log (this->name, GF_LOG_ERROR, - "memory allocation failed :("); - op_errno = ENOMEM; - goto err; - } - - priv = this->private; - frame->local = local; - local->op_errno = ENOENT; - local->op_ret = -1; - - local->fd = fd_ref (fd); - local->size = size; - - map_deitransform (this, yoff, &xvol, (uint64_t *)&xoff); - - if (whichop == GF_FOP_READDIR) - STACK_WIND (frame, map_readdir_cbk, xvol, xvol->fops->readdir, - fd, size, xoff); - else - STACK_WIND (frame, map_readdirp_cbk, xvol, xvol->fops->readdirp, - fd, size, xoff); - - return 0; - err: - STACK_UNWIND (frame, -1, op_errno, NULL); - - return 0; -} - - - -int32_t -map_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, - off_t yoff) -{ - map_do_readdir (frame, this, fd, size, yoff, GF_FOP_READDIR); - return 0; -} - -int32_t -map_readdirp (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, - off_t yoff) -{ - map_do_readdir (frame, this, fd, size, yoff, GF_FOP_READDIRP); - return 0; -} - - -void -fini (xlator_t *this) -{ - map_private_t *priv = NULL; - struct map_pattern *trav_map = NULL; - struct map_pattern *tmp_map = NULL; - - priv = this->private; - - if (priv) { - GF_FREE (priv->xlarray); - - trav_map = priv->map; - while (trav_map) { - tmp_map = trav_map; - trav_map = trav_map->next; - GF_FREE (tmp_map); - } - - GF_FREE(priv); - } - - return; -} - -int32_t -mem_acct_init (xlator_t *this) -{ - int ret = -1; - - if (!this) - return ret; - - ret = xlator_mem_acct_init (this, gf_map_mt_end + 1); - - if (ret != 0) { - gf_log (this->name, GF_LOG_ERROR, "Memory accounting init" - "failed"); - return ret; - } - - return ret; -} - -int -init (xlator_t *this) -{ - map_private_t *priv = NULL; - xlator_list_t *trav = NULL; - int count = 0; - int ret = -1; - char *pattern_string = NULL; - char *map_pair_str = NULL; - char *tmp_str = NULL; - char *tmp_str1 = NULL; - char *dup_map_pair = NULL; - char *dir_str = NULL; - char *subvol_str = NULL; - char *map_xl = NULL; - - - if (!this->children) { - gf_log (this->name,GF_LOG_ERROR, - "FATAL: map should have one or more child defined"); - return -1; - } - - if (!this->parents) { - gf_log (this->name, GF_LOG_WARNING, - "dangling volume. check volfile "); - } - - priv = GF_CALLOC (1, sizeof (map_private_t), - gf_map_mt_map_private_t); - this->private = priv; - - /* allocate xlator array */ - trav = this->children; - while (trav) { - count++; - trav = trav->next; - } - priv->xlarray = GF_CALLOC (1, sizeof (struct map_xlator_array) * count, - gf_map_mt_map_xlator_array); - priv->child_count = count; - - /* build xlator array */ - count = 0; - trav = this->children; - while (trav) { - priv->xlarray[count++].xl = trav->xlator; - trav = trav->next; - } - - /* map dir1:brick1;dir2:brick2;dir3:brick3;*:brick4 */ - ret = dict_get_str (this->options, "map-directory", &pattern_string); - if (ret != 0) { - gf_log (this->name, GF_LOG_ERROR, - "map.pattern not given, can't continue"); - goto err; - } - map_pair_str = strtok_r (pattern_string, ";", &tmp_str); - while (map_pair_str) { - dup_map_pair = gf_strdup (map_pair_str); - dir_str = strtok_r (dup_map_pair, ":", &tmp_str1); - if (!dir_str) { - gf_log (this->name, GF_LOG_ERROR, - "directory string invalid"); - goto err; - } - subvol_str = strtok_r (NULL, ":", &tmp_str1); - if (!subvol_str) { - gf_log (this->name, GF_LOG_ERROR, - "mapping subvolume string invalid"); - goto err; - } - ret = verify_dir_and_assign_subvol (this, - dir_str, - subvol_str); - if (ret != 0) { - gf_log (this->name, GF_LOG_ERROR, - "verification failed"); - goto err; - } - - GF_FREE (dup_map_pair); - - map_pair_str = strtok_r (NULL, ";", &tmp_str); - } - - /* default-volume brick4 */ - ret = dict_get_str (this->options, "default-volume", &map_xl); - if (ret == 0) { - ret = assign_default_subvol (this, map_xl); - if (ret != 0) { - gf_log (this->name, GF_LOG_ERROR, - "assigning default failed"); - goto err; - } - } - - verify_if_all_subvolumes_got_used (this); - - return 0; - err: - fini (this); - return -1; -} - - -struct xlator_fops fops = { - .lookup = map_lookup, - .mknod = map_mknod, - .create = map_create, - - .stat = map_stat, - .fstat = map_fstat, - .truncate = map_truncate, - .ftruncate = map_ftruncate, - .access = map_access, - .readlink = map_readlink, - .setxattr = map_setxattr, - .getxattr = map_getxattr, - .fsetxattr = map_fsetxattr, - .fgetxattr = map_fgetxattr, - .removexattr = map_removexattr, - .open = map_open, - .readv = map_readv, - .writev = map_writev, - .flush = map_flush, - .fsync = map_fsync, - .statfs = map_statfs, - .lk = map_lk, - .opendir = map_opendir, - .readdir = map_readdir, - .readdirp = map_readdirp, - .fsyncdir = map_fsyncdir, - .symlink = map_symlink, - .unlink = map_unlink, - .link = map_link, - .mkdir = map_mkdir, - .rmdir = map_rmdir, - .rename = map_rename, - .inodelk = map_inodelk, - .finodelk = map_finodelk, - .entrylk = map_entrylk, - .fentrylk = map_fentrylk, - .xattrop = map_xattrop, - .fxattrop = map_fxattrop, - .setdents = map_setdents, - .getdents = map_getdents, - .checksum = map_checksum, - .setattr = map_setattr, - .fsetattr = map_fsetattr, -}; - -struct xlator_cbks cbks = { -}; - -struct volume_options options[] = { - { .key = {"map-directory"}, - .type = GF_OPTION_TYPE_ANY - }, - { .key = {"default-volume"}, - .type = GF_OPTION_TYPE_XLATOR - }, - - { .key = {NULL} } -}; diff --git a/xlators/cluster/map/src/map.h b/xlators/cluster/map/src/map.h deleted file mode 100644 index 7703a543e28..00000000000 --- a/xlators/cluster/map/src/map.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ -#ifndef __MAP_H__ -#define __MAP_H__ - -#include "xlator.h" -#include "map-mem-types.h" - -struct map_pattern { - struct map_pattern *next; - xlator_t *xl; - char *directory; - int dir_len; -}; - -struct map_xlator_array { - xlator_t *xl; - int mapped; /* yes/no */ -}; - -typedef struct { - struct map_pattern *map; - xlator_t *default_xl; - struct map_xlator_array *xlarray; - int child_count; -} map_private_t; - -typedef struct { - int32_t op_ret; - int32_t op_errno; - int call_count; - struct statvfs statvfs; - struct iatt stbuf; - inode_t *inode; - dict_t *dict; - fd_t *fd; - - size_t size; -} map_local_t; - -xlator_t *map_subvol_next (xlator_t *this, xlator_t *prev); -int map_subvol_cnt (xlator_t *this, xlator_t *subvol); - -int map_itransform (xlator_t *this, xlator_t *subvol, - uint64_t x, uint64_t *y_p); -int map_deitransform (xlator_t *this, uint64_t y, - xlator_t **subvol_p, uint64_t *x_p); - - -xlator_t *get_mapping_subvol_from_path (xlator_t *this, const char *path); -xlator_t *get_mapping_subvol_from_ctx (xlator_t *this, inode_t *inode); - -int check_multiple_volume_entry (xlator_t *this, xlator_t *subvol); -int verify_dir_and_assign_subvol (xlator_t *this, - const char *directory, const char *subvol); -int assign_default_subvol (xlator_t *this, const char *default_xl); -void verify_if_all_subvolumes_got_used (xlator_t *this); - - -#endif /* __MAP_H__ */ diff --git a/xlators/features/Makefile.am b/xlators/features/Makefile.am index 68dc38bd132..3cc34c9379f 100644 --- a/xlators/features/Makefile.am +++ b/xlators/features/Makefile.am @@ -1,5 +1,5 @@ -SUBDIRS = locks quota read-only mac-compat quiesce marker index barrier \ - arbiter protect compress changelog changetimerecorder \ +SUBDIRS = locks quota read-only quiesce marker index barrier \ + arbiter compress changelog changetimerecorder \ gfid-access $(GLUPY_SUBDIR) upcall snapview-client snapview-server \ trash shard bit-rot leases diff --git a/xlators/features/filter/Makefile.am b/xlators/features/filter/Makefile.am deleted file mode 100644 index d471a3f9243..00000000000 --- a/xlators/features/filter/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -SUBDIRS = src - -CLEANFILES = diff --git a/xlators/features/filter/src/Makefile.am b/xlators/features/filter/src/Makefile.am deleted file mode 100644 index 5bdc711ae07..00000000000 --- a/xlators/features/filter/src/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -xlator_LTLIBRARIES = filter.la -xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/testing/features - -filter_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS) - -filter_la_SOURCES = filter.c -filter_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la - -noinst_HEADERS = filter-mem-types.h - -AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src - -AM_CFLAGS = -Wall $(GF_CFLAGS) - -CLEANFILES = - diff --git a/xlators/features/filter/src/filter-mem-types.h b/xlators/features/filter/src/filter-mem-types.h deleted file mode 100644 index 47a17249b8d..00000000000 --- a/xlators/features/filter/src/filter-mem-types.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ -#ifndef __FILTER_MEM_TYPES_H__ -#define __FILTER_MEM_TYPES_H__ - -#include "mem-types.h" - -enum gf_filter_mem_types_ { - gf_filter_mt_gf_filter = gf_common_mt_end + 1, - gf_filter_mt_end -}; -#endif - diff --git a/xlators/features/filter/src/filter.c b/xlators/features/filter/src/filter.c deleted file mode 100644 index 3fd7dc8c8fb..00000000000 --- a/xlators/features/filter/src/filter.c +++ /dev/null @@ -1,1729 +0,0 @@ -/* - Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> - -#include "glusterfs.h" -#include "logging.h" -#include "dict.h" -#include "xlator.h" -#include "filter-mem-types.h" - -#define GF_FILTER_NOBODY_UID 65534 -#define GF_FILTER_NOBODY_GID 65534 -#define GF_FILTER_ROOT_UID 0 -#define GF_FILTER_ROOT_GID 0 - -#define GF_MAXIMUM_FILTERING_ALLOWED 32 - -/* - option root-filtering on (off by default) - option translate-uid <uid-range=newuid,uid=newuid> - option translate-gid <gid-range=newgid,gid=newgid> - option read-only <yes|true> - option fixed-uid <uid> - option fixed-gid <gid> - option filter-uid <uid-range,uid> - option filter-gid <gid-range,gid> // not supported yet - -*/ - -struct gf_filter { - /* Flags */ - gf_boolean_t complete_read_only; - char fixed_uid_set; - char fixed_gid_set; - char partial_filter; - - /* Options */ - /* Mapping/Filtering/Translate whatever you want to call */ - int translate_num_uid_entries; - int translate_num_gid_entries; - int translate_input_uid[GF_MAXIMUM_FILTERING_ALLOWED][2]; - int translate_output_uid[GF_MAXIMUM_FILTERING_ALLOWED]; - int translate_input_gid[GF_MAXIMUM_FILTERING_ALLOWED][2]; - int translate_output_gid[GF_MAXIMUM_FILTERING_ALLOWED]; - - /* Fixed uid/gid */ - int fixed_uid; - int fixed_gid; - - /* Filter */ - int filter_num_uid_entries; - int filter_num_gid_entries; - int filter_input_uid[GF_MAXIMUM_FILTERING_ALLOWED][2]; - int filter_input_gid[GF_MAXIMUM_FILTERING_ALLOWED][2]; - -}; - -/* update_frame: The main logic of the whole translator. - Return values: - 0: no change - // TRANSLATE - 1: only uid changed - 2: only gid changed - 3: both uid/gid changed - // FILTER - 4: uid in filter range - 5: gid in filter range // not supported yet - 6: complete fs is readonly -*/ - -#define GF_FILTER_NO_CHANGE 0 -#define GF_FILTER_MAP_UID 1 -#define GF_FILTER_MAP_GID 2 -#define GF_FILTER_MAP_BOTH 3 -#define GF_FILTER_FILTER_UID 4 -#define GF_FILTER_FILTER_GID 5 -#define GF_FILTER_RO_FS 6 - -static int32_t -update_frame (call_frame_t *frame, - inode_t *inode, - struct gf_filter *filter) -{ - uid_t uid = 0; - int32_t idx = 0; - int32_t ret = 0; - int32_t dictret = 0; - uint64_t tmp_uid = 0; - - for (idx = 0; idx < filter->translate_num_uid_entries; idx++) { - if ((frame->root->uid >=filter->translate_input_uid[idx][0]) && - (frame->root->uid <=filter->translate_input_uid[idx][1])) { - dictret = inode_ctx_get (inode, frame->this, &tmp_uid); - uid = (uid_t)tmp_uid; - if (dictret == 0) { - if (frame->root->uid != uid) - ret = GF_FILTER_MAP_UID; - } else { - ret = GF_FILTER_MAP_UID; - } - break; - } - } - - for (idx = 0; idx < filter->translate_num_gid_entries; idx++) { - if ((frame->root->gid >=filter->translate_input_gid[idx][0]) && - (frame->root->gid <=filter->translate_input_gid[idx][1])) { - if (ret == GF_FILTER_NO_CHANGE) - ret = GF_FILTER_MAP_GID; - else - ret = GF_FILTER_MAP_BOTH; - break; - } - } - - - if (filter->complete_read_only) - return GF_FILTER_RO_FS; - - if (filter->partial_filter) { - dictret = inode_ctx_get (inode, frame->this, &tmp_uid); - uid = (uid_t)tmp_uid; - if (dictret != -1) { - for (idx = 0; idx < filter->filter_num_uid_entries; - idx++) { - if ((uid >=filter->filter_input_uid[idx][0]) && - (uid <=filter->filter_input_uid[idx][1])) { - return GF_FILTER_FILTER_UID; - } - } - } - } - - return ret; -} - -/* if 'root' don't change the uid/gid */ -static int32_t -update_stat (struct iatt *stbuf, - struct gf_filter *filter) -{ - int32_t idx = 0; - for (idx = 0; idx < filter->translate_num_uid_entries; idx++) { - if (stbuf->ia_uid == GF_FILTER_ROOT_UID) - continue; - if ((stbuf->ia_uid >= filter->translate_input_uid[idx][0]) && - (stbuf->ia_uid <= filter->translate_input_uid[idx][1])) { - stbuf->ia_uid = filter->translate_output_uid[idx]; - break; - } - } - - for (idx = 0; idx < filter->translate_num_gid_entries; idx++) { - if (stbuf->ia_gid == GF_FILTER_ROOT_GID) - continue; - if ((stbuf->ia_gid >= filter->translate_input_gid[idx][0]) && - (stbuf->ia_gid <= filter->translate_input_gid[idx][1])) { - stbuf->ia_gid = filter->translate_output_gid[idx]; - break; - } - } - - if (filter->fixed_uid_set) { - stbuf->ia_uid = filter->fixed_uid; - } - - if (filter->fixed_gid_set) { - stbuf->ia_gid = filter->fixed_gid; - } - - return 0; -} - -static int32_t -filter_lookup_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - dict_t *dict, - struct iatt *postparent) -{ - int ret = 0; - if (op_ret >= 0) { - update_stat (buf, this->private); - ret = inode_ctx_put (inode, this, (uint64_t)(long)buf->ia_uid); - if (ret == -1) { - gf_log (this->name, GF_LOG_ERROR, - "couldn't set context"); - } - - update_stat (postparent, this->private); - } - STACK_UNWIND (frame, op_ret, op_errno, inode, buf, dict, postparent); - return 0; -} - -int32_t -filter_lookup (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - dict_t *xattr_req) -{ - STACK_WIND (frame, - filter_lookup_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->lookup, - loc, - xattr_req); - return 0; -} - - -static int32_t -filter_stat_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *buf) -{ - if (op_ret >= 0) { - update_stat (buf, this->private); - } - STACK_UNWIND (frame, op_ret, op_errno, buf); - return 0; -} - -int32_t -filter_stat (call_frame_t *frame, - xlator_t *this, - loc_t *loc) -{ - STACK_WIND (frame, - filter_stat_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->stat, - loc); - return 0; -} - -static int32_t -filter_setattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *preop, - struct iatt *postop) -{ - if (op_ret >= 0) { - update_stat (preop, this->private); - update_stat (postop, this->private); - } - STACK_UNWIND (frame, op_ret, op_errno, preop, postop); - return 0; -} - -int32_t -filter_setattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - struct iatt *stbuf, - int32_t valid) -{ - int32_t ret = 0; - ret = update_frame (frame, loc->inode, this->private); - switch (ret) { - case GF_FILTER_MAP_UID: - if (loc->inode->st_mode & S_IWGRP) - break; - case GF_FILTER_MAP_BOTH: - if (loc->inode->st_mode & S_IWOTH) - break; - gf_log (this->name, GF_LOG_DEBUG, - "%s: returning permission denied", loc->path); - STACK_UNWIND (frame, -1, EPERM, NULL, NULL, NULL); - return 0; - - case GF_FILTER_FILTER_UID: - case GF_FILTER_FILTER_GID: - case GF_FILTER_RO_FS: - STACK_UNWIND (frame, -1, EROFS, NULL, NULL); - return 0; - default: - break; - } - - STACK_WIND (frame, - filter_setattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->setattr, - loc, - stbuf, valid); - return 0; -} - -static int32_t -filter_fsetattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *preop, - struct iatt *postop) -{ - if (op_ret >= 0) { - update_stat (preop, this->private); - update_stat (postop, this->private); - } - STACK_UNWIND (frame, - op_ret, - op_errno, - preop, postop); - return 0; -} - -int32_t -filter_fsetattr (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - struct iatt *stbuf, - int32_t valid) -{ - STACK_WIND (frame, - filter_fsetattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->fsetattr, - fd, - stbuf, valid); - return 0; -} - - -static int32_t -filter_truncate_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *prebuf, - struct iatt *postbuf) -{ - if (op_ret >= 0) { - update_stat (prebuf, this->private); - update_stat (postbuf, this->private); - } - STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf); - return 0; -} - -int32_t -filter_truncate (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - off_t offset) -{ - int32_t ret = 0; - ret = update_frame (frame, loc->inode, this->private); - switch (ret) { - case GF_FILTER_MAP_UID: - if (loc->inode->st_mode & S_IWGRP) - break; - case GF_FILTER_MAP_BOTH: - if (loc->inode->st_mode & S_IWOTH) - break; - gf_log (this->name, GF_LOG_DEBUG, "%s: returning permission denied", loc->path); - STACK_UNWIND (frame, -1, EPERM, NULL, NULL); - return 0; - - case GF_FILTER_FILTER_UID: - case GF_FILTER_FILTER_GID: - case GF_FILTER_RO_FS: - STACK_UNWIND (frame, -1, EROFS, NULL, NULL); - return 0; - } - - STACK_WIND (frame, - filter_truncate_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->truncate, - loc, - offset); - return 0; -} - -static int32_t -filter_ftruncate_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *prebuf, - struct iatt *postbuf) -{ - if (op_ret >= 0) { - update_stat (prebuf, this->private); - update_stat (postbuf, this->private); - } - STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf); - return 0; -} - -int32_t -filter_ftruncate (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - off_t offset) -{ - STACK_WIND (frame, - filter_ftruncate_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->ftruncate, - fd, - offset); - return 0; -} - - -static int32_t -filter_readlink_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - const char *path, - struct iatt *sbuf) -{ - if (op_ret >= 0) - update_stat (sbuf, this->private); - - STACK_UNWIND (frame, op_ret, op_errno, path, sbuf); - return 0; -} - -int32_t -filter_readlink (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - size_t size) -{ - int32_t ret = 0; - ret = update_frame (frame, loc->inode, this->private); - switch (ret) { - case GF_FILTER_MAP_UID: - if (loc->inode->st_mode & S_IRGRP) - break; - case GF_FILTER_MAP_BOTH: - if (loc->inode->st_mode & S_IROTH) - break; - gf_log (this->name, GF_LOG_DEBUG, "%s: returning permission denied", loc->path); - STACK_UNWIND (frame, -1, EPERM, NULL); - return 0; - } - STACK_WIND (frame, - filter_readlink_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->readlink, - loc, - size); - return 0; -} - - -static int32_t -filter_mknod_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - int ret = 0; - - if (op_ret >= 0) { - update_stat (buf, this->private); - ret = inode_ctx_put (inode, this, (uint64_t)(long)buf->ia_uid); - if (ret == -1) { - gf_log (this->name, GF_LOG_ERROR, - "couldn't set context"); - } - - update_stat (preparent, this->private); - update_stat (postparent, this->private); - } - STACK_UNWIND (frame, op_ret, op_errno, inode, buf, - preparent, postparent); - return 0; -} - -int32_t -filter_mknod (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - mode_t mode, - dev_t rdev) -{ - int ret = 0; - inode_t *parent = loc->parent; - ret = update_frame (frame, loc->inode, this->private); - switch (ret) { - case GF_FILTER_MAP_UID: - if (parent->st_mode & S_IWGRP) - break; - case GF_FILTER_MAP_BOTH: - if (parent->st_mode & S_IWOTH) - break; - gf_log (this->name, GF_LOG_DEBUG, "%s: returning permission denied", loc->path); - STACK_UNWIND (frame, -1, EPERM, NULL, NULL, - NULL, NULL); - return 0; - - case GF_FILTER_FILTER_UID: - case GF_FILTER_FILTER_GID: - case GF_FILTER_RO_FS: - STACK_UNWIND (frame, -1, EROFS, NULL, NULL, - NULL, NULL); - return 0; - } - STACK_WIND (frame, - filter_mknod_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->mknod, - loc, mode, rdev); - return 0; -} - -static int32_t -filter_mkdir_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - int ret = 0; - if (op_ret >= 0) { - update_stat (buf, this->private); - ret = inode_ctx_put (inode, this, (uint64_t)(long)buf->ia_uid); - if (ret == -1) { - gf_log (this->name, GF_LOG_ERROR, - "couldn't set context"); - } - - update_stat (preparent, this->private); - update_stat (postparent, this->private); - } - STACK_UNWIND (frame, op_ret, op_errno, inode, buf, - preparent, postparent); - return 0; -} - -int32_t -filter_mkdir (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - mode_t mode) -{ - int ret = 0; - inode_t *parent = loc->parent; - ret = update_frame (frame, loc->inode, this->private); - switch (ret) { - case GF_FILTER_MAP_UID: - if (parent->st_mode & S_IWGRP) - break; - case GF_FILTER_MAP_BOTH: - if (parent->st_mode & S_IWOTH) - break; - gf_log (this->name, GF_LOG_DEBUG, "%s: returning permission denied", loc->path); - STACK_UNWIND (frame, -1, EPERM, NULL, NULL, - NULL, NULL); - return 0; - - case GF_FILTER_FILTER_UID: - case GF_FILTER_FILTER_GID: - case GF_FILTER_RO_FS: - STACK_UNWIND (frame, -1, EROFS, NULL, NULL, - NULL, NULL); - return 0; - } - STACK_WIND (frame, - filter_mkdir_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->mkdir, - loc, mode); - return 0; -} - -static int32_t -filter_unlink_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *preparent, - struct iatt *postparent) -{ - if (op_ret >= 0) { - update_stat (preparent, this->private); - update_stat (postparent, this->private); - } - - STACK_UNWIND (frame, op_ret, op_errno, preparent, postparent); - return 0; -} - -int32_t -filter_unlink (call_frame_t *frame, - xlator_t *this, - loc_t *loc) -{ - int32_t ret = 0; - inode_t *parent = loc->parent; - if (!parent) - parent = inode_parent (loc->inode, 0, NULL); - ret = update_frame (frame, loc->inode, this->private); - switch (ret) { - case GF_FILTER_MAP_UID: - if (parent->st_mode & S_IWGRP) - break; - if (loc->inode->st_mode & S_IWGRP) - break; - case GF_FILTER_MAP_BOTH: - if (parent->st_mode & S_IWOTH) - break; - if (loc->inode->st_mode & S_IWOTH) - break; - gf_log (this->name, GF_LOG_DEBUG, "%s: returning permission denied", loc->path); - STACK_UNWIND (frame, -1, EPERM, NULL, NULL); - return 0; - case GF_FILTER_FILTER_UID: - case GF_FILTER_FILTER_GID: - case GF_FILTER_RO_FS: - STACK_UNWIND (frame, -1, EROFS, NULL, NULL); - return 0; - } - STACK_WIND (frame, - filter_unlink_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->unlink, - loc); - return 0; -} - -static int32_t -filter_rmdir_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *preparent, - struct iatt *postparent) -{ - if (op_ret >= 0) { - update_stat (preparent, this->private); - update_stat (postparent, this->private); - } - - STACK_UNWIND (frame, op_ret, op_errno, preparent, postparent); - return 0; -} - -int32_t -filter_rmdir (call_frame_t *frame, - xlator_t *this, - loc_t *loc) -{ - int32_t ret = 0; - inode_t *parent = loc->parent; - if (!parent) - parent = inode_parent (loc->inode, 0, NULL); - ret = update_frame (frame, loc->inode, this->private); - switch (ret) { - case GF_FILTER_MAP_UID: - if (parent->st_mode & S_IWGRP) - break; - if (loc->inode->st_mode & S_IWGRP) - break; - case GF_FILTER_MAP_BOTH: - if (parent->st_mode & S_IWOTH) - break; - if (loc->inode->st_mode & S_IWOTH) - break; - gf_log (this->name, GF_LOG_DEBUG, "%s: returning permission denied", loc->path); - STACK_UNWIND (frame, -1, EPERM, NULL, NULL); - return 0; - case GF_FILTER_FILTER_UID: - case GF_FILTER_FILTER_GID: - case GF_FILTER_RO_FS: - STACK_UNWIND (frame, -1, EROFS, NULL, NULL); - return 0; - } - STACK_WIND (frame, - filter_rmdir_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->rmdir, - loc); - return 0; -} - -static int32_t -filter_symlink_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - int ret = 0; - if (op_ret >= 0) { - update_stat (buf, this->private); - ret = inode_ctx_put (inode, this, (uint64_t)(long)buf->ia_uid); - if (ret == -1) { - gf_log (this->name, GF_LOG_ERROR, - "couldn't set context"); - } - - update_stat (preparent, this->private); - update_stat (postparent, this->private); - } - STACK_UNWIND (frame, op_ret, op_errno, inode, buf, - preparent, postparent); - return 0; -} - -int32_t -filter_symlink (call_frame_t *frame, - xlator_t *this, - const char *linkpath, - loc_t *loc) -{ - int ret = 0; - inode_t *parent = loc->parent; - ret = update_frame (frame, loc->inode, this->private); - switch (ret) { - case GF_FILTER_MAP_UID: - if (parent->st_mode & S_IWGRP) - break; - case GF_FILTER_MAP_BOTH: - if (parent->st_mode & S_IWOTH) - break; - gf_log (this->name, GF_LOG_DEBUG, "%s: returning permission denied", loc->path); - STACK_UNWIND (frame, -1, EPERM, NULL, NULL, - NULL, NULL); - return 0; - - case GF_FILTER_FILTER_UID: - case GF_FILTER_FILTER_GID: - case GF_FILTER_RO_FS: - STACK_UNWIND (frame, -1, EROFS, NULL, NULL, - NULL, NULL); - return 0; - } - STACK_WIND (frame, - filter_symlink_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->symlink, - linkpath, loc); - return 0; -} - - -static int32_t -filter_rename_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *buf, - struct iatt *preoldparent, - struct iatt *postoldparent, - struct iatt *prenewparent, - struct iatt *postnewparent) -{ - if (op_ret >= 0) { - update_stat (buf, this->private); - - update_stat (preoldparent, this->private); - update_stat (postoldparent, this->private); - - update_stat (prenewparent, this->private); - update_stat (postnewparent, this->private); - } - - STACK_UNWIND (frame, op_ret, op_errno, buf, - preoldparent, postoldparent, - prenewparent, postnewparent); - return 0; -} - -int32_t -filter_rename (call_frame_t *frame, - xlator_t *this, - loc_t *oldloc, - loc_t *newloc) -{ - int32_t ret = 0; - inode_t *parent = oldloc->parent; - if (!parent) - parent = inode_parent (oldloc->inode, 0, NULL); - ret = update_frame (frame, oldloc->inode, this->private); - switch (ret) { - case GF_FILTER_MAP_UID: - if (parent->st_mode & S_IWGRP) - break; - if (oldloc->inode->st_mode & S_IWGRP) - break; - case GF_FILTER_MAP_BOTH: - if (parent->st_mode & S_IWOTH) - break; - if (oldloc->inode->st_mode & S_IWOTH) - break; - gf_log (this->name, GF_LOG_DEBUG, - "%s -> %s: returning permission denied", oldloc->path, newloc->path); - STACK_UNWIND (frame, -1, EPERM, NULL, - NULL, NULL, - NULL, NULL); - return 0; - - case GF_FILTER_FILTER_UID: - case GF_FILTER_FILTER_GID: - case GF_FILTER_RO_FS: - STACK_UNWIND (frame, -1, EROFS, NULL, - NULL, NULL, - NULL, NULL); - return 0; - } - STACK_WIND (frame, - filter_rename_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->rename, - oldloc, newloc); - return 0; -} - - -static int32_t -filter_link_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - int ret = 0; - if (op_ret >= 0) { - update_stat (buf, this->private); - ret = inode_ctx_put (inode, this, (uint64_t)(long)buf->ia_uid); - if (ret == -1) { - gf_log (this->name, GF_LOG_ERROR, - "couldn't set context"); - } - - update_stat (preparent, this->private); - update_stat (postparent, this->private); - } - STACK_UNWIND (frame, op_ret, op_errno, inode, buf, - preparent, postparent); - return 0; -} - -int32_t -filter_link (call_frame_t *frame, - xlator_t *this, - loc_t *oldloc, - loc_t *newloc) -{ - int ret = 0; - ret = update_frame (frame, oldloc->inode, this->private); - switch (ret) { - case GF_FILTER_FILTER_UID: - case GF_FILTER_FILTER_GID: - case GF_FILTER_RO_FS: - STACK_UNWIND (frame, -1, EROFS, NULL, NULL, - NULL, NULL); - return 0; - } - STACK_WIND (frame, - filter_link_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->link, - oldloc, newloc); - return 0; -} - - -static int32_t -filter_create_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - fd_t *fd, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - int ret = 0; - if (op_ret >= 0) { - update_stat (buf, this->private); - ret = inode_ctx_put (inode, this, (uint64_t)(long)buf->ia_uid); - if (ret == -1) { - gf_log (this->name, GF_LOG_ERROR, - "couldn't set context"); - } - update_stat (preparent, this->private); - update_stat (postparent, this->private); - } - STACK_UNWIND (frame, op_ret, op_errno, fd, inode, buf, - preparent, postparent); - return 0; -} - -int32_t -filter_create (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - int32_t flags, - mode_t mode, fd_t *fd) -{ - int ret = 0; - inode_t *parent = loc->parent; - ret = update_frame (frame, loc->inode, this->private); - switch (ret) { - case GF_FILTER_MAP_UID: - if (parent->st_mode & S_IWGRP) - break; - case GF_FILTER_MAP_BOTH: - if (parent->st_mode & S_IWOTH) - break; - gf_log (this->name, GF_LOG_DEBUG, "%s: returning permission denied", loc->path); - STACK_UNWIND (frame, -1, EPERM, NULL, NULL, NULL, - NULL, NULL); - return 0; - - case GF_FILTER_FILTER_UID: - case GF_FILTER_FILTER_GID: - case GF_FILTER_RO_FS: - STACK_UNWIND (frame, -1, EROFS, NULL, NULL, NULL, - NULL, NULL); - return 0; - } - STACK_WIND (frame, filter_create_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->create, - loc, flags, mode, fd); - return 0; -} - -static int32_t -filter_open_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - fd_t *fd) -{ - STACK_UNWIND (frame, op_ret, op_errno, fd); - return 0; -} - -int32_t -filter_open (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - int32_t flags, - fd_t *fd, - int32_t wbflags) -{ - int32_t ret = 0; - ret = update_frame (frame, loc->inode, this->private); - switch (ret) { - case GF_FILTER_MAP_UID: - if (loc->inode->st_mode & S_IWGRP) - break; - if (!(((flags & O_ACCMODE) == O_WRONLY) - || ((flags & O_ACCMODE) == O_RDWR)) - && (loc->inode->st_mode & S_IRGRP)) - break; - case GF_FILTER_MAP_BOTH: - if (loc->inode->st_mode & S_IWOTH) - break; - if (!(((flags & O_ACCMODE) == O_WRONLY) - || ((flags & O_ACCMODE) == O_RDWR)) - && (loc->inode->st_mode & S_IROTH)) - break; - gf_log (this->name, GF_LOG_DEBUG, - "%s: returning permission denied (mode: 0%o, flag=0%o)", - loc->path, loc->inode->st_mode, flags); - STACK_UNWIND (frame, -1, EPERM, fd); - return 0; - case GF_FILTER_FILTER_UID: - case GF_FILTER_FILTER_GID: - case GF_FILTER_RO_FS: - if (!(((flags & O_ACCMODE) == O_WRONLY) - || ((flags & O_ACCMODE) == O_RDWR))) - break; - STACK_UNWIND (frame, -1, EROFS, NULL); - return 0; - - } - STACK_WIND (frame, - filter_open_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->open, - loc, flags, fd, wbflags); - return 0; -} - -static int32_t -filter_readv_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iovec *vector, - int32_t count, - struct iatt *stbuf, - struct iobref *iobref) -{ - if (op_ret >= 0) { - update_stat (stbuf, this->private); - } - STACK_UNWIND (frame, - op_ret, - op_errno, - vector, - count, - stbuf, - iobref); - return 0; -} - -int32_t -filter_readv (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - size_t size, - off_t offset) -{ - STACK_WIND (frame, - filter_readv_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->readv, - fd, - size, - offset); - return 0; -} - - -static int32_t -filter_writev_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *prebuf, - struct iatt *postbuf) -{ - if (op_ret >= 0) { - update_stat (prebuf, this->private); - update_stat (postbuf, this->private); - } - STACK_UNWIND (frame, - op_ret, - op_errno, - prebuf, - postbuf); - return 0; -} - -int32_t -filter_writev (call_frame_t *frame, - xlator_t *this, - fd_t *fd, - struct iovec *vector, - int32_t count, - off_t off, - struct iobref *iobref) -{ - int32_t ret = 0; - ret = update_frame (frame, fd->inode, this->private); - switch (ret) { - case GF_FILTER_FILTER_UID: - case GF_FILTER_FILTER_GID: - case GF_FILTER_RO_FS: - STACK_UNWIND (frame, -1, EROFS, NULL, NULL); - return 0; - } - - STACK_WIND (frame, - filter_writev_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->writev, - fd, - vector, - count, - off, - iobref); - return 0; -} - -static int32_t -filter_fstat_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *buf) -{ - if (op_ret >= 0) { - update_stat (buf, this->private); - } - STACK_UNWIND (frame, - op_ret, - op_errno, - buf); - return 0; -} - -int32_t -filter_fstat (call_frame_t *frame, - xlator_t *this, - fd_t *fd) -{ - STACK_WIND (frame, - filter_fstat_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->fstat, - fd); - return 0; -} - -static int32_t -filter_opendir_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - fd_t *fd) -{ - STACK_UNWIND (frame, - op_ret, - op_errno, - fd); - return 0; -} - -int32_t -filter_opendir (call_frame_t *frame, - xlator_t *this, - loc_t *loc, fd_t *fd) -{ - int32_t ret = 0; - ret = update_frame (frame, loc->inode, this->private); - switch (ret) { - case GF_FILTER_MAP_UID: - if (loc->inode->st_mode & S_IWGRP) - break; - if (loc->inode->st_mode & S_IRGRP) - break; - case GF_FILTER_MAP_BOTH: - if (loc->inode->st_mode & S_IWOTH) - break; - if (loc->inode->st_mode & S_IROTH) - break; - gf_log (this->name, GF_LOG_DEBUG, "%s: returning permission denied", loc->path); - STACK_UNWIND (frame, -1, EPERM, fd); - return 0; - } - STACK_WIND (frame, - filter_opendir_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->opendir, - loc, fd); - return 0; -} - - -static int32_t -filter_setxattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - STACK_UNWIND (frame, - op_ret, - op_errno); - return 0; -} - -int32_t -filter_setxattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - dict_t *dict, - int32_t flags) -{ - - int32_t ret = 0; - ret = update_frame (frame, loc->inode, this->private); - switch (ret) { - case GF_FILTER_MAP_UID: - if (loc->inode->st_mode & S_IWGRP) - break; - case GF_FILTER_MAP_BOTH: - if (loc->inode->st_mode & S_IWOTH) - break; - gf_log (this->name, GF_LOG_DEBUG, "%s: returning permission denied", loc->path); - STACK_UNWIND (frame, -1, EPERM); - return 0; - case GF_FILTER_FILTER_UID: - case GF_FILTER_FILTER_GID: - case GF_FILTER_RO_FS: - STACK_UNWIND (frame, -1, EROFS); - return 0; - } - - STACK_WIND (frame, - filter_setxattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->setxattr, - loc, - dict, - flags); - return 0; -} - -static int32_t -filter_getxattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - dict_t *dict) -{ - STACK_UNWIND (frame, - op_ret, - op_errno, - dict); - return 0; -} - -int32_t -filter_getxattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - const char *name) -{ - int32_t ret = 0; - ret = update_frame (frame, loc->inode, this->private); - switch (ret) { - case GF_FILTER_MAP_UID: - if (loc->inode->st_mode & S_IRGRP) - break; - case GF_FILTER_MAP_BOTH: - if (loc->inode->st_mode & S_IROTH) - break; - gf_log (this->name, GF_LOG_DEBUG, "%s: returning permission denied", loc->path); - STACK_UNWIND (frame, -1, EPERM, NULL); - return 0; - } - - STACK_WIND (frame, - filter_getxattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->getxattr, - loc, - name); - return 0; -} - -static int32_t -filter_removexattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - STACK_UNWIND (frame, op_ret, op_errno); - return 0; -} - -int32_t -filter_removexattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - const char *name) -{ - int32_t ret = 0; - ret = update_frame (frame, loc->inode, this->private); - switch (ret) { - case GF_FILTER_MAP_UID: - if (loc->inode->st_mode & S_IWGRP) - break; - case GF_FILTER_MAP_BOTH: - if (loc->inode->st_mode & S_IWOTH) - break; - gf_log (this->name, GF_LOG_DEBUG, "%s: returning permission denied", loc->path); - STACK_UNWIND (frame, -1, EPERM); - return 0; - case GF_FILTER_FILTER_UID: - case GF_FILTER_FILTER_GID: - case GF_FILTER_RO_FS: - STACK_UNWIND (frame, -1, EROFS); - return 0; - } - - STACK_WIND (frame, - filter_removexattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->removexattr, - loc, - name); - return 0; -} - -int32_t -mem_acct_init (xlator_t *this) -{ - int ret = -1; - - if (!this) - return ret; - - ret = xlator_mem_acct_init (this, gf_filter_mt_end + 1); - - if (ret != 0) { - gf_log (this->name, GF_LOG_ERROR, "Memory accounting init" - "failed"); - return ret; - } - - return ret; -} - -int32_t -init (xlator_t *this) -{ - char *value = NULL; - char *tmp_str = NULL; - char *tmp_str1 = NULL; - char *tmp_str2 = NULL; - char *dup_str = NULL; - char *input_value_str1 = NULL; - char *input_value_str2 = NULL; - char *output_value_str = NULL; - int32_t input_value = 0; - int32_t output_value = 0; - data_t *option_data = NULL; - struct gf_filter *filter = NULL; - gf_boolean_t tmp_bool = 0; - - if (!this->children || this->children->next) { - gf_log (this->name, - GF_LOG_ERROR, - "translator not configured with exactly one child"); - return -1; - } - - if (!this->parents) { - gf_log (this->name, GF_LOG_WARNING, - "dangling volume. check volfile "); - } - - filter = GF_CALLOC (sizeof (*filter), 1, gf_filter_mt_gf_filter); - ERR_ABORT (filter); - - if (dict_get (this->options, "read-only")) { - value = data_to_str (dict_get (this->options, "read-only")); - if (gf_string2boolean (value, &filter->complete_read_only) == -1) { - gf_log (this->name, GF_LOG_ERROR, - "wrong value provided for 'read-only'"); - return -1; - } - } - - if (dict_get (this->options, "root-squashing")) { - value = data_to_str (dict_get (this->options, "root-squashing")); - if (gf_string2boolean (value, &tmp_bool) == -1) { - gf_log (this->name, GF_LOG_ERROR, - "wrong value provided for 'root-squashing'"); - return -1; - } - if (tmp_bool) { - filter->translate_num_uid_entries = 1; - filter->translate_num_gid_entries = 1; - filter->translate_input_uid[0][0] = GF_FILTER_ROOT_UID; /* root */ - filter->translate_input_uid[0][1] = GF_FILTER_ROOT_UID; /* root */ - filter->translate_input_gid[0][0] = GF_FILTER_ROOT_GID; /* root */ - filter->translate_input_gid[0][1] = GF_FILTER_ROOT_GID; /* root */ - filter->translate_output_uid[0] = GF_FILTER_NOBODY_UID; - filter->translate_output_gid[0] = GF_FILTER_NOBODY_GID; - } - } - - if (dict_get (this->options, "translate-uid")) { - option_data = dict_get (this->options, "translate-uid"); - value = strtok_r (option_data->data, ",", &tmp_str); - while (value) { - dup_str = gf_strdup (value); - input_value_str1 = strtok_r (dup_str, "=", &tmp_str1); - if (input_value_str1) { - /* Check for n-m */ - char *temp_string = gf_strdup (input_value_str1); - input_value_str2 = strtok_r (temp_string, "-", &tmp_str2); - if (gf_string2int (input_value_str2, &input_value) != 0) { - gf_log (this->name, GF_LOG_ERROR, - "invalid number format \"%s\"", - input_value_str2); - return -1; - } - filter->translate_input_uid[filter->translate_num_uid_entries][0] = input_value; - input_value_str2 = strtok_r (NULL, "-", &tmp_str2); - if (input_value_str2) { - if (gf_string2int (input_value_str2, &input_value) != 0) { - gf_log (this->name, GF_LOG_ERROR, - "invalid number format \"%s\"", - input_value_str2); - return -1; - } - } - filter->translate_input_uid[filter->translate_num_uid_entries][1] = input_value; - GF_FREE (temp_string); - output_value_str = strtok_r (NULL, "=", &tmp_str1); - if (output_value_str) { - if (gf_string2int (output_value_str, &output_value) != 0) { - gf_log (this->name, GF_LOG_ERROR, - "invalid number format \"%s\"", - output_value_str); - return -1; - } - } else { - gf_log (this->name, GF_LOG_ERROR, - "mapping string not valid"); - return -1; - } - } else { - gf_log (this->name, GF_LOG_ERROR, - "mapping string not valid"); - return -1; - } - filter->translate_output_uid[filter->translate_num_uid_entries] = output_value; - gf_log (this->name, - GF_LOG_DEBUG, - "pair %d: input uid '%d' will be changed to uid '%d'", - filter->translate_num_uid_entries, input_value, output_value); - - filter->translate_num_uid_entries++; - if (filter->translate_num_uid_entries == GF_MAXIMUM_FILTERING_ALLOWED) - break; - value = strtok_r (NULL, ",", &tmp_str); - GF_FREE (dup_str); - } - } - - tmp_str1 = NULL; - tmp_str2 = NULL; - tmp_str = NULL; - - if (dict_get (this->options, "translate-gid")) { - option_data = dict_get (this->options, "translate-gid"); - value = strtok_r (option_data->data, ",", &tmp_str); - while (value) { - dup_str = gf_strdup (value); - input_value_str1 = strtok_r (dup_str, "=", &tmp_str1); - if (input_value_str1) { - /* Check for n-m */ - char *temp_string = gf_strdup (input_value_str1); - input_value_str2 = strtok_r (temp_string, "-", &tmp_str2); - if (gf_string2int (input_value_str2, &input_value) != 0) { - gf_log (this->name, GF_LOG_ERROR, - "invalid number format \"%s\"", - input_value_str2); - return -1; - } - filter->translate_input_gid[filter->translate_num_gid_entries][0] = input_value; - input_value_str2 = strtok_r (NULL, "-", &tmp_str2); - if (input_value_str2) { - if (gf_string2int (input_value_str2, &input_value) != 0) { - gf_log (this->name, GF_LOG_ERROR, - "invalid number format \"%s\"", - input_value_str2); - return -1; - } - } - filter->translate_input_gid[filter->translate_num_gid_entries][1] = input_value; - GF_FREE (temp_string); - output_value_str = strtok_r (NULL, "=", &tmp_str1); - if (output_value_str) { - if (gf_string2int (output_value_str, &output_value) != 0) { - gf_log (this->name, GF_LOG_ERROR, - "invalid number format \"%s\"", - output_value_str); - return -1; - } - } else { - gf_log (this->name, GF_LOG_ERROR, - "translate-gid value not valid"); - return -1; - } - } else { - gf_log (this->name, GF_LOG_ERROR, - "translate-gid value not valid"); - return -1; - } - - filter->translate_output_gid[filter->translate_num_gid_entries] = output_value; - - gf_log (this->name, GF_LOG_DEBUG, - "pair %d: input gid '%d' will be changed to gid '%d'", - filter->translate_num_gid_entries, input_value, output_value); - - filter->translate_num_gid_entries++; - if (filter->translate_num_gid_entries == GF_MAXIMUM_FILTERING_ALLOWED) - break; - value = strtok_r (NULL, ",", &tmp_str); - GF_FREE (dup_str); - } - } - - tmp_str = NULL; - tmp_str1 = NULL; - - if (dict_get (this->options, "filter-uid")) { - option_data = dict_get (this->options, "filter-uid"); - value = strtok_r (option_data->data, ",", &tmp_str); - while (value) { - dup_str = gf_strdup (value); - /* Check for n-m */ - input_value_str1 = strtok_r (dup_str, "-", &tmp_str1); - if (gf_string2int (input_value_str1, &input_value) != 0) { - gf_log (this->name, GF_LOG_ERROR, - "invalid number format \"%s\"", - input_value_str1); - return -1; - } - filter->filter_input_uid[filter->filter_num_uid_entries][0] = input_value; - input_value_str1 = strtok_r (NULL, "-", &tmp_str1); - if (input_value_str1) { - if (gf_string2int (input_value_str1, &input_value) != 0) { - gf_log (this->name, GF_LOG_ERROR, - "invalid number format \"%s\"", - input_value_str1); - return -1; - } - } - filter->filter_input_uid[filter->filter_num_uid_entries][1] = input_value; - - gf_log (this->name, - GF_LOG_DEBUG, - "filter [%d]: input uid(s) '%s' will be filtered", - filter->filter_num_uid_entries, dup_str); - - filter->filter_num_uid_entries++; - if (filter->filter_num_uid_entries == GF_MAXIMUM_FILTERING_ALLOWED) - break; - value = strtok_r (NULL, ",", &tmp_str); - GF_FREE (dup_str); - } - filter->partial_filter = 1; - } - - tmp_str = NULL; - tmp_str1 = NULL; - - if (dict_get (this->options, "filter-gid")) { - option_data = dict_get (this->options, "filter-gid"); - value = strtok_r (option_data->data, ",", &tmp_str); - while (value) { - dup_str = gf_strdup (value); - /* Check for n-m */ - input_value_str1 = strtok_r (dup_str, "-", &tmp_str1); - if (gf_string2int (input_value_str1, &input_value) != 0) { - gf_log (this->name, GF_LOG_ERROR, - "invalid number format \"%s\"", - input_value_str1); - return -1; - } - filter->filter_input_gid[filter->filter_num_gid_entries][0] = input_value; - input_value_str1 = strtok_r (NULL, "-", &tmp_str1); - if (input_value_str1) { - if (gf_string2int (input_value_str1, &input_value) != 0) { - gf_log (this->name, GF_LOG_ERROR, - "invalid number format \"%s\"", - input_value_str1); - return -1; - } - } - filter->filter_input_gid[filter->filter_num_gid_entries][1] = input_value; - - gf_log (this->name, - GF_LOG_DEBUG, - "filter [%d]: input gid(s) '%s' will be filtered", - filter->filter_num_gid_entries, dup_str); - - filter->filter_num_gid_entries++; - if (filter->filter_num_gid_entries == GF_MAXIMUM_FILTERING_ALLOWED) - break; - value = strtok_r (NULL, ",", &tmp_str); - GF_FREE (dup_str); - } - gf_log (this->name, GF_LOG_ERROR, "this option is not supported currently.. exiting"); - return -1; - filter->partial_filter = 1; - } - - if (dict_get (this->options, "fixed-uid")) { - option_data = dict_get (this->options, "fixed-uid"); - if (gf_string2int (option_data->data, &input_value) != 0) { - gf_log (this->name, GF_LOG_ERROR, - "invalid number format \"%s\"", - option_data->data); - return -1; - } - filter->fixed_uid = input_value; - filter->fixed_uid_set = 1; - } - - if (dict_get (this->options, "fixed-gid")) { - option_data = dict_get (this->options, "fixed-gid"); - if (gf_string2int (option_data->data, &input_value) != 0) { - gf_log (this->name, GF_LOG_ERROR, - "invalid number format \"%s\"", - option_data->data); - return -1; - } - filter->fixed_gid = input_value; - filter->fixed_gid_set = 1; - } - - this->private = filter; - return 0; -} - - -void -fini (xlator_t *this) -{ - struct gf_filter *filter = this->private; - - GF_FREE (filter); - - return; -} - - -struct xlator_fops fops = { - .lookup = filter_lookup, - .stat = filter_stat, - .fstat = filter_fstat, - .readlink = filter_readlink, - .mknod = filter_mknod, - .mkdir = filter_mkdir, - .unlink = filter_unlink, - .rmdir = filter_rmdir, - .symlink = filter_symlink, - .rename = filter_rename, - .link = filter_link, - .truncate = filter_truncate, - .ftruncate = filter_ftruncate, - .create = filter_create, - .open = filter_open, - .readv = filter_readv, - .writev = filter_writev, - .setxattr = filter_setxattr, - .getxattr = filter_getxattr, - .removexattr = filter_removexattr, - .opendir = filter_opendir, - .setattr = filter_setattr, - .fsetattr = filter_fsetattr, -}; - -struct xlator_cbks cbks = { -}; - -struct volume_options options[] = { - { .key = { "root-squashing" }, - .type = GF_OPTION_TYPE_BOOL - }, - { .key = { "read-only" }, - .type = GF_OPTION_TYPE_BOOL - }, - { .key = { "fixed-uid" }, - .type = GF_OPTION_TYPE_INT - }, - { .key = { "fixed-gid" }, - .type = GF_OPTION_TYPE_INT - }, - { .key = { "translate-uid" }, - .type = GF_OPTION_TYPE_ANY - }, - { .key = { "translate-gid" }, - .type = GF_OPTION_TYPE_ANY - }, - { .key = { "filter-uid" }, - .type = GF_OPTION_TYPE_ANY - }, - { .key = { "filter-gid" }, - .type = GF_OPTION_TYPE_ANY - }, - { .key = {NULL} }, -}; diff --git a/xlators/features/mac-compat/Makefile.am b/xlators/features/mac-compat/Makefile.am deleted file mode 100644 index d471a3f9243..00000000000 --- a/xlators/features/mac-compat/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -SUBDIRS = src - -CLEANFILES = diff --git a/xlators/features/mac-compat/src/Makefile.am b/xlators/features/mac-compat/src/Makefile.am deleted file mode 100644 index f9fd21e7322..00000000000 --- a/xlators/features/mac-compat/src/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -xlator_LTLIBRARIES = mac-compat.la -xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/features - -mac_compat_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS) - -mac_compat_la_SOURCES = mac-compat.c -mac_compat_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la - -noinst_HEADERS = mac-compat.h - -AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \ - -I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src - -AM_CFLAGS = -Wall $(GF_CFLAGS) - -CLEANFILES = diff --git a/xlators/features/mac-compat/src/mac-compat.c b/xlators/features/mac-compat/src/mac-compat.c deleted file mode 100644 index 795a387d484..00000000000 --- a/xlators/features/mac-compat/src/mac-compat.c +++ /dev/null @@ -1,344 +0,0 @@ -/* - Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ -#include "xlator.h" -#include "defaults.h" -#include "compat-errno.h" -#include "syscall.h" -#include "mem-pool.h" -#include "mac-compat.h" - -static int -dict_key_remove_namespace(dict_t *dict, char *key, data_t *value, void *data) -{ - /* - char buffer[3*value->len+1]; - int index = 0; - for (index = 0; index < value->len; index++) - sprintf(buffer+3*index, " %02x", value->data[index]); - */ - xlator_t *this = (xlator_t *) data; - if (strncmp(key, "user.", 5) == 0) { - dict_set (dict, key + 5, value); - gf_log (this->name, GF_LOG_DEBUG, - "remove_namespace_dict: %s -> %s ", key, key + 5); - dict_del (dict, key); - } - return 0; -} - -int32_t -maccomp_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, dict_t *dict, - dict_t *xdata) -{ - intptr_t ax = (intptr_t)this->private; - int i = 0; - - gf_log (this->name, GF_LOG_DEBUG, - "getxattr_cbk: dict %p private: %p xdata %p ", dict, - this->private, xdata); - - if (dict) { - dict_foreach(dict, dict_key_remove_namespace, this); - } - else { - // TODO: we expect dict to exist here, don't know why this - // this is needed - dict = dict_new(); - } - gf_log (this->name, GF_LOG_DEBUG, - "getxattr_cbk: dict %p ax: %ld op_ret %d op_err %d ", dict, ax, - op_ret, op_errno); - if ((ax == GF_XATTR_ALL && op_ret >= 0) || ax != GF_XATTR_NONE) { - op_ret = op_errno = 0; - for (i = 0; i < GF_XATTR_ALL; i++) { - if (dict_get (dict, apple_xattr_name[i])) - continue; - /* set dummy data */ - gf_log (this->name, GF_LOG_DEBUG, - "getxattr_cbk: setting dummy data %p, %s", dict, - apple_xattr_name[i]); - if (dict_set (dict, apple_xattr_name[i], - bin_to_data ((void *)apple_xattr_value[i], - apple_xattr_len[i])) == -1) { - op_ret = -1; - op_errno = ENOATTR; - - break; - } - } - } - STACK_UNWIND_STRICT (getxattr, frame, op_ret, op_errno, dict, xdata); - return 0; -} - - -static -int prepend_xattr_user_namespace(dict_t *dict, char *key, data_t *value, void *obj) -{ - xlator_t *this = (xlator_t *) obj; - dict_t *newdict = (dict_t *) this->private; - char *newkey = NULL; - gf_add_prefix(XATTR_USER_PREFIX, key, &newkey); - key = newkey; - dict_set(newdict, (char *)key, value); - if (newkey) - GF_FREE(newkey); - return 0; -} - -intptr_t -check_name(const char *name, char **newkey) -{ - intptr_t ax = GF_XATTR_NONE; - if (name) { - int i = 0; - for (i = 0; i < GF_XATTR_ALL; i++) { - if (strcmp (apple_xattr_name[i], name) == 0) { - ax = i; - break; - } - } - gf_add_prefix("user.", name, newkey); - } else - ax = GF_XATTR_ALL; - return ax; -} - -int32_t -maccomp_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, - const char *name, dict_t *xdata) -{ - char *newkey = NULL; - this->private = (void *) check_name(name, &newkey); - - gf_log (this->name, GF_LOG_DEBUG, - "getxattr: name %s private: %p xdata %p ", name, - this->private, xdata); - STACK_WIND (frame, maccomp_getxattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->getxattr, - loc, newkey, xdata); - return 0; -} - - -int32_t -maccomp_fgetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd, - const char *name, dict_t *xdata) -{ - char *newkey = NULL; - this->private = (void *) check_name(name, &newkey); - - STACK_WIND (frame, maccomp_getxattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->fgetxattr, - fd, newkey, xdata); - GF_FREE(newkey); - return 0; -} - -int32_t -maccomp_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, dict_t *xdata) -{ - intptr_t ax = (intptr_t)this->private; - - if (op_ret == -1 && ax != GF_XATTR_NONE) - op_ret = op_errno = 0; - gf_log (this->name, GF_LOG_DEBUG, - "setxattr_cbk op_ret %d op_errno %d private: %p xdata %p ", - op_ret, op_errno, this->private, xdata); - STACK_UNWIND_STRICT (setxattr, frame, op_ret, op_errno, xdata); - return 0; -} - -int32_t -maccomp_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, struct iatt *iatt1, - struct iatt *iattr2, dict_t *xdata) -{ - gf_log (this->name, GF_LOG_DEBUG, - "setattr_cbk op_ret %d op_errno %d private: %p xdata %p ", - op_ret, op_errno, this->private, xdata); - STACK_UNWIND_STRICT (setattr, frame, op_ret, op_errno, - iatt1, iattr2, xdata); - return 0; -} - -int map_flags(int flags) -{ - /* DARWIN has different defines on XATTR_ flags. - There do not seem to be a POSIX standard - Parse any other flags over. - NOFOLLOW is always true on Linux and Darwin - */ - int linux_flags = flags & ~(GF_XATTR_CREATE | GF_XATTR_REPLACE | XATTR_REPLACE); - if (XATTR_CREATE & flags) - linux_flags |= GF_XATTR_CREATE; - if (XATTR_REPLACE & flags) - linux_flags |= GF_XATTR_REPLACE; - return linux_flags; -} - -int32_t -maccomp_fremovexattr (call_frame_t *frame, xlator_t *this, fd_t *fd, - const char *name, dict_t *xdata) -{ - char *newkey = NULL; - - this->private = (void *) check_name(name, &newkey); - - STACK_WIND (frame, default_fremovexattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->fremovexattr, - fd, newkey, xdata); - GF_FREE(newkey); - return 0; -} - -int32_t -maccomp_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict, - int32_t flags, dict_t *xdata) -{ - intptr_t ax = GF_XATTR_NONE; - int i = 0; - - for (i = 0; i < GF_XATTR_ALL; i++) { - if (dict_get (dict, apple_xattr_name[i])) { - ax = i; - - break; - } - } - dict_t *newdict = dict_new(); - this->private = (void *) newdict; - dict_foreach(dict, prepend_xattr_user_namespace, this); - - this->private = (void *)ax; - int linux_flags = map_flags(flags); - gf_log (this->name, GF_LOG_DEBUG, - "setxattr flags: %d -> %d dict %p private: %p xdata %p ", - flags, linux_flags, dict, this->private, xdata); - STACK_WIND (frame, maccomp_setxattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->setxattr, - loc, newdict, linux_flags, xdata); - dict_unref(newdict); - return 0; -} - -int32_t -maccomp_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc, struct iatt *iattr, - int32_t flags, dict_t *xdata) -{ - gf_log (this->name, GF_LOG_DEBUG, - "setattr iattr %p private: %p xdata %p ", - iattr, this->private, xdata); - STACK_WIND (frame, maccomp_setattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->setattr, - loc, iattr, flags, xdata); - return 0; -} - -int32_t -maccomp_removexattr (call_frame_t *frame, xlator_t *this, loc_t *loc, - const char *name, dict_t *xdata) -{ - char *newkey = NULL; - this->private = (void *) check_name(name, &newkey); - - STACK_WIND (frame, default_removexattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->removexattr, - loc, newkey, xdata); - - gf_log (this->name, GF_LOG_TRACE, - "removeattr name %p private: %p xdata %p ", - name, this->private, xdata); - GF_FREE(newkey); - return 0; - -} - -int32_t -maccomp_fsetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict, - int32_t flags, dict_t *xdata) -{ - intptr_t ax = GF_XATTR_NONE; - int i = 0; - - for (i = 0; i < GF_XATTR_ALL; i++) { - if (dict_get (dict, apple_xattr_name[i])) { - ax = i; - - break; - } - } - - dict_t *newdict = dict_new(); - this->private = (void *) newdict; - dict_foreach(dict, prepend_xattr_user_namespace, this); - - this->private = (void *)ax; - int linux_flags = map_flags(flags); - gf_log (this->name, GF_LOG_DEBUG, - "fsetxattr flags: %d -> %d dict %p private: %p xdata %p ", - flags, linux_flags, dict, this->private, xdata); - STACK_WIND (frame, maccomp_setxattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->fsetxattr, - fd, newdict, linux_flags, xdata); - dict_unref(newdict); - return 0; -} - - -int32_t -init (xlator_t *this) -{ - if (!this->children || this->children->next) { - gf_log (this->name, GF_LOG_ERROR, - "translator not configured with exactly one child"); - return -1; - } - - if (!this->parents) { - gf_log (this->name, GF_LOG_WARNING, - "dangling volume. check volfile "); - } - - return 0; -} - - -void -fini (xlator_t *this) -{ - return; -} - - -struct xlator_fops fops = { - .getxattr = maccomp_getxattr, - .fgetxattr = maccomp_fgetxattr, - .setxattr = maccomp_setxattr, - .setattr = maccomp_setattr, - .fsetxattr = maccomp_fsetxattr, - .removexattr = maccomp_removexattr, - .fremovexattr = maccomp_fremovexattr, -}; - -struct xlator_cbks cbks; - -struct volume_options options[] = { - { .key = {NULL} }, -}; diff --git a/xlators/features/mac-compat/src/mac-compat.h b/xlators/features/mac-compat/src/mac-compat.h deleted file mode 100644 index b033ca0e4d8..00000000000 --- a/xlators/features/mac-compat/src/mac-compat.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - Copyright (c) 2014 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ - -#ifndef __MAC_COMPAT_H__ -#define __MAC_COMPAT_H__ - -enum apple_xattr { - GF_FINDER_INFO_XATTR, - GF_RESOURCE_FORK_XATTR, - GF_XATTR_ALL, - GF_XATTR_NONE -}; - -static char *apple_xattr_name[] = { - [GF_FINDER_INFO_XATTR] = "com.apple.FinderInfo", - [GF_RESOURCE_FORK_XATTR] = "com.apple.ResourceFork" -}; - -static const char *apple_xattr_value[] = { - [GF_FINDER_INFO_XATTR] = - /* 1 2 3 4 5 6 7 8 */ - "\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0", - [GF_RESOURCE_FORK_XATTR] = "" -}; - -static int32_t apple_xattr_len[] = { - [GF_FINDER_INFO_XATTR] = 32, - [GF_RESOURCE_FORK_XATTR] = 1 -}; - -#endif /* __MAC_COMPAT_H__ */ diff --git a/xlators/features/path-convertor/Makefile.am b/xlators/features/path-convertor/Makefile.am deleted file mode 100644 index d471a3f9243..00000000000 --- a/xlators/features/path-convertor/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -SUBDIRS = src - -CLEANFILES = diff --git a/xlators/features/path-convertor/src/Makefile.am b/xlators/features/path-convertor/src/Makefile.am deleted file mode 100644 index 7090698687b..00000000000 --- a/xlators/features/path-convertor/src/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ - -xlator_LTLIBRARIES = path-converter.la -xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/testing/features - -path_converter_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS) - -path_converter_la_SOURCES = path.c -path_converter_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la - -AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src - -AM_CFLAGS = -Wall $(GF_CFLAGS) - -CLEANFILES = - diff --git a/xlators/features/path-convertor/src/path-mem-types.h b/xlators/features/path-convertor/src/path-mem-types.h deleted file mode 100644 index 77ada8d537a..00000000000 --- a/xlators/features/path-convertor/src/path-mem-types.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ -#ifndef __PATH_MEM_TYPES_H__ -#define __PATH_MEM_TYPES_H__ - -#include "mem-types.h" - -enum gf_path_mem_types_ { - gf_path_mt_path_private_t = gf_common_mt_end + 1, - gf_path_mt_char, - gf_path_mt_regex_t, - gf_path_mt_end -}; -#endif - diff --git a/xlators/features/path-convertor/src/path.c b/xlators/features/path-convertor/src/path.c deleted file mode 100644 index b0e5d6cc625..00000000000 --- a/xlators/features/path-convertor/src/path.c +++ /dev/null @@ -1,1223 +0,0 @@ -/* - Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ -/* TODO: add gf_log to all the cases returning errors */ - -/** - * xlators/features/path-translator: - * This translator converts the path it gets into user specified targets. - */ - -#include <sys/types.h> -#include <regex.h> -#include <time.h> -#include <errno.h> -#include "glusterfs.h" -#include "xlator.h" -#include "path-mem-types.h" - -typedef struct path_private -{ - int32_t this_len; - int32_t start_off; - int32_t end_off; - char *this; - char *that; - char *path; - regex_t *preg; -} path_private_t; - -static char * -name_this_to_that (xlator_t *xl, const char *path, const char *name) -{ - path_private_t *priv = xl->private; - char priv_path[PATH_MAX] = {0,}; - char *tmp_name = NULL; - int32_t path_len = strlen (path); - int32_t name_len = strlen (name) - ZR_FILE_CONTENT_STRLEN; - int32_t total_len = path_len + name_len; - int32_t i = 0, j = 0; - - if (path_len >= priv->end_off) - return (char *)name; - - if (priv->end_off && (total_len > priv->end_off)) { - j = priv->start_off; - tmp_name = GF_CALLOC (1, (total_len + - ZR_FILE_CONTENT_STRLEN), - gf_path_mt_char); - ERR_ABORT (tmp_name); - - /* Get the complete path for the file first */ - strcpy (tmp_name, path); - strcat (tmp_name, name + ZR_FILE_CONTENT_STRLEN); - - strncpy (priv_path, tmp_name, priv->start_off); - for (i = priv->start_off; i < priv->end_off; i++) { - if (tmp_name[i] == '/') - continue; - priv_path[j++] = tmp_name[i]; - } - memcpy ((priv_path + j), - (tmp_name + priv->end_off), - (total_len - priv->end_off)); - priv_path[(total_len - (priv->end_off - j))] = '\0'; - - strcpy (tmp_name, ZR_FILE_CONTENT_STR); - strcat (tmp_name, priv_path); - - return tmp_name; - } - - return (char *)name; -} - -/* This function should return - * NULL - - * converted path - if path match - * same path - if it doesn't match - */ -static char * -path_this_to_that (xlator_t *xl, const char *path) -{ - path_private_t *priv = xl->private; - char *priv_path = NULL; - int32_t path_len = strlen (path); - int32_t i = 0, j = 0; - - if (priv->end_off && (path_len > priv->start_off)) { - priv_path = GF_CALLOC (1, path_len, gf_path_mt_char); - ERR_ABORT (priv_path); - - if (priv->start_off && (path_len > priv->start_off)) - memcpy (priv_path, path, priv->start_off); - if (path_len > priv->end_off) { - j = priv->start_off; - for (i = priv->start_off; i < priv->end_off; i++) { - if (path[i] == '/') - continue; - priv_path[j++] = path[i]; - } - memcpy ((priv_path + j), - (path + priv->end_off), - (path_len - priv->end_off)); - priv_path[(path_len - (priv->end_off - j))] = '\0'; - } - return priv_path; - } - return (char *)path; -} - -int32_t -path_create_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - fd_t *fd, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - STACK_UNWIND (frame, op_ret, op_errno, fd, inode, buf); - return 0; -} - -int32_t -path_open_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - fd_t *fd) -{ - STACK_UNWIND (frame, op_ret, op_errno, fd); - return 0; -} - -int32_t -path_getdents_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - dir_entry_t *entries, - int32_t count) -{ - STACK_UNWIND (frame, op_ret, op_errno, entries, count); - return 0; -} - -int32_t -path_readdir_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - gf_dirent_t *buf) -{ - STACK_UNWIND (frame, op_ret, op_errno, buf); - return 0; -} - - -int32_t -path_readlink_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - const char *buf, - struct iatt *sbuf) -{ - STACK_UNWIND (frame, op_ret, op_errno, buf, sbuf); - return 0; -} - -int32_t -path_lookup_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - dict_t *xattr, - struct iatt *postparent) -{ - STACK_UNWIND (frame, op_ret, op_errno, inode, buf, xattr); - return 0; -} - - -int32_t -path_symlink_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - STACK_UNWIND (frame, op_ret, op_errno, inode, buf); - return 0; -} - -int32_t -path_mknod_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - STACK_UNWIND (frame, op_ret, op_errno, inode, buf); - return 0; -} - - -int32_t -path_mkdir_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - STACK_UNWIND (frame, op_ret, op_errno, inode, buf); - return 0; -} - -int32_t -path_link_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - inode_t *inode, - struct iatt *buf, - struct iatt *preparent, - struct iatt *postparent) -{ - STACK_UNWIND (frame, op_ret, op_errno, inode, buf); - return 0; -} - -int32_t -path_opendir_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - fd_t *fd) -{ - STACK_UNWIND (frame, op_ret, op_errno, fd); - return 0; -} - - -int32_t -path_rename_buf_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *buf, - struct iatt *preoldparent, - struct iatt *postoldparent, - struct iatt *prenewparent, - struct iatt *postnewparent) -{ - STACK_UNWIND (frame, op_ret, op_errno, buf); - return 0; -} - - - -int32_t -path_common_buf_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *buf) -{ - STACK_UNWIND (frame, op_ret, op_errno, buf); - return 0; -} - -int32_t -path_common_dict_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - dict_t *dict) -{ - STACK_UNWIND (frame, op_ret, op_errno, dict); - return 0; -} - -int32_t -path_common_remove_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno,struct iatt *preparent, - struct iatt *postparent) -{ - STACK_UNWIND (frame, op_ret, op_errno); - return 0; -} - -int32_t -path_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno,struct iatt *prebuf, - struct iatt *postbuf) -{ - STACK_UNWIND (frame, op_ret, op_errno, prebuf, postbuf); - return 0; -} - - -int32_t -path_common_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno) -{ - STACK_UNWIND (frame, op_ret, op_errno); - return 0; -} - -/* */ -int32_t -path_lookup (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - dict_t *xattr_req) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, path_lookup_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->lookup, - loc, xattr_req); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - -int32_t -path_stat (call_frame_t *frame, - xlator_t *this, - loc_t *loc) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, - path_common_buf_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->stat, - loc); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - -int32_t -path_readlink (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - size_t size) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, - path_readlink_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->readlink, - loc, - size); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - -int32_t -path_mknod (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - mode_t mode, - dev_t dev) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, - path_mknod_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->mknod, - loc, - mode, - dev); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - -int32_t -path_mkdir (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - mode_t mode) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, - path_mkdir_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->mkdir, - loc, - mode); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - -int32_t -path_unlink (call_frame_t *frame, - xlator_t *this, - loc_t *loc) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, - path_common_remove_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->unlink, - loc); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - -int32_t -path_rmdir (call_frame_t *frame, - xlator_t *this, - loc_t *loc) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, - path_common_remove_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->rmdir, - loc); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - -int32_t -path_symlink (call_frame_t *frame, - xlator_t *this, - const char *linkpath, - loc_t *loc) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, - path_symlink_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->symlink, - linkpath, - loc); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - -int32_t -path_rename (call_frame_t *frame, - xlator_t *this, - loc_t *oldloc, - loc_t *newloc) -{ - char *oldloc_path = (char *)oldloc->path; - char *tmp_oldloc_path = NULL; - - char *newloc_path = (char *)newloc->path; - char *tmp_newloc_path = NULL; - - if (!(tmp_oldloc_path = path_this_to_that (this, oldloc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - oldloc->path = tmp_oldloc_path; - - if (!(tmp_newloc_path = path_this_to_that (this, newloc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - newloc->path = tmp_newloc_path; - - STACK_WIND (frame, - path_rename_buf_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->rename, - oldloc, - newloc); - - oldloc->path = oldloc_path; - if (tmp_oldloc_path != oldloc_path) - GF_FREE (tmp_oldloc_path); - - newloc->path = newloc_path; - if (tmp_newloc_path != newloc_path) - GF_FREE (tmp_newloc_path); - - return 0; -} - -int32_t -path_link (call_frame_t *frame, - xlator_t *this, - loc_t *oldloc, - loc_t *newloc) -{ - char *oldloc_path = (char *)oldloc->path; - char *tmp_oldloc_path = NULL; - - char *newloc_path = (char *)newloc->path; - char *tmp_newloc_path = NULL; - - if (!(tmp_oldloc_path = path_this_to_that (this, oldloc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - oldloc->path = tmp_oldloc_path; - - if (!(tmp_newloc_path = path_this_to_that (this, newloc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - newloc->path = tmp_newloc_path; - - STACK_WIND (frame, - path_link_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->link, - oldloc, - newloc); - - oldloc->path = oldloc_path; - if (tmp_oldloc_path != oldloc_path) - GF_FREE (tmp_oldloc_path); - - newloc->path = newloc_path; - if (tmp_newloc_path != newloc_path) - GF_FREE (tmp_newloc_path); - - return 0; -} - -int32_t -path_setattr_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - struct iatt *preop, - struct iatt *postop) -{ - STACK_UNWIND (frame, op_ret, op_errno, preop, postop); - return 0; -} - -int32_t -path_setattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - struct iatt *stbuf, - int32_t valid) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, - path_setattr_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->setattr, - loc, - stbuf, valid); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - - -int32_t -path_truncate (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - off_t offset) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, - path_truncate_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->truncate, - loc, - offset); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - - -int32_t -path_open (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - int32_t flags, - fd_t *fd, - int32_t wbflags) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, - path_open_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->open, - loc, - flags, - fd, - wbflags); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - -int32_t -path_create (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - int32_t flags, - mode_t mode, - fd_t *fd) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, - path_create_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->create, - loc, - flags, - mode, - fd); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - -int32_t -path_setxattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - dict_t *dict, - int32_t flags) -{ - char *tmp_name = NULL; - data_pair_t *trav = dict->members_list; - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - if (ZR_FILE_CONTENT_REQUEST(trav->key)) { - tmp_name = name_this_to_that (this, loc->path, trav->key); - if (tmp_name != trav->key) { - trav->key = tmp_name; - } else { - tmp_name = NULL; - } - } - - STACK_WIND (frame, - path_common_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->setxattr, - loc, - dict, - flags); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - GF_FREE (tmp_name); - - return 0; -} - -int32_t -path_getxattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - const char *name) -{ - char *tmp_name = (char *)name; - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - if (ZR_FILE_CONTENT_REQUEST(name)) { - tmp_name = name_this_to_that (this, loc->path, name); - } - - STACK_WIND (frame, - path_common_dict_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->getxattr, - loc, - tmp_name); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - if (tmp_name != name) - GF_FREE (tmp_name); - - return 0; -} - -int32_t -path_removexattr (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - const char *name) -{ - char *tmp_name = (char *)name; - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - if (ZR_FILE_CONTENT_REQUEST(name)) { - tmp_name = name_this_to_that (this, loc->path, name); - } - - STACK_WIND (frame, - path_common_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->removexattr, - loc, - tmp_name); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - if (tmp_name != name) - GF_FREE (tmp_name); - - return 0; -} - -int32_t -path_opendir (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - fd_t *fd) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, - path_opendir_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->opendir, - loc, - fd); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - -int32_t -path_access (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - int32_t mask) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, - path_common_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->access, - loc, - mask); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - -int32_t -path_checksum_cbk (call_frame_t *frame, - void *cookie, - xlator_t *this, - int32_t op_ret, - int32_t op_errno, - uint8_t *fchecksum, - uint8_t *dchecksum) -{ - STACK_UNWIND (frame, op_ret, op_errno, fchecksum, dchecksum); - return 0; -} - -int32_t -path_checksum (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - int32_t flag) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, - path_checksum_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->checksum, - loc, - flag); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - - -int32_t -path_entrylk (call_frame_t *frame, xlator_t *this, - const char *volume, loc_t *loc, const char *basename, - entrylk_cmd cmd, entrylk_type type) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, path_common_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->entrylk, - volume, loc, basename, cmd, type); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - -int32_t -path_inodelk (call_frame_t *frame, xlator_t *this, - const char *volume, loc_t *loc, int32_t cmd, struct gf_flock *lock) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, - path_common_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->inodelk, - volume, loc, cmd, lock); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - - -int32_t -path_xattrop (call_frame_t *frame, - xlator_t *this, - loc_t *loc, - gf_xattrop_flags_t flags, - dict_t *dict) -{ - char *loc_path = (char *)loc->path; - char *tmp_path = NULL; - - if (!(tmp_path = path_this_to_that (this, loc->path))) { - STACK_UNWIND (frame, -1, ENOENT, NULL, NULL); - return 0; - } - loc->path = tmp_path; - - STACK_WIND (frame, - path_common_dict_cbk, - FIRST_CHILD(this), - FIRST_CHILD(this)->fops->xattrop, - loc, - flags, - dict); - - loc->path = loc_path; - if (tmp_path != loc_path) - GF_FREE (tmp_path); - - return 0; -} - -int32_t -mem_acct_init (xlator_t *this) -{ - int ret = -1; - - if (!this) - return ret; - - ret = xlator_mem_acct_init (this, gf_path_mt_end + 1); - - if (ret != 0) { - gf_log (this->name, GF_LOG_ERROR, "Memory accounting init" - "failed"); - return ret; - } - - return ret; -} - -int32_t -init (xlator_t *this) -{ - dict_t *options = this->options; - path_private_t *priv = NULL; - - if (!this->children || this->children->next) { - gf_log (this->name, GF_LOG_ERROR, - "path translator requires exactly one subvolume"); - return -1; - } - - if (!this->parents) { - gf_log (this->name, GF_LOG_WARNING, - "dangling volume. check volfile "); - } - - priv = GF_CALLOC (1, sizeof (*priv), gf_path_mt_path_private_t); - ERR_ABORT (priv); - if (dict_get (options, "start-offset")) { - priv->start_off = data_to_int32 (dict_get (options, - "start-offset")); - } - if (dict_get (options, "end-offset")) { - priv->end_off = data_to_int32 (dict_get (options, - "end-offset")); - } - - if (dict_get (options, "regex")) { - int32_t ret = 0; - priv->preg = GF_CALLOC (1, sizeof (regex_t), - gf_path_mt_regex_t); - ERR_ABORT (priv->preg); - ret = regcomp (priv->preg, - data_to_str (dict_get (options, "regex")), - REG_EXTENDED); - if (ret) { - gf_log (this->name, GF_LOG_ERROR, - "Failed to compile the 'option regex'"); - GF_FREE (priv); - return -1; - } - if (dict_get (options, "replace-with")) { - priv->that = data_to_str (dict_get (options, - "replace-with")); - } else { - priv->that = ""; - } - } - - this->private = priv; - return 0; -} - -void -fini (xlator_t *this) -{ - return; -} - -struct xlator_fops fops = { - .stat = path_stat, - .readlink = path_readlink, - .mknod = path_mknod, - .mkdir = path_mkdir, - .unlink = path_unlink, - .rmdir = path_rmdir, - .symlink = path_symlink, - .rename = path_rename, - .link = path_link, - .truncate = path_truncate, - .open = path_open, - .setxattr = path_setxattr, - .getxattr = path_getxattr, - .removexattr = path_removexattr, - .opendir = path_opendir, - .access = path_access, - .create = path_create, - .lookup = path_lookup, - .checksum = path_checksum, - .xattrop = path_xattrop, - .entrylk = path_entrylk, - .inodelk = path_inodelk, - .setattr = path_setattr, -}; - -struct xlator_cbks cbks = { -}; - -struct volume_options options[] = { - { .key = {"start-offset"}, - .type = GF_OPTION_TYPE_INT, - .min = 0, - .max = 4095 - }, - { .key = {"end-offset"}, - .type = GF_OPTION_TYPE_INT, - .min = 1, - .max = 4096 - }, - { .key = {"replace-with"}, - .type = GF_OPTION_TYPE_ANY - }, - { .key = {NULL} }, -}; diff --git a/xlators/features/protect/Makefile.am b/xlators/features/protect/Makefile.am deleted file mode 100644 index d471a3f9243..00000000000 --- a/xlators/features/protect/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -SUBDIRS = src - -CLEANFILES = diff --git a/xlators/features/protect/src/Makefile.am b/xlators/features/protect/src/Makefile.am deleted file mode 100644 index 58ca471141c..00000000000 --- a/xlators/features/protect/src/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ -xlator_LTLIBRARIES = prot_dht.la prot_client.la prot_server.la - -xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/features - -prot_dht_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS) -prot_dht_la_SOURCES = prot_dht.c -prot_dht_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la - -prot_client_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS) -prot_client_la_SOURCES = prot_client.c -prot_client_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la - -prot_server_la_LDFLAGS = -module $(GF_XLATOR_DEFAULT_LDFLAGS) -prot_server_la_SOURCES = prot_server.c -prot_server_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la - -AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \ - -I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src \ - -I$(CONTRIBDIR)/libexecinfo -AM_CFLAGS = -Wall $(GF_CFLAGS) - -CLEANFILES = diff --git a/xlators/features/protect/src/prot_client.c b/xlators/features/protect/src/prot_client.c deleted file mode 100644 index 79636410b94..00000000000 --- a/xlators/features/protect/src/prot_client.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - Copyright (c) 2013 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ -#include "xlator.h" -#include "defaults.h" - -#ifdef HAVE_BACKTRACE -#include <execinfo.h> -#else -#include "execinfo_compat.h" -#endif - -#define NUM_FRAMES 20 - -static char PROTECT_KEY[] = "trusted.glusterfs.protect"; - -enum { - PROT_ACT_NONE = 0, - PROT_ACT_LOG, - PROT_ACT_REJECT, -}; - -void -pcli_print_trace (char *name, call_frame_t *frame) -{ - void *frames[NUM_FRAMES]; - char **symbols; - int size; - int i; - - gf_log (name, GF_LOG_INFO, "Translator stack:"); - list_for_each_entry (frame, &frame->root->myframes, frames) { - gf_log (name, GF_LOG_INFO, "%s (%s)", - frame->wind_from, frame->this->name); - } - - size = backtrace (frames, NUM_FRAMES); - if (size <= 0) { - return; - } - symbols = backtrace_symbols (frames, size); - if (!symbols) { - return; - } - - gf_log (name, GF_LOG_INFO, "Processor stack:"); - for (i = 0; i < size; ++i) { - gf_log (name, GF_LOG_INFO, "%s", symbols[i]); - } - free (symbols); -} - -int32_t -pcli_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc, - loc_t *newloc, dict_t *xdata) -{ - uint64_t value; - - if (newloc->parent == oldloc->parent) { - gf_log (this->name, GF_LOG_DEBUG, "rename in same directory"); - goto simple_unwind; - } - if (!oldloc->parent) { - goto simple_unwind; - } - if (inode_ctx_get (oldloc->parent, this, &value) != 0) { - goto simple_unwind; - } - - if (value != PROT_ACT_NONE) { - gf_log (this->name, GF_LOG_WARNING, - "got rename for protected %s", oldloc->path); - pcli_print_trace (this->name, frame); - if (value == PROT_ACT_REJECT) { - STACK_UNWIND_STRICT (rename, frame, -1, EPERM, - NULL, NULL, NULL, NULL, NULL, - xdata); - return 0; - } - } - -simple_unwind: - STACK_WIND_TAIL (frame, FIRST_CHILD(this), - FIRST_CHILD(this)->fops->rename, oldloc, newloc, - xdata); - return 0; -} - -int32_t -pcli_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict, - int32_t flags, dict_t *xdata) -{ - data_t *data; - uint64_t value; - - /* - * We can't use dict_get_str and strcmp here, because the value comes - * directly from the user and might not be NUL-terminated (it would - * be if we had set it ourselves. - */ - - data = dict_get(dict,PROTECT_KEY); - if (!data) { - goto simple_wind; - } - - if (dict->count > 1) { - gf_log (this->name, GF_LOG_WARNING, - "attempted to mix %s with other keys", PROTECT_KEY); - goto simple_wind; - } - - gf_log (this->name, GF_LOG_DEBUG, "got %s request", PROTECT_KEY); - if (!strncmp(data->data,"log",data->len)) { - gf_log (this->name, GF_LOG_DEBUG, - "logging removals on %s", loc->path); - value = PROT_ACT_LOG; - } - else if (!strncmp(data->data,"reject",data->len)) { - gf_log (this->name, GF_LOG_DEBUG, - "rejecting removals on %s", loc->path); - value = PROT_ACT_REJECT; - } - else { - gf_log (this->name, GF_LOG_DEBUG, - "removing protection on %s", loc->path); - value = PROT_ACT_NONE; - } - /* Right now the value doesn't matter - just the presence. */ - if (inode_ctx_set(loc->inode,this,&value) != 0) { - gf_log (this->name, GF_LOG_WARNING, - "failed to set protection status for %s", loc->path); - } - STACK_UNWIND_STRICT (setxattr, frame, 0, 0, NULL); - return 0; - -simple_wind: - STACK_WIND_TAIL (frame, - FIRST_CHILD(this), FIRST_CHILD(this)->fops->setxattr, - loc, dict, flags, xdata); - return 0; -} - -int32_t -pcli_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag, - dict_t *xdata) -{ - uint64_t value; - - if (!loc->parent || (inode_ctx_get(loc->parent,this,&value) != 0)) { - goto simple_unwind; - } - - if (value != PROT_ACT_NONE) { - gf_log (this->name, GF_LOG_WARNING, - "got unlink for protected %s", loc->path); - pcli_print_trace(this->name, frame); - if (value == PROT_ACT_REJECT) { - STACK_UNWIND_STRICT (unlink, frame, -1, EPERM, - NULL, NULL, NULL); - return 0; - } - } - -simple_unwind: - STACK_WIND_TAIL (frame, FIRST_CHILD(this), - FIRST_CHILD(this)->fops->unlink, loc, xflag, xdata); - return 0; -} - -int32_t -init (xlator_t *this) -{ - if (!this->children || this->children->next) { - gf_log (this->name, GF_LOG_ERROR, - "translator not configured with exactly one child"); - return -1; - } - - if (!this->parents) { - gf_log (this->name, GF_LOG_WARNING, - "dangling volume. check volfile "); - } - - return 0; -} - - -void -fini (xlator_t *this) -{ - return; -} - - -struct xlator_fops fops = { - .rename = pcli_rename, - .setxattr = pcli_setxattr, - .unlink = pcli_unlink, -}; - -struct xlator_cbks cbks = { -}; - -struct volume_options options[] = { - { .key = {NULL} }, -}; diff --git a/xlators/features/protect/src/prot_dht.c b/xlators/features/protect/src/prot_dht.c deleted file mode 100644 index 1fc8cc1ffde..00000000000 --- a/xlators/features/protect/src/prot_dht.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - Copyright (c) 2013 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ -#include "xlator.h" -#include "defaults.h" - -enum gf_pdht_mem_types_ { - gf_pdht_mt_coord_t = gf_common_mt_end + 1, - gf_pdht_mt_end -}; - -typedef struct { - pthread_mutex_t lock; - uint16_t refs; - int32_t op_ret; - int32_t op_errno; - dict_t *xdata; -} pdht_coord_t; - -static char PROTECT_KEY[] = "trusted.glusterfs.protect"; - -void -pdht_unref_and_unlock (call_frame_t *frame, xlator_t *this, - pdht_coord_t *coord) -{ - gf_boolean_t should_unwind; - - should_unwind = (--(coord->refs) == 0); - pthread_mutex_unlock(&coord->lock); - - if (should_unwind) { - STACK_UNWIND_STRICT (setxattr, frame, - coord->op_ret, coord->op_errno, - coord->xdata); - if (coord->xdata) { - dict_unref(coord->xdata); - } - GF_FREE(coord); - } -} - -int32_t -pdht_recurse_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, dict_t *xdata) -{ - pdht_coord_t *coord = cookie; - - pthread_mutex_lock(&coord->lock); - if (op_ret) { - coord->op_ret = op_ret; - coord->op_errno = op_errno; - } - if (xdata) { - if (coord->xdata) { - dict_unref(coord->xdata); - } - coord->xdata = dict_ref(xdata); - } - pdht_unref_and_unlock(frame,this,coord); - - return 0; -} - -void -pdht_recurse (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict, - int32_t flags, dict_t *xdata, xlator_t *xl, pdht_coord_t *coord) -{ - xlator_list_t *iter; - - if (!strcmp(xl->type,"features/prot_client")) { - pthread_mutex_lock(&coord->lock); - ++(coord->refs); - pthread_mutex_unlock(&coord->lock); - STACK_WIND_COOKIE (frame, pdht_recurse_cbk, coord, xl, - xl->fops->setxattr, loc, dict, flags, xdata); - } - - else for (iter = xl->children; iter; iter = iter->next) { - pdht_recurse (frame, this, loc, dict, flags, xdata, - iter->xlator, coord); - } -} - -int32_t -pdht_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict, - int32_t flags, dict_t *xdata) -{ - pdht_coord_t *coord; - - if (!dict_get(dict,PROTECT_KEY)) { - goto simple_wind; - } - - if (dict->count > 1) { - gf_log (this->name, GF_LOG_WARNING, - "attempted to mix %s with other keys", PROTECT_KEY); - goto simple_wind; - } - - coord = GF_CALLOC(1,sizeof(*coord),gf_pdht_mt_coord_t); - if (!coord) { - gf_log (this->name, GF_LOG_WARNING, "allocation failed"); - goto simple_wind; - } - - pthread_mutex_init(&coord->lock,NULL); - coord->refs = 1; - coord->op_ret = 0; - coord->xdata = NULL; - - pdht_recurse(frame,this,loc,dict,flags,xdata,this,coord); - pthread_mutex_lock(&coord->lock); - pdht_unref_and_unlock(frame,this,coord); - - return 0; - -simple_wind: - STACK_WIND_TAIL (frame, - FIRST_CHILD(this), FIRST_CHILD(this)->fops->setxattr, - loc, dict, flags, xdata); - return 0; -} - -int32_t -init (xlator_t *this) -{ - if (!this->children || this->children->next) { - gf_log (this->name, GF_LOG_ERROR, - "translator not configured with exactly one child"); - return -1; - } - - if (!this->parents) { - gf_log (this->name, GF_LOG_WARNING, - "dangling volume. check volfile "); - } - - return 0; -} - - -void -fini (xlator_t *this) -{ - return; -} - -struct xlator_fops fops = { - .setxattr = pdht_setxattr, -}; - -struct xlator_cbks cbks = { -}; - -struct volume_options options[] = { - { .key = {NULL} }, -}; diff --git a/xlators/features/protect/src/prot_server.c b/xlators/features/protect/src/prot_server.c deleted file mode 100644 index 8ebace240f3..00000000000 --- a/xlators/features/protect/src/prot_server.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - Copyright (c) 2013 Red Hat, Inc. <http://www.redhat.com> - This file is part of GlusterFS. - - This file is licensed to you under your choice of the GNU Lesser - General Public License, version 3 or any later version (LGPLv3 or - later), or the GNU General Public License, version 2 (GPLv2), in all - cases as published by the Free Software Foundation. -*/ -#include "xlator.h" -#include "defaults.h" - -int32_t -init (xlator_t *this) -{ - if (!this->children || this->children->next) { - gf_log (this->name, GF_LOG_ERROR, - "translator not configured with exactly one child"); - return -1; - } - - if (!this->parents) { - gf_log (this->name, GF_LOG_WARNING, - "dangling volume. check volfile "); - } - - return 0; -} - - -void -fini (xlator_t *this) -{ - return; -} - - -struct xlator_fops fops = { -}; - -struct xlator_cbks cbks = { -}; - -struct volume_options options[] = { - { .key = {NULL} }, -}; |