features/quota: prevent statfs frame-loss when an error happens during
authorvmallika <vmallika@redhat.com>
Thu, 30 Apr 2015 07:05:40 +0000 (12:35 +0530)
committerRaghavendra G <rgowdapp@redhat.com>
Mon, 1 Jun 2015 04:45:31 +0000 (21:45 -0700)
ancestry building.

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>
xlators/features/quota/src/quota.c

index d8bacb7924f7e8ae6359017bb8d6c07bb98a1d5b..e19dfe97bb1f43f7618ac4beaa8e7be57c4c2853 100644 (file)
@@ -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);