summaryrefslogtreecommitdiffstats
path: root/xlators/features/gfid-access
diff options
context:
space:
mode:
authorKotresh HR <khiremat@redhat.com>2015-09-15 16:56:01 +0530
committerVenky Shankar <vshankar@redhat.com>2015-11-10 02:22:23 -0800
commitc0522295f42c57565610d186da1400730b6a68d1 (patch)
tree896c7820e3d98574997ee8dccd2894672e776f67 /xlators/features/gfid-access
parent4ac2ff18db62db192c49affd8591e846c810667a (diff)
features/gfid-access: Fix entry creation via setxattr for geo-rep
GEO-REP INTEROP WITH SHARD FEATURE Problem: Geo-replication uses setxattr interface of gfid-access xlator to create entries and send explicit setattr after entry creation to set uid and gid. But between entry creation and setattr, the inode would not be linked. Hence operation which accesses inode structure during setattr by any the below xlator fails. Solution: Linking inode would seem the obvious solution but, gfid-access xlator cannot link inodes and maintain it as it would result in same inode pointing to two different paths one being virtual .gfid/<gfid> path and other being actual path. The solution is to set uid and gid in frame->root->uid and frame->root->gid respectively from which posix extracts and sets. Change-Id: Ic0749ee471432caeb8ded3152a07de6e64d8538d BUG: 1265148 Signed-off-by: Kotresh HR <khiremat@redhat.com> Reviewed-on: http://review.gluster.org/12206 Tested-by: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Aravinda VK <avishwan@redhat.com> Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Venky Shankar <vshankar@redhat.com>
Diffstat (limited to 'xlators/features/gfid-access')
-rw-r--r--xlators/features/gfid-access/src/gfid-access.c47
1 files changed, 2 insertions, 45 deletions
diff --git a/xlators/features/gfid-access/src/gfid-access.c b/xlators/features/gfid-access/src/gfid-access.c
index 1c3ff849ebc..a714b66a34d 100644
--- a/xlators/features/gfid-access/src/gfid-access.c
+++ b/xlators/features/gfid-access/src/gfid-access.c
@@ -392,33 +392,6 @@ ga_heal_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
return 0;
}
-static int32_t
-ga_newentry_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno, struct iatt *statpre,
- struct iatt *statpost,
- dict_t *xdata)
-{
- ga_local_t *local = NULL;
-
- local = frame->local;
- frame->local = NULL;
-
- /* don't worry about inode linking and other stuff. They'll happen on
- * the next lookup.
- */
- STACK_DESTROY (frame->root);
-
- STACK_UNWIND_STRICT (setxattr, local->orig_frame, op_ret,
- op_errno, xdata);
-
- if (local->xdata)
- dict_unref (local->xdata);
- loc_wipe (&local->loc);
- mem_put (local);
-
- return 0;
-}
-
static int
ga_newentry_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno,
@@ -427,24 +400,9 @@ ga_newentry_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
dict_t *xdata)
{
ga_local_t *local = NULL;
- struct iatt temp_stat = {0,};
local = frame->local;
- /* no need to proceed if things don't look good here */
- if (op_ret == -1)
- goto done;
-
- temp_stat.ia_uid = local->uid;
- temp_stat.ia_gid = local->gid;
-
- STACK_WIND (frame, ga_newentry_setattr_cbk, FIRST_CHILD (this),
- FIRST_CHILD (this)->fops->setattr, &local->loc, &temp_stat,
- (GF_SET_ATTR_UID | GF_SET_ATTR_GID), xdata);
-
- return 0;
-
-done:
/* don't worry about inode linking and other stuff. They'll happen on
* the next lookup.
*/
@@ -536,12 +494,11 @@ ga_new_entry (call_frame_t *frame, xlator_t *this, loc_t *loc, data_t *data,
local = mem_get0 (this->local_pool);
local->orig_frame = frame;
- local->uid = args->uid;
- local->gid = args->gid;
-
loc_copy (&local->loc, &tmp_loc);
new_frame->local = local;
+ new_frame->root->uid = args->uid;
+ new_frame->root->gid = args->gid;
if (S_ISDIR (args->st_mode)) {
STACK_WIND (new_frame, ga_newentry_cbk,