summaryrefslogtreecommitdiffstats
path: root/xlators/features/quota/src
diff options
context:
space:
mode:
authorvmallika <vmallika@redhat.com>2015-04-30 12:35:40 +0530
committerRaghavendra G <rgowdapp@redhat.com>2015-06-04 01:41:54 -0700
commitfbb0fad96a51451f54369a85c7da3d02c14aff09 (patch)
tree8522c1ae59b64ac799719f8c460db57fc0b3b267 /xlators/features/quota/src
parent0af7b774c85b184fcb8661b19c8925c0d0b74f2a (diff)
features/quota: prevent statfs frame loss when an error happens during ancestry
building This is a backport of http://review.gluster.org/#/c/9380/ > We do quota_build_ancestry in function 'quota_get_limit_dir', > suppose if quota_build_ancestry fails, then we don't have a > frame saved to continue the statfs FOP and client can hang. > > Change-Id: I92e25c1510d09444b9d4810afdb6b2a69dcd92c0 > BUG: 1178619 > Signed-off-by: Raghavendra G <rgowdapp@redhat.com> > Signed-off-by: vmallika <vmallika@redhat.com> > Reviewed-on: http://review.gluster.org/9380 > Tested-by: Gluster Build System <jenkins@build.gluster.com> Change-Id: I998f417d62d6ea4f57f237f547243d44c2da438c BUG: 1226792 Signed-off-by: vmallika <vmallika@redhat.com> Reviewed-on: http://review.gluster.org/11025 Tested-by: Gluster Build System <jenkins@build.gluster.com> Tested-by: NetBSD Build System <jenkins@build.gluster.org> Tested-by: Raghavendra G <rgowdapp@redhat.com> Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Diffstat (limited to 'xlators/features/quota/src')
-rw-r--r--xlators/features/quota/src/quota.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/xlators/features/quota/src/quota.c b/xlators/features/quota/src/quota.c
index a649df87005..621e849bb7f 100644
--- a/xlators/features/quota/src/quota.c
+++ b/xlators/features/quota/src/quota.c
@@ -4272,16 +4272,9 @@ quota_statfs_continue (call_frame_t *frame, xlator_t *this, inode_t *inode)
quota_local_t *local = frame->local;
int ret = -1;
- stub = fop_statfs_stub (frame, quota_statfs_helper,
- &local->loc, local->xdata);
- if (!stub)
- goto err;
-
LOCK (&local->lock);
{
local->inode = inode_ref (inode);
- local->link_count = 1;
- local->stub = stub;
}
UNLOCK (&local->lock);
@@ -4289,12 +4282,6 @@ quota_statfs_continue (call_frame_t *frame, xlator_t *this, inode_t *inode)
quota_statfs_validate_cbk);
if (0 > ret)
quota_handle_validate_error (local, -1, -ret);
- return;
-
-err:
- QUOTA_STACK_UNWIND (statfs, frame, -1, ENOMEM, NULL, NULL);
-
- return;
}
void
@@ -4361,6 +4348,7 @@ quota_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)
int8_t ignore_deem_statfs = 0;
quota_priv_t *priv = NULL;
quota_local_t *local = NULL;
+ call_stub_t *stub = NULL;
priv = this->private;
GF_ASSERT (loc);
@@ -4380,6 +4368,7 @@ quota_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)
op_errno = ENOMEM;
goto err;
}
+ frame->local = local;
ret = loc_copy (&local->loc, loc);
if (-1 == ret) {
@@ -4390,9 +4379,19 @@ quota_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)
if (xdata)
local->xdata = dict_ref (xdata);
- local->link_count = 1;
+ stub = fop_statfs_stub (frame, quota_statfs_helper,
+ &local->loc, local->xdata);
+ if (!stub) {
+ op_errno = ENOMEM;
+ goto err;
+ }
- frame->local = local;
+ LOCK (&local->lock);
+ {
+ local->link_count = 1;
+ local->stub = stub;
+ }
+ UNLOCK (&local->lock);
quota_get_limit_dir (frame, loc->inode, this);