diff options
Diffstat (limited to 'xlators/features/marker')
-rw-r--r-- | xlators/features/marker/src/marker-quota-helper.c | 30 | ||||
-rw-r--r-- | xlators/features/marker/src/marker-quota.c | 4 | ||||
-rw-r--r-- | xlators/features/marker/src/marker-quota.h | 21 | ||||
-rw-r--r-- | xlators/features/marker/src/marker.c | 45 |
4 files changed, 75 insertions, 25 deletions
diff --git a/xlators/features/marker/src/marker-quota-helper.c b/xlators/features/marker/src/marker-quota-helper.c index af5fed13..0c51aa75 100644 --- a/xlators/features/marker/src/marker-quota-helper.c +++ b/xlators/features/marker/src/marker-quota-helper.c @@ -154,9 +154,10 @@ out: inode_contribution_t * -__mq_add_new_contribution_node (xlator_t *this, quota_inode_ctx_t *ctx, loc_t *loc) +__mq_add_new_contribution_node (xlator_t *this, quota_inode_ctx_t *ctx, + loc_t *loc) { - int32_t ret = 0; + int32_t ret = 0; inode_contribution_t *contribution = NULL; if (!loc->parent) { @@ -170,9 +171,10 @@ __mq_add_new_contribution_node (xlator_t *this, quota_inode_ctx_t *ctx, loc_t *l goto out; } - list_for_each_entry (contribution, &ctx->contribution_head, contri_list) { + list_for_each_entry (contribution, &ctx->contribution_head, + contri_list) { if (loc->parent && - uuid_compare (contribution->gfid, loc->parent->gfid) == 0) { + uuid_compare (contribution->gfid, loc->parent->gfid) == 0) { goto out; } } @@ -196,14 +198,16 @@ out: inode_contribution_t * -mq_add_new_contribution_node (xlator_t *this, quota_inode_ctx_t *ctx, loc_t *loc) +mq_add_new_contribution_node (xlator_t *this, quota_inode_ctx_t *ctx, + loc_t *loc) { inode_contribution_t *contribution = NULL; if ((ctx == NULL) || (loc == NULL)) return NULL; - if (strcmp (loc->path, "/") == 0) + if (((loc->path) && (strcmp (loc->path, "/") == 0)) + || (!loc->path && uuid_is_null (loc->pargfid))) return NULL; LOCK (&ctx->lock); @@ -226,12 +230,16 @@ mq_dict_set_contribution (xlator_t *this, dict_t *dict, GF_VALIDATE_OR_GOTO ("marker", this, out); GF_VALIDATE_OR_GOTO ("marker", dict, out); GF_VALIDATE_OR_GOTO ("marker", loc, out); - GF_VALIDATE_OR_GOTO ("marker", loc->parent, out); - GET_CONTRI_KEY (contri_key, loc->parent->gfid, ret); - if (ret < 0) { - ret = -1; - goto out; + if (loc->parent) { + GET_CONTRI_KEY (contri_key, loc->parent->gfid, ret); + if (ret < 0) { + ret = -1; + goto out; + } + } else { + /* nameless lookup, fetch contributions to all parents */ + GET_CONTRI_KEY (contri_key, NULL, ret); } ret = dict_set_int64 (dict, contri_key, 0); diff --git a/xlators/features/marker/src/marker-quota.c b/xlators/features/marker/src/marker-quota.c index fea7c5f0..e0028b34 100644 --- a/xlators/features/marker/src/marker-quota.c +++ b/xlators/features/marker/src/marker-quota.c @@ -2106,7 +2106,7 @@ mq_inspect_directory_xattr (xlator_t *this, } } - if (strcmp (loc->path, "/") != 0) { + if (!loc->path || (loc->path && strcmp (loc->path, "/") != 0)) { contribution = mq_add_new_contribution_node (this, ctx, loc); if (contribution == NULL) { if (!uuid_is_null (loc->inode->gfid)) @@ -2274,7 +2274,7 @@ mq_req_xattr (xlator_t *this, goto set_size; //if not "/" then request contribution - if (strcmp (loc->path, "/") == 0) + if (loc->path && strcmp (loc->path, "/") == 0) goto set_size; ret = mq_dict_set_contribution (this, dict, loc); diff --git a/xlators/features/marker/src/marker-quota.h b/xlators/features/marker/src/marker-quota.h index ae30d1a3..42def9d2 100644 --- a/xlators/features/marker/src/marker-quota.h +++ b/xlators/features/marker/src/marker-quota.h @@ -59,13 +59,20 @@ ret = 0; \ } while (0); -#define GET_CONTRI_KEY(var, _gfid, _ret) \ - do { \ - char _gfid_unparsed[40]; \ - uuid_unparse (_gfid, _gfid_unparsed); \ - _ret = snprintf (var, CONTRI_KEY_MAX, QUOTA_XATTR_PREFIX \ - ".%s.%s." CONTRIBUTION, "quota", \ - _gfid_unparsed); \ +#define GET_CONTRI_KEY(var, _gfid, _ret) \ + do { \ + if (_gfid != NULL) { \ + char _gfid_unparsed[40]; \ + uuid_unparse (_gfid, _gfid_unparsed); \ + _ret = snprintf (var, CONTRI_KEY_MAX, \ + QUOTA_XATTR_PREFIX \ + ".%s.%s." CONTRIBUTION, "quota", \ + _gfid_unparsed); \ + } else { \ + _ret = snprintf (var, CONTRI_KEY_MAX, \ + QUOTA_XATTR_PREFIX \ + ".%s.." CONTRIBUTION, "quota"); \ + } \ } while (0); #define QUOTA_SAFE_INCREMENT(lock, var) \ diff --git a/xlators/features/marker/src/marker.c b/xlators/features/marker/src/marker.c index 73c289d4..51e56260 100644 --- a/xlators/features/marker/src/marker.c +++ b/xlators/features/marker/src/marker.c @@ -281,6 +281,38 @@ marker_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno, dict_t *dict, dict_t *xdata) { + gf_dirent_t *head = NULL, *entry = NULL; + loc_t loc = {0, }; + inode_t *parent = NULL; + int ret = 0; + + ret = dict_get_bin (dict, GET_ANCESTRY_DENTRY_KEY, (void **)&head); + + if ((ret == 0) && head) { + list_for_each_entry (entry, &head->list, list) { + if (entry->inode == entry->inode->table->root) { + loc.path = gf_strdup ("/"); + inode_unref (parent); + parent = NULL; + } + + loc.inode = inode_ref (entry->inode); + + if (parent != NULL) { + loc.parent = inode_ref (parent); + uuid_copy (loc.pargfid, parent->gfid); + } + + uuid_copy (loc.gfid, entry->inode->gfid); + + mq_xattr_state (this, &loc, entry->dict, entry->d_stat); + + inode_unref (parent); + parent = inode_ref (entry->inode); + loc_wipe (&loc); + } + } + if (cookie) { gf_log (this->name, GF_LOG_DEBUG, "Filtering the quota extended attributes"); @@ -303,13 +335,16 @@ marker_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, priv = this->private; - if (priv == NULL || (priv->feature_enabled & GF_XTIME) == 0) - goto wind; - gf_log (this->name, GF_LOG_DEBUG, "USER:PID = %d", frame->root->pid); - ret = call_from_special_client (frame, this, name); -wind: + if ((priv->feature_enabled & GF_QUOTA) && name + && (strcmp (name, GET_ANCESTRY_DENTRY_KEY) == 0) + && xdata) + mq_req_xattr (this, loc, xdata); + + if (priv && priv->feature_enabled & GF_XTIME) + ret = call_from_special_client (frame, this, name); + if (ret == _gf_false) { if (name == NULL) { /* Signifies that marker translator |