diff options
| -rw-r--r-- | xlators/features/marker/src/marker.c | 28 | ||||
| -rw-r--r-- | xlators/features/marker/src/marker.h | 3 | 
2 files changed, 28 insertions, 3 deletions
diff --git a/xlators/features/marker/src/marker.c b/xlators/features/marker/src/marker.c index a66b0fd03e0..47ce20f861a 100644 --- a/xlators/features/marker/src/marker.c +++ b/xlators/features/marker/src/marker.c @@ -143,6 +143,10 @@ marker_free_local (marker_local_t *local)  {          loc_wipe (&local->loc); +        if (local->oplocal) { +                loc_wipe (&local->oplocal->loc); +                GF_FREE (local->oplocal); +        }          GF_FREE (local);          return 0; @@ -696,6 +700,7 @@ marker_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  {          int32_t             ret     = 0;          marker_local_t     *local   = NULL; +        marker_local_t	   *oplocal = NULL;          if (op_ret == -1) {                  gf_log (this->name, GF_LOG_ERROR, "%s occured while " @@ -710,6 +715,11 @@ marker_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          STACK_UNWIND_STRICT (rename, frame, op_ret, op_errno, buf, preoldparent,                               postoldparent, prenewparent, postnewparent); +        oplocal = local->oplocal; +        local->oplocal = NULL; + +        //update marks on oldpath +        update_marks (this, oplocal, ret);          update_marks (this, local, ret);          return 0; @@ -717,17 +727,29 @@ marker_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  int32_t  marker_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc, -                loc_t *newloc) +               loc_t *newloc)  { -        int32_t          ret   = 0; -        marker_local_t  *local = NULL; +        int32_t          ret     = 0; +        marker_local_t  *local   = NULL; +        marker_local_t	*oplocal = NULL;          ALLOCATE_OR_GOTO (local, marker_local_t, err);          MARKER_INIT_LOCAL (frame, local); +        ALLOCATE_OR_GOTO (oplocal, marker_local_t, err); + +        MARKER_INIT_LOCAL (frame, oplocal); + +        frame->local = local; + +        local->oplocal = oplocal; +          ret = loc_copy (&local->loc, newloc); +        if (ret == -1) +                goto err; +        ret = loc_copy (&oplocal->loc, oldloc);          if (ret == -1)                  goto err; diff --git a/xlators/features/marker/src/marker.h b/xlators/features/marker/src/marker.h index 60567c3b828..eeb64a16a87 100644 --- a/xlators/features/marker/src/marker.h +++ b/xlators/features/marker/src/marker.h @@ -36,6 +36,7 @@                  _frame->local = _local;                         \                  _local->pid = _frame->root->pid;                \                  memset (&_local->loc, 0, sizeof (loc_t));       \ +                _local->oplocal = NULL;                         \          } while (0)  /* try alloc and if it fails, goto label */ @@ -53,6 +54,8 @@ struct marker_local{          uint32_t        timebuf[2];          pid_t           pid;          loc_t           loc; + +        struct marker_local *oplocal;  };  typedef struct marker_local marker_local_t;  | 
