diff options
Diffstat (limited to 'xlators/cluster')
| -rw-r--r-- | xlators/cluster/afr/src/Makefile.am | 8 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/pump.c | 2472 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/pump.h | 81 | ||||
| -rw-r--r-- | xlators/cluster/ha/Makefile.am | 3 | ||||
| -rw-r--r-- | xlators/cluster/ha/src/Makefile.am | 17 | ||||
| -rw-r--r-- | xlators/cluster/ha/src/ha-helpers.c | 194 | ||||
| -rw-r--r-- | xlators/cluster/ha/src/ha-mem-types.h | 26 | ||||
| -rw-r--r-- | xlators/cluster/ha/src/ha.c | 4008 | ||||
| -rw-r--r-- | xlators/cluster/ha/src/ha.h | 53 | ||||
| -rw-r--r-- | xlators/cluster/map/Makefile.am | 3 | ||||
| -rw-r--r-- | xlators/cluster/map/src/Makefile.am | 17 | ||||
| -rw-r--r-- | xlators/cluster/map/src/map-helper.c | 343 | ||||
| -rw-r--r-- | xlators/cluster/map/src/map-mem-types.h | 24 | ||||
| -rw-r--r-- | xlators/cluster/map/src/map.c | 2561 | ||||
| -rw-r--r-- | xlators/cluster/map/src/map.h | 67 | 
15 files changed, 2 insertions, 9875 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__ */  | 
