From 426c6e6b24748c0826cc97e8f736bc87a1c8df04 Mon Sep 17 00:00:00 2001 From: Junaid Date: Mon, 25 Jul 2011 14:59:25 +0530 Subject: features/marker-quota: Perform removexattr with frame uid and gid set to root. Change-Id: Iabd8ff835c76d828e4af50ce4941d2ff86797eee BUG: 3194 Reviewed-on: http://review.gluster.com/99 Tested-by: Gluster Build System Reviewed-by: Raghavendra G --- xlators/features/marker/src/marker.c | 10 ++++++++++ xlators/features/marker/src/marker.h | 13 +++++++++++++ 2 files changed, 23 insertions(+) diff --git a/xlators/features/marker/src/marker.c b/xlators/features/marker/src/marker.c index b4cf5080071..3edbd7da058 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 8f4e11a5beb..b18bd33427f 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; -- cgit