diff options
| author | vmallika <vmallika@redhat.com> | 2015-04-30 12:35:40 +0530 | 
|---|---|---|
| committer | Raghavendra G <rgowdapp@redhat.com> | 2015-06-04 01:41:54 -0700 | 
| commit | fbb0fad96a51451f54369a85c7da3d02c14aff09 (patch) | |
| tree | 8522c1ae59b64ac799719f8c460db57fc0b3b267 | |
| parent | 0af7b774c85b184fcb8661b19c8925c0d0b74f2a (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>
| -rw-r--r-- | xlators/features/quota/src/quota.c | 29 | 
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);  | 
