From 555301094fff111c92034ee5103a059a4be5872c Mon Sep 17 00:00:00 2001 From: vmallika Date: Mon, 6 Jul 2015 16:18:45 +0530 Subject: quotad: create sock listener only after graph init is complete This is a backport of http://review.gluster.org/#/c/11552/ If FOPs are received before completing graph initialization, FOP path can crash while accessing uninitialized variables This patch fixes issue by not creating listener until graph initialization is complete and hence not receiving FOP request > Change-Id: I4771e376410843dff44bfe819329a4632523d266 > BUG: 1240254 > Signed-off-by: vmallika Change-Id: I6c5964a8334abdc26aa2813c13f09e796e22b10a BUG: 1240906 Signed-off-by: vmallika Reviewed-on: http://review.gluster.org/11570 Tested-by: Gluster Build System Tested-by: NetBSD Build System Reviewed-by: Raghavendra G --- xlators/features/quota/src/quotad-aggregator.c | 10 ++++++++ xlators/features/quota/src/quotad.c | 32 ++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 4 deletions(-) (limited to 'xlators/features') diff --git a/xlators/features/quota/src/quotad-aggregator.c b/xlators/features/quota/src/quotad-aggregator.c index 6c9c40a122f..8a7cfdca3f5 100644 --- a/xlators/features/quota/src/quotad-aggregator.c +++ b/xlators/features/quota/src/quotad-aggregator.c @@ -374,6 +374,11 @@ quotad_aggregator_init (xlator_t *this) priv = this->private; + if (priv->rpcsvc) { + /* Listener already created */ + return 0; + } + ret = dict_set_str (this->options, "transport.address-family", "unix"); if (ret) goto out; @@ -423,6 +428,11 @@ quotad_aggregator_init (xlator_t *this) ret = 0; out: + if (ret && priv->rpcsvc) { + GF_FREE (priv->rpcsvc); + priv->rpcsvc = NULL; + } + return ret; } diff --git a/xlators/features/quota/src/quotad.c b/xlators/features/quota/src/quotad.c index 243b943e986..028c8047141 100644 --- a/xlators/features/quota/src/quotad.c +++ b/xlators/features/quota/src/quotad.c @@ -11,6 +11,18 @@ #include "quotad-aggregator.h" #include "common-utils.h" +int +qd_notify (xlator_t *this, int32_t event, void *data, ...) +{ + switch (event) { + case GF_EVENT_PARENT_UP: + quotad_aggregator_init (this); + } + + default_notify (this, event, data); + return 0; +} + int32_t mem_acct_init (xlator_t *this) { @@ -147,6 +159,21 @@ qd_reconfigure (xlator_t *this, dict_t *options) void qd_fini (xlator_t *this) { + quota_priv_t *priv = NULL; + + if (this == NULL || this->private == NULL) + goto out; + + priv = this->private; + + if (priv->rpcsvc) { + GF_FREE (priv->rpcsvc); + priv->rpcsvc = NULL; + } + + GF_FREE (priv); + +out: return; } @@ -169,10 +196,6 @@ qd_init (xlator_t *this) this->private = priv; - ret = quotad_aggregator_init (this); - if (ret < 0) - goto err; - ret = 0; err: if (ret) { @@ -185,6 +208,7 @@ class_methods_t class_methods = { .init = qd_init, .fini = qd_fini, .reconfigure = qd_reconfigure, + .notify = qd_notify }; struct xlator_fops fops = { -- cgit