summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/features/marker/src/marker.c10
-rw-r--r--xlators/features/marker/src/marker.h13
2 files changed, 23 insertions, 0 deletions
diff --git a/xlators/features/marker/src/marker.c b/xlators/features/marker/src/marker.c
index b4cf50800..3edbd7da0 100644
--- a/xlators/features/marker/src/marker.c
+++ b/xlators/features/marker/src/marker.c
@@ -1018,6 +1018,9 @@ marker_rename_release_oldp_lock (call_frame_t *frame, void *cookie,
local->err = op_errno;
}
+ //Reset frame uid and gid if reset.
+ MARKER_SET_UID_GID (frame->root, local);
+
lock.l_type = F_UNLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
@@ -1085,6 +1088,13 @@ marker_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
goto quota_err;
}
+ /* Removexattr requires uid and gid to be 0,
+ * reset them in the callback.
+ */
+ MARKER_SET_UID_GID (local, frame->root);
+ frame->root->uid = 0;
+ frame->root->gid = 0;
+
STACK_WIND (frame, marker_rename_release_oldp_lock,
FIRST_CHILD(this),
FIRST_CHILD(this)->fops->removexattr, &local->loc,
diff --git a/xlators/features/marker/src/marker.h b/xlators/features/marker/src/marker.h
index a5a435e3b..3e1990278 100644
--- a/xlators/features/marker/src/marker.h
+++ b/xlators/features/marker/src/marker.h
@@ -47,6 +47,8 @@ enum {
_local->pid = _frame->root->pid; \
memset (&_local->loc, 0, sizeof (loc_t)); \
_local->ref = 1; \
+ _local->uid = -1; \
+ _local->gid = -1; \
LOCK_INIT (&_local->lock); \
_local->oplocal = NULL; \
} while (0)
@@ -62,12 +64,23 @@ enum {
} \
} while (0)
+#define MARKER_SET_UID_GID(dest, src) \
+ do { \
+ if (src->uid != -1 && \
+ src->gid != -1) { \
+ dest->uid = src->uid; \
+ dest->gid = src->gid; \
+ } \
+ } while (0)
+
struct marker_local{
uint32_t timebuf[2];
pid_t pid;
loc_t loc;
loc_t parent_loc;
loc_t *next_lock_on;
+ uid_t uid;
+ gid_t gid;
int32_t ref;
int32_t ia_nlink;
gf_lock_t lock;