summaryrefslogtreecommitdiffstats
path: root/xlators
diff options
context:
space:
mode:
Diffstat (limited to 'xlators')
-rw-r--r--xlators/features/bit-rot/src/stub/bit-rot-stub.c31
-rw-r--r--xlators/features/changelog/src/changelog-ev-handle.c2
-rw-r--r--xlators/features/changelog/src/changelog.c16
-rw-r--r--xlators/features/changetimerecorder/src/changetimerecorder.c26
-rw-r--r--xlators/features/index/src/index.c22
-rw-r--r--xlators/features/index/src/index.h1
-rw-r--r--xlators/mgmt/glusterd/src/glusterd.c2
-rw-r--r--xlators/performance/io-threads/src/io-threads.c3
-rw-r--r--xlators/protocol/server/src/Makefile.am3
-rw-r--r--xlators/protocol/server/src/server-handshake.c24
-rw-r--r--xlators/protocol/server/src/server-mem-types.h1
-rw-r--r--xlators/protocol/server/src/server-messages.h10
-rw-r--r--xlators/protocol/server/src/server.c95
-rw-r--r--xlators/protocol/server/src/server.h10
-rw-r--r--xlators/storage/posix/src/posix-helpers.c36
-rw-r--r--xlators/storage/posix/src/posix.c20
16 files changed, 261 insertions, 41 deletions
diff --git a/xlators/features/bit-rot/src/stub/bit-rot-stub.c b/xlators/features/bit-rot/src/stub/bit-rot-stub.c
index 895e7690a5e..b8a34422522 100644
--- a/xlators/features/bit-rot/src/stub/bit-rot-stub.c
+++ b/xlators/features/bit-rot/src/stub/bit-rot-stub.c
@@ -10,6 +10,7 @@
#include <ctype.h>
#include <sys/uio.h>
+#include <signal.h>
#include "glusterfs.h"
#include "xlator.h"
@@ -212,6 +213,35 @@ out:
return ret;
}
+
+int
+notify (xlator_t *this, int event, void *data, ...)
+{
+ br_stub_private_t *priv = NULL;
+
+ if (!this)
+ return 0;
+
+ priv = this->private;
+ if (!priv)
+ return 0;
+
+ switch (event) {
+ case GF_EVENT_CLEANUP:
+ if (priv->signth) {
+ (void) gf_thread_cleanup_xint (priv->signth);
+ priv->signth = 0;
+ }
+ if (priv->container.thread) {
+ (void) gf_thread_cleanup_xint (priv->container.thread);
+ priv->container.thread = 0;
+ }
+ break;
+ }
+ default_notify (this, event, data);
+ return 0;
+}
+
void
fini (xlator_t *this)
{
@@ -832,6 +862,7 @@ br_stub_signth (void *arg)
THIS = this;
while (1) {
+
pthread_mutex_lock (&priv->lock);
{
while (list_empty (&priv->squeue))
diff --git a/xlators/features/changelog/src/changelog-ev-handle.c b/xlators/features/changelog/src/changelog-ev-handle.c
index caa5bbbadcd..38e127b7eb5 100644
--- a/xlators/features/changelog/src/changelog-ev-handle.c
+++ b/xlators/features/changelog/src/changelog-ev-handle.c
@@ -342,6 +342,7 @@ changelog_ev_dispatch (void *data)
while (1) {
/* TODO: change this to be pthread cond based.. later */
+
tv.tv_sec = 1;
tv.tv_usec = 0;
select (0, NULL, NULL, NULL, &tv);
@@ -363,6 +364,7 @@ changelog_ev_dispatch (void *data)
gf_msg (this->name, GF_LOG_WARNING, 0,
CHANGELOG_MSG_PUT_BUFFER_FAILED,
"failed to put buffer after consumption");
+
}
return NULL;
diff --git a/xlators/features/changelog/src/changelog.c b/xlators/features/changelog/src/changelog.c
index 697e8ca7b11..20af188d0d4 100644
--- a/xlators/features/changelog/src/changelog.c
+++ b/xlators/features/changelog/src/changelog.c
@@ -21,6 +21,7 @@
#include "changelog-messages.h"
#include <pthread.h>
+#include <signal.h>
#include "changelog-rpc.h"
#include "errno.h"
@@ -2098,6 +2099,7 @@ notify (xlator_t *this, int event, void *data, ...)
int ret = 0;
int ret1 = 0;
struct list_head queue = {0, };
+ int i = 0;
INIT_LIST_HEAD (&queue);
@@ -2105,6 +2107,20 @@ notify (xlator_t *this, int event, void *data, ...)
if (!priv)
goto out;
+ if (event == GF_EVENT_CLEANUP) {
+ if (priv->connector) {
+ (void) gf_thread_cleanup_xint (priv->connector);
+ priv->connector = 0;
+ }
+
+ for (; i < NR_DISPATCHERS; i++) {
+ if (priv->ev_dispatcher[i]) {
+ (void) gf_thread_cleanup_xint (priv->ev_dispatcher[i]);
+ priv->ev_dispatcher[i] = 0;
+ }
+ }
+ }
+
if (event == GF_EVENT_TRANSLATOR_OP) {
dict = data;
diff --git a/xlators/features/changetimerecorder/src/changetimerecorder.c b/xlators/features/changetimerecorder/src/changetimerecorder.c
index 574b627a825..1811cec420f 100644
--- a/xlators/features/changetimerecorder/src/changetimerecorder.c
+++ b/xlators/features/changetimerecorder/src/changetimerecorder.c
@@ -2297,6 +2297,32 @@ out:
return 0;
}
+int
+notify (xlator_t *this, int event, void *data, ...)
+{
+
+ gf_ctr_private_t *priv = NULL;
+ int ret = 0;
+
+ priv = this->private;
+
+ if (!priv)
+ goto out;
+
+ if (event == GF_EVENT_CLEANUP) {
+ if (fini_db (priv->_db_conn)) {
+ gf_msg (this->name, GF_LOG_WARNING, 0,
+ CTR_MSG_CLOSE_DB_CONN_FAILED, "Failed closing "
+ "db connection");
+ }
+ } else {
+ ret = default_notify (this, event, data);
+ }
+out:
+ return ret;
+
+}
+
int32_t
mem_acct_init (xlator_t *this)
{
diff --git a/xlators/features/index/src/index.c b/xlators/features/index/src/index.c
index 975d5f998bd..f0462dcb7eb 100644
--- a/xlators/features/index/src/index.c
+++ b/xlators/features/index/src/index.c
@@ -15,6 +15,7 @@
#include "common-utils.h"
#include "index-messages.h"
#include <ftw.h>
+#include <signal.h>
#define XATTROP_SUBDIR "xattrop"
#define DIRTY_SUBDIR "dirty"
@@ -2264,7 +2265,6 @@ init (xlator_t *this)
int ret = -1;
int64_t count = -1;
index_priv_t *priv = NULL;
- pthread_t thread;
pthread_attr_t w_attr;
gf_boolean_t mutex_inited = _gf_false;
gf_boolean_t cond_inited = _gf_false;
@@ -2381,7 +2381,7 @@ init (xlator_t *this)
count = index_fetch_link_count (this, XATTROP);
index_set_link_count (priv, count, XATTROP);
- ret = gf_thread_create (&thread, &w_attr, index_worker, this);
+ ret = gf_thread_create (&priv->thread, &w_attr, index_worker, this);
if (ret) {
gf_msg (this->name, GF_LOG_WARNING, ret,
INDEX_MSG_WORKER_THREAD_CREATE_FAILED,
@@ -2494,6 +2494,24 @@ int
notify (xlator_t *this, int event, void *data, ...)
{
int ret = 0;
+ index_priv_t *priv = NULL;
+
+ if (!this)
+ return 0;
+
+ priv = this->private;
+ if (!priv)
+ return 0;
+
+ switch (event) {
+ case GF_EVENT_CLEANUP:
+ if (priv->thread) {
+ (void) gf_thread_cleanup_xint (priv->thread);
+ priv->thread = 0;
+ }
+ break;
+ }
+
ret = default_notify (this, event, data);
return ret;
}
diff --git a/xlators/features/index/src/index.h b/xlators/features/index/src/index.h
index 5fb5a65cd8e..f622ceced5b 100644
--- a/xlators/features/index/src/index.h
+++ b/xlators/features/index/src/index.h
@@ -60,6 +60,7 @@ typedef struct index_priv {
dict_t *pending_watchlist;
dict_t *complete_watchlist;
int64_t pending_count;
+ pthread_t thread;
} index_priv_t;
typedef struct index_local {
diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c
index ef20689b614..789bc6e9ed1 100644
--- a/xlators/mgmt/glusterd/src/glusterd.c
+++ b/xlators/mgmt/glusterd/src/glusterd.c
@@ -1948,7 +1948,7 @@ notify (xlator_t *this, int32_t event, void *data, ...)
case GF_EVENT_POLLERR:
break;
- case GF_EVENT_TRANSPORT_CLEANUP:
+ case GF_EVENT_CLEANUP:
break;
default:
diff --git a/xlators/performance/io-threads/src/io-threads.c b/xlators/performance/io-threads/src/io-threads.c
index 1247e41c99e..6e2d4c90e50 100644
--- a/xlators/performance/io-threads/src/io-threads.c
+++ b/xlators/performance/io-threads/src/io-threads.c
@@ -1069,7 +1069,8 @@ notify (xlator_t *this, int32_t event, void *data, ...)
{
iot_conf_t *conf = this->private;
- if (GF_EVENT_PARENT_DOWN == event)
+ if ((GF_EVENT_PARENT_DOWN == event) ||
+ (GF_EVENT_CLEANUP == event))
iot_exit_threads (conf);
default_notify (this, event, data);
diff --git a/xlators/protocol/server/src/Makefile.am b/xlators/protocol/server/src/Makefile.am
index d65e5b89957..72f811e97fb 100644
--- a/xlators/protocol/server/src/Makefile.am
+++ b/xlators/protocol/server/src/Makefile.am
@@ -20,7 +20,8 @@ AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \
-DLIBDIR=\"$(libdir)/glusterfs/$(PACKAGE_VERSION)/auth\" \
-I$(top_srcdir)/xlators/protocol/lib/src \
-I$(top_srcdir)/rpc/rpc-lib/src \
- -I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src
+ -I$(top_srcdir)/rpc/xdr/src -I$(top_builddir)/rpc/xdr/src \
+ -I$(top_srcdir)/glusterfsd/src
AM_CFLAGS = -Wall $(GF_CFLAGS) \
-DDATADIR=\"$(localstatedir)\"
diff --git a/xlators/protocol/server/src/server-handshake.c b/xlators/protocol/server/src/server-handshake.c
index f00804a3d3a..f8f8f99f123 100644
--- a/xlators/protocol/server/src/server-handshake.c
+++ b/xlators/protocol/server/src/server-handshake.c
@@ -413,6 +413,7 @@ server_setvolume (rpcsvc_request_t *req)
int32_t fop_version = 0;
int32_t mgmt_version = 0;
glusterfs_ctx_t *ctx = NULL;
+ struct _child_status *tmp = NULL;
params = dict_new ();
reply = dict_new ();
@@ -512,13 +513,24 @@ server_setvolume (rpcsvc_request_t *req)
"initialised yet. Try again later");
goto fail;
}
-
- ret = dict_set_int32 (reply, "child_up", conf->child_up);
- if (ret < 0)
+ list_for_each_entry (tmp, &conf->child_status->status_list,
+ status_list) {
+ if (strcmp (tmp->name, name) == 0)
+ break;
+ }
+ if (!tmp->name) {
gf_msg (this->name, GF_LOG_ERROR, 0,
- PS_MSG_DICT_GET_FAILED, "Failed to set 'child_up' "
- "in the reply dict");
-
+ PS_MSG_CHILD_STATUS_FAILED,
+ "No xlator %s is found in "
+ "child status list", name);
+ } else {
+ ret = dict_set_int32 (reply, "child_up", tmp->child_up);
+ if (ret < 0)
+ gf_msg (this->name, GF_LOG_ERROR, 0,
+ PS_MSG_DICT_GET_FAILED,
+ "Failed to set 'child_up' for xlator %s "
+ "in the reply dict", tmp->name);
+ }
ret = dict_get_str (params, "process-uuid", &client_uid);
if (ret < 0) {
ret = dict_set_str (reply, "ERROR",
diff --git a/xlators/protocol/server/src/server-mem-types.h b/xlators/protocol/server/src/server-mem-types.h
index 9165249d49a..76a78ac3ede 100644
--- a/xlators/protocol/server/src/server-mem-types.h
+++ b/xlators/protocol/server/src/server-mem-types.h
@@ -28,6 +28,7 @@ enum gf_server_mem_types_ {
gf_server_mt_setvolume_rsp_t,
gf_server_mt_lock_mig_t,
gf_server_mt_compound_rsp_t,
+ gf_server_mt_child_status,
gf_server_mt_end,
};
#endif /* __SERVER_MEM_TYPES_H__ */
diff --git a/xlators/protocol/server/src/server-messages.h b/xlators/protocol/server/src/server-messages.h
index b8245af18df..14729ade852 100644
--- a/xlators/protocol/server/src/server-messages.h
+++ b/xlators/protocol/server/src/server-messages.h
@@ -40,7 +40,7 @@
*/
#define GLFS_PS_BASE GLFS_MSGID_COMP_PS
-#define GLFS_NUM_MESSAGES 91
+#define GLFS_NUM_MESSAGES 92
#define GLFS_MSGID_END (GLFS_PS_BASE + GLFS_NUM_MESSAGES + 1)
/* Messages with message IDs */
#define glfs_msg_start_x GLFS_PS_BASE, "Invalid: Start of messages"
@@ -857,6 +857,14 @@
*/
#define PS_MSG_CLIENT_OPVERSION_GET_FAILED (GLFS_PS_BASE + 91)
+
+/*!
+ * @messageid
+ * @diagnosis
+ * @recommendedaction
+ *
+ */
+#define PS_MSG_CHILD_STATUS_FAILED (GLFS_PS_BASE + 92)
/*------------*/
#define glfs_msg_end_x GLFS_MSGID_END, "Invalid: End of messages"
diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c
index 202fe71ba55..130a55372a6 100644
--- a/xlators/protocol/server/src/server.c
+++ b/xlators/protocol/server/src/server.c
@@ -23,6 +23,7 @@
#include "event.h"
#include "events.h"
#include "server-messages.h"
+#include "glusterfsd.h"
rpcsvc_cbk_program_t server_cbk_prog = {
.progname = "Gluster Callback",
@@ -1065,7 +1066,9 @@ init (xlator_t *this)
if (ret)
conf->conf_dir = CONFDIR;
- conf->child_up = _gf_false;
+ conf->child_status = GF_CALLOC (1, sizeof (struct _child_status),
+ gf_server_mt_child_status);
+ INIT_LIST_HEAD (&conf->child_status->status_list);
/*ret = dict_get_str (this->options, "statedump-path", &statedump_path);
if (!ret) {
@@ -1389,10 +1392,15 @@ server_process_child_event (xlator_t *this, int32_t event, void *data,
pthread_mutex_lock (&conf->mutex);
{
list_for_each_entry (xprt, &conf->xprt_list, list) {
- rpcsvc_callback_submit (conf->rpc, xprt,
- &server_cbk_prog,
- cbk_procnum,
- NULL, 0, NULL);
+ if (!xprt->xl_private) {
+ continue;
+ }
+ if (xprt->xl_private->bound_xl == data) {
+ rpcsvc_callback_submit (conf->rpc, xprt,
+ &server_cbk_prog,
+ cbk_procnum,
+ NULL, 0, NULL);
+ }
}
}
pthread_mutex_unlock (&conf->mutex);
@@ -1409,10 +1417,19 @@ notify (xlator_t *this, int32_t event, void *data, ...)
server_conf_t *conf = NULL;
rpc_transport_t *xprt = NULL;
rpc_transport_t *xp_next = NULL;
+ xlator_t *victim = NULL;
+ xlator_t *top = NULL;
+ xlator_t *travxl = NULL;
+ xlator_list_t **trav_p = NULL;
+ struct _child_status *tmp = NULL;
+ gf_boolean_t victim_found = _gf_false;
+ glusterfs_ctx_t *ctx = NULL;
GF_VALIDATE_OR_GOTO (THIS->name, this, out);
conf = this->private;
GF_VALIDATE_OR_GOTO (this->name, conf, out);
+ victim = data;
+ ctx = THIS->ctx;
switch (event) {
case GF_EVENT_UPCALL:
@@ -1441,7 +1458,24 @@ notify (xlator_t *this, int32_t event, void *data, ...)
case GF_EVENT_CHILD_UP:
{
- conf->child_up = _gf_true;
+ list_for_each_entry (tmp, &conf->child_status->status_list,
+ status_list) {
+ if (tmp->name == NULL)
+ break;
+ if (strcmp (tmp->name, victim->name) == 0)
+ break;
+ }
+ if (tmp->name) {
+ tmp->child_up = _gf_true;
+ } else {
+ tmp = GF_CALLOC (1, sizeof (struct _child_status),
+ gf_server_mt_child_status);
+ INIT_LIST_HEAD (&tmp->status_list);
+ tmp->name = gf_strdup (victim->name);
+ tmp->child_up = _gf_true;
+ list_add_tail (&tmp->status_list,
+ &conf->child_status->status_list);
+ }
ret = server_process_child_event (this, event, data,
GF_CBK_CHILD_UP);
if (ret) {
@@ -1450,14 +1484,25 @@ notify (xlator_t *this, int32_t event, void *data, ...)
"server_process_child_event failed");
goto out;
}
-
default_notify (this, event, data);
break;
}
case GF_EVENT_CHILD_DOWN:
{
- conf->child_up = _gf_false;
+ list_for_each_entry (tmp, &conf->child_status->status_list,
+ status_list) {
+ if (strcmp (tmp->name, victim->name) == 0) {
+ tmp->child_up = _gf_false;
+ break;
+ }
+ }
+ if (!tmp->name)
+ gf_msg (this->name, GF_LOG_ERROR, 0,
+ PS_MSG_CHILD_STATUS_FAILED,
+ "No xlator %s is found in "
+ "child status list", victim->name);
+
ret = server_process_child_event (this, event, data,
GF_CBK_CHILD_DOWN);
if (ret) {
@@ -1466,13 +1511,12 @@ notify (xlator_t *this, int32_t event, void *data, ...)
"server_process_child_event failed");
goto out;
}
-
default_notify (this, event, data);
break;
}
- case GF_EVENT_TRANSPORT_CLEANUP:
+ case GF_EVENT_CLEANUP:
conf = this->private;
pthread_mutex_lock (&conf->mutex);
/*
@@ -1493,8 +1537,37 @@ notify (xlator_t *this, int32_t event, void *data, ...)
rpc_transport_disconnect (xprt, _gf_false);
}
}
+ list_for_each_entry (tmp, &conf->child_status->status_list,
+ status_list) {
+ if (strcmp (tmp->name, victim->name) == 0)
+ break;
+ }
+ if (tmp->name && (strcmp (tmp->name, victim->name) == 0)) {
+ GF_FREE (tmp->name);
+ list_del (&tmp->status_list);
+ }
pthread_mutex_unlock (&conf->mutex);
- /* NB: do *not* propagate anywhere else */
+ if (this->ctx->active) {
+ top = this->ctx->active->first;
+ LOCK (&ctx->volfile_lock);
+ for (trav_p = &top->children; *trav_p;
+ trav_p = &(*trav_p)->next) {
+ travxl = (*trav_p)->xlator;
+ if (travxl &&
+ strcmp (travxl->name, victim->name) == 0) {
+ victim_found = _gf_true;
+ break;
+ }
+ }
+ UNLOCK (&ctx->volfile_lock);
+ if (victim_found)
+ (*trav_p) = (*trav_p)->next;
+ glusterfs_mgmt_pmap_signout (glusterfsd_ctx,
+ victim->name);
+ glusterfs_autoscale_threads (THIS->ctx, -1);
+ default_notify (victim, GF_EVENT_CLEANUP, data);
+
+ }
break;
default:
diff --git a/xlators/protocol/server/src/server.h b/xlators/protocol/server/src/server.h
index 0b37eb1414a..09a2d74ff2b 100644
--- a/xlators/protocol/server/src/server.h
+++ b/xlators/protocol/server/src/server.h
@@ -73,6 +73,12 @@ struct _volfile_ctx {
uint32_t checksum;
};
+struct _child_status {
+ struct list_head status_list;
+ char *name;
+ gf_boolean_t child_up;
+
+};
struct server_conf {
rpcsvc_t *rpc;
struct rpcsvc_config rpc_conf;
@@ -101,9 +107,7 @@ struct server_conf {
* in case if volume set options
* (say *.allow | *.reject) are
* tweeked */
- gf_boolean_t child_up; /* Set to true, when child is up, and
- * false, when child is down */
-
+ struct _child_status *child_status;
gf_lock_t itable_lock;
};
typedef struct server_conf server_conf_t;
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c
index 1a49af47a8b..52be925aae2 100644
--- a/xlators/storage/posix/src/posix-helpers.c
+++ b/xlators/storage/posix/src/posix-helpers.c
@@ -1411,6 +1411,7 @@ posix_janitor_thread_proc (void *data)
THIS = this;
while (1) {
+
time (&now);
if ((now - priv->last_landfill_check) > priv->janitor_sleep_duration) {
gf_msg_trace (this->name, 0,
@@ -1844,9 +1845,11 @@ posix_health_check_thread_proc (void *data)
xlator_list_t **trav_p = NULL;
int count = 0;
gf_boolean_t victim_found = _gf_false;
+ glusterfs_ctx_t *ctx = NULL;
this = data;
priv = this->private;
+ ctx = THIS->ctx;
/* prevent races when the interval is updated */
interval = priv->health_check_interval;
@@ -1896,10 +1899,12 @@ abort:
*/
if (this->ctx->active) {
top = this->ctx->active->first;
- for (trav_p = &top->children; *trav_p;
+ LOCK (&ctx->volfile_lock);
+ for (trav_p = &top->children; *trav_p;
trav_p = &(*trav_p)->next) {
- count++;
- }
+ count++;
+ }
+ UNLOCK (&ctx->volfile_lock);
}
if (count == 1) {
@@ -1919,20 +1924,21 @@ abort:
kill (getpid(), SIGKILL);
} else {
- for (trav_p = &top->children; *trav_p;
- trav_p = &(*trav_p)->next) {
- victim = (*trav_p)->xlator;
- if (victim &&
- strcmp (victim->name, priv->base_path) == 0) {
- victim_found = _gf_true;
- break;
+ LOCK (&ctx->volfile_lock);
+ for (trav_p = &top->children; *trav_p;
+ trav_p = &(*trav_p)->next) {
+ victim = (*trav_p)->xlator;
+ if (victim &&
+ strcmp (victim->name, priv->base_path) == 0) {
+ victim_found = _gf_true;
+ break;
+ }
}
- }
+ UNLOCK (&ctx->volfile_lock);
if (victim_found) {
- top->notify (top, GF_EVENT_TRANSPORT_CLEANUP, victim);
- glusterfs_mgmt_pmap_signout (glusterfsd_ctx,
- priv->base_path);
- glusterfs_autoscale_threads (THIS->ctx, -1);
+ gf_log (THIS->name, GF_LOG_INFO, "detaching not-only "
+ " child %s", priv->base_path);
+ top->notify (top, GF_EVENT_CLEANUP, victim);
}
}
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
index b1a529bcfee..754a45aa6fb 100644
--- a/xlators/storage/posix/src/posix.c
+++ b/xlators/storage/posix/src/posix.c
@@ -6626,6 +6626,9 @@ notify (xlator_t *this,
void *data,
...)
{
+ struct posix_private *priv = NULL;
+
+ priv = this->private;
switch (event)
{
case GF_EVENT_PARENT_UP:
@@ -6634,6 +6637,23 @@ notify (xlator_t *this,
default_notify (this, GF_EVENT_CHILD_UP, data);
}
break;
+ case GF_EVENT_CLEANUP:
+ if (priv->health_check) {
+ pthread_cancel (priv->health_check);
+ priv->health_check = 0;
+ }
+ if (priv->janitor) {
+ (void) gf_thread_cleanup_xint (priv->janitor);
+ priv->janitor = 0;
+ }
+ if (priv->fsyncer) {
+ (void) gf_thread_cleanup_xint (priv->fsyncer);
+ priv->fsyncer = 0;
+ }
+ if (priv->mount_lock)
+ (void) sys_closedir (priv->mount_lock);
+
+ break;
default:
/* */
break;