3604df
From 5ba0024099166d16cea9c74769cc96492579c634 Mon Sep 17 00:00:00 2001
3604df
From: Pranith Kumar K <pkarampu@redhat.com>
3604df
Date: Fri, 27 Jan 2017 16:17:49 +0530
3604df
Subject: [PATCH 277/285] cluster/ec: Fix cthon failures observed with ec
3604df
 volumes
3604df
3604df
Since EC already winds one write after other there is no need to align
3604df
application fcntl locks with ec blocks. Also added this locking to be
3604df
done as a transaction to prevent partial upgrade/downgrade of locks
3604df
happening.
3604df
3604df
 >BUG: 1410425
3604df
 >Change-Id: I7ce8955c2174f62b11e5cb16140e30ff0f7c4c31
3604df
 >Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
3604df
 >Reviewed-on: https://review.gluster.org/16445
3604df
 >Smoke: Gluster Build System <jenkins@build.gluster.org>
3604df
 >Reviewed-by: Xavier Hernandez <xhernandez@datalab.es>
3604df
 >NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
3604df
 >CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
3604df
3604df
BUG: 1408705
3604df
Change-Id: I1a9dcebbc8362f4b8d7ae434df14a6a4734a5864
3604df
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
3604df
Reviewed-on: https://code.engineering.redhat.com/gerrit/96363
3604df
---
3604df
 xlators/cluster/ec/src/ec-locks.c | 37 ++++++++++++++++++++++++++-----------
3604df
 1 file changed, 26 insertions(+), 11 deletions(-)
3604df
3604df
diff --git a/xlators/cluster/ec/src/ec-locks.c b/xlators/cluster/ec/src/ec-locks.c
3604df
index bd52572..70b07c3 100644
3604df
--- a/xlators/cluster/ec/src/ec-locks.c
3604df
+++ b/xlators/cluster/ec/src/ec-locks.c
3604df
@@ -1012,10 +1012,6 @@ int32_t ec_manager_lk(ec_fop_data_t * fop, int32_t state)
3604df
     switch (state)
3604df
     {
3604df
         case EC_STATE_INIT:
3604df
-            fop->flock.l_len += ec_adjust_offset(fop->xl->private,
3604df
-                                                 &fop->flock.l_start, 1);
3604df
-            fop->flock.l_len = ec_adjust_size(fop->xl->private,
3604df
-                                              fop->flock.l_len, 1);
3604df
             if ((fop->int32 == F_SETLKW) && (fop->flock.l_type != F_UNLCK))
3604df
             {
3604df
                 fop->uint32 = EC_LOCK_MODE_ALL;
3604df
@@ -1024,6 +1020,12 @@ int32_t ec_manager_lk(ec_fop_data_t * fop, int32_t state)
3604df
 
3604df
         /* Fall through */
3604df
 
3604df
+        case EC_STATE_LOCK:
3604df
+            ec_lock_prepare_fd(fop, fop->fd, EC_UPDATE_DATA | EC_QUERY_INFO);
3604df
+            ec_lock(fop);
3604df
+
3604df
+            return EC_STATE_DISPATCH;
3604df
+
3604df
         case EC_STATE_DISPATCH:
3604df
             ec_dispatch_all(fop);
3604df
 
3604df
@@ -1037,20 +1039,20 @@ int32_t ec_manager_lk(ec_fop_data_t * fop, int32_t state)
3604df
                 ec_fop_set_error (fop, ec_lock_check(fop, &mask));
3604df
                 if (fop->error != 0) {
3604df
                     if (mask != 0) {
3604df
-                        ec_t *ec = fop->xl->private;
3604df
-                        struct gf_flock flock;
3604df
+                        struct gf_flock flock = {0};
3604df
 
3604df
                         flock.l_type = F_UNLCK;
3604df
                         flock.l_whence = fop->flock.l_whence;
3604df
-                        flock.l_start = fop->flock.l_start * ec->fragments;
3604df
-                        flock.l_len = fop->flock.l_len * ec->fragments;
3604df
-                        flock.l_pid = 0;
3604df
-                        flock.l_owner.len = 0;
3604df
+                        flock.l_start = fop->flock.l_start;
3604df
+                        flock.l_len = fop->flock.l_len;
3604df
+                        flock.l_pid = fop->flock.l_pid;
3604df
+                        lk_owner_copy (&flock.l_owner, &fop->flock.l_owner);
3604df
 
3604df
                         ec_lk(fop->frame, fop->xl, mask, 1,
3604df
                               ec_lock_lk_unlocked, NULL, fop->fd, F_SETLK,
3604df
                               &flock, fop->xdata);
3604df
                     }
3604df
+
3604df
                     if (fop->error < 0) {
3604df
                         fop->error = 0;
3604df
 
3604df
@@ -1078,9 +1080,10 @@ int32_t ec_manager_lk(ec_fop_data_t * fop, int32_t state)
3604df
                              cbk->op_errno, &cbk->flock, cbk->xdata);
3604df
             }
3604df
 
3604df
-            return EC_STATE_END;
3604df
+            return EC_STATE_LOCK_REUSE;
3604df
 
3604df
         case -EC_STATE_INIT:
3604df
+        case -EC_STATE_LOCK:
3604df
         case -EC_STATE_DISPATCH:
3604df
         case -EC_STATE_REPORT:
3604df
             GF_ASSERT(fop->error != 0);
3604df
@@ -1091,6 +1094,18 @@ int32_t ec_manager_lk(ec_fop_data_t * fop, int32_t state)
3604df
                              NULL, NULL);
3604df
             }
3604df
 
3604df
+            return EC_STATE_LOCK_REUSE;
3604df
+
3604df
+        case -EC_STATE_LOCK_REUSE:
3604df
+        case EC_STATE_LOCK_REUSE:
3604df
+            ec_lock_reuse(fop);
3604df
+
3604df
+            return EC_STATE_UNLOCK;
3604df
+
3604df
+        case -EC_STATE_UNLOCK:
3604df
+        case EC_STATE_UNLOCK:
3604df
+            ec_unlock(fop);
3604df
+
3604df
             return EC_STATE_END;
3604df
 
3604df
         default:
3604df
-- 
3604df
2.9.3
3604df