summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/dht/src/dht-common.c
diff options
context:
space:
mode:
authorN Balachandran <nbalacha@redhat.com>2018-11-09 17:06:22 +0530
committerN Balachandran <nbalacha@redhat.com>2018-11-19 05:44:39 +0000
commit5664c58089127ba5214a7d922eed1aa1b4932402 (patch)
tree8b00b4601100faccb6e497d1b9255a8e825437bd /xlators/cluster/dht/src/dht-common.c
parent5af9799ab7c6185a852c48ef6b8655d294a50d2d (diff)
cluster/dht: sync brick root perms on add brick
If a single brick is added to the volume and the newly added brick is the first to respond to a dht_revalidate call, its stbuf will not be merged into local->stbuf as the brick does not yet have a layout. The is_permission_different check therefore fails to detect that an attr heal is required as it only considers the stbuf values from existing bricks. To fix this, merge all stbuf values into local->stbuf and use local->prebuf to store the correct directory attributes. Change-Id: Ic9e8b04a1ab9ed1248b6b056e3450bbafe32e1bc fixes: bz#1648298 Signed-off-by: N Balachandran <nbalacha@redhat.com>
Diffstat (limited to 'xlators/cluster/dht/src/dht-common.c')
-rw-r--r--xlators/cluster/dht/src/dht-common.c25
1 files changed, 9 insertions, 16 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c
index f64109303c5..24402399597 100644
--- a/xlators/cluster/dht/src/dht-common.c
+++ b/xlators/cluster/dht/src/dht-common.c
@@ -1619,13 +1619,16 @@ dht_revalidate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,
if (is_dir) {
ret = dht_dir_has_layout(xattr, conf->xattr_name);
if (ret >= 0) {
- if (is_greater_time(local->stbuf.ia_ctime,
- local->stbuf.ia_ctime_nsec, stbuf->ia_ctime,
- stbuf->ia_ctime_nsec)) {
+ if (is_greater_time(local->prebuf.ia_ctime,
+ local->prebuf.ia_ctime_nsec,
+ stbuf->ia_ctime, stbuf->ia_ctime_nsec)) {
/* Choose source */
local->prebuf.ia_gid = stbuf->ia_gid;
local->prebuf.ia_uid = stbuf->ia_uid;
+ local->prebuf.ia_ctime = stbuf->ia_ctime;
+ local->prebuf.ia_ctime_nsec = stbuf->ia_ctime_nsec;
+
if (__is_root_gfid(stbuf->ia_gfid))
local->prebuf.ia_prot = stbuf->ia_prot;
}
@@ -1687,19 +1690,9 @@ dht_revalidate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,
}
}
- /* Update stbuf from the servers where layout is present. This
- * is an indication that the server is not a newly added brick.
- * Merging stbuf from newly added brick may result in the added
- * brick being the source of heal for uid/gid */
- if (!is_dir ||
- (is_dir && dht_dir_has_layout(xattr, conf->xattr_name) >= 0) ||
- conf->subvolume_cnt == 1) {
- dht_iatt_merge(this, &local->stbuf, stbuf);
- dht_iatt_merge(this, &local->postparent, postparent);
- } else {
- /* copy the gfid anyway */
- gf_uuid_copy(local->stbuf.ia_gfid, stbuf->ia_gfid);
- }
+ gf_uuid_copy(local->stbuf.ia_gfid, stbuf->ia_gfid);
+ dht_iatt_merge(this, &local->stbuf, stbuf);
+ dht_iatt_merge(this, &local->postparent, postparent);
local->op_ret = 0;