diff options
Diffstat (limited to 'xlators/cluster/dht/src/dht-common.c')
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 27 | 
1 files changed, 26 insertions, 1 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index cc409c9103d..367548f5b38 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -10373,6 +10373,8 @@ dht_rmdir(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,      dht_conf_t *conf = NULL;      int op_errno = -1;      int i = -1; +    int ret = -1; +    dict_t *xattr_req = NULL;      VALIDATE_OR_GOTO(frame, err);      VALIDATE_OR_GOTO(this, err); @@ -10404,14 +10406,37 @@ dht_rmdir(call_frame_t *frame, xlator_t *this, loc_t *loc, int flags,      if (flags) {          return dht_rmdir_do(frame, this);      } +    if (xdata) { +        xattr_req = dict_ref(xdata); +    } else { +        xattr_req = dict_new(); +    } +    if (xattr_req) { +        ret = dict_set_uint32(xattr_req, conf->link_xattr_name, 256); +        /* If parallel-readdir is enabled, this is required +         * to handle stale linkto files in the directory +         * being deleted. If this fails, log an error but +         * do not prevent the operation. +         */ +        if (ret) { +            gf_msg(this->name, GF_LOG_ERROR, 0, 0, "%s: failed to set key %s", +                   loc->path, conf->link_xattr_name); +        } +    } else { +        gf_msg(this->name, GF_LOG_ERROR, 0, 0, "%s: failed to set key %s", +               loc->path, conf->link_xattr_name); +    }      for (i = 0; i < conf->subvolume_cnt; i++) {          STACK_WIND_COOKIE(frame, dht_rmdir_opendir_cbk, conf->subvolumes[i],                            conf->subvolumes[i],                            conf->subvolumes[i]->fops->opendir, loc, local->fd, -                          NULL); +                          xattr_req);      } +    if (xattr_req) { +        dict_unref(xattr_req); +    }      return 0;  err:  | 
