diff options
Diffstat (limited to 'xlators/protocol/server/src/server-protocol.c')
-rw-r--r-- | xlators/protocol/server/src/server-protocol.c | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/xlators/protocol/server/src/server-protocol.c b/xlators/protocol/server/src/server-protocol.c index 0528699ac..a7f6294f3 100644 --- a/xlators/protocol/server/src/server-protocol.c +++ b/xlators/protocol/server/src/server-protocol.c @@ -5654,6 +5654,8 @@ mop_setvolume (call_frame_t *frame, xlator_t *bound_xl, char *volfile_key = NULL; uint32_t checksum = 0; int32_t lru_limit = 1024; + xlator_list_t *xltrav = NULL; + int subvol_idx = 0; params = dict_new (); reply = dict_new (); @@ -5695,7 +5697,7 @@ mop_setvolume (call_frame_t *frame, xlator_t *bound_xl, } - conn = server_connection_get (frame->this, process_uuid); + conn = server_connection_get (frame->this, process_uuid, trans); if (trans->xl_private != conn) trans->xl_private = conn; @@ -5862,6 +5864,22 @@ mop_setvolume (call_frame_t *frame, xlator_t *bound_xl, ret = dict_set_uint64 (reply, "transport-ptr", ((uint64_t) (long) trans)); + xltrav = frame->this->children; + while (xltrav) { + if (xltrav->xlator == xl) + break; + xltrav = xltrav->next; + subvol_idx++; + } + + if (conf->subvol_list[subvol_idx] == 0) { + gf_log (xl->name, GF_LOG_DEBUG, + "subvolume %d down (filesystem not accesible), failed to setvolume", subvol_idx); + op_ret = -1; + op_errno = ENOTCONN; + goto fail; + } + fail: dict_len = dict_serialized_length (reply); if (dict_len < 0) { @@ -6550,6 +6568,8 @@ init (xlator_t *this) server_conf_t *conf = NULL; data_t *data = NULL; data_t *trace = NULL; + int i = 0; + xlator_list_t *xltrav = NULL; if (this->children == NULL) { gf_log (this->name, GF_LOG_ERROR, @@ -6635,6 +6655,15 @@ init (xlator_t *this) } } + xltrav = this->children; + + while (xltrav) { + i++; + xltrav = xltrav->next; + } + + conf->subvol_list = calloc (i, sizeof (char)); + #ifndef GF_DARWIN_HOST_OS { struct rlimit lim; @@ -6736,6 +6765,12 @@ notify (xlator_t *this, int32_t event, void *data, ...) } switch (event) { + case GF_EVENT_CHILD_DOWN: + server_child_down (this, data); + break; + case GF_EVENT_CHILD_UP: + server_child_up (this, data); + break; case GF_EVENT_POLLIN: ret = protocol_server_pollin (this, trans); break; @@ -6756,7 +6791,7 @@ notify (xlator_t *this, int32_t event, void *data, ...) * FIXME: shouldn't we check for return value? * what should be done if cleanup fails? */ - server_connection_cleanup (this, trans->xl_private); + server_connection_cleanup (this, trans->xl_private, trans); } } break; |