diff options
author | Raghavendra G <rgowdapp@redhat.com> | 2013-08-27 18:12:56 +0530 |
---|---|---|
committer | Raghavendra G <rgowdapp@redhat.com> | 2013-09-10 11:06:09 +0530 |
commit | 783370088ed26f0b7ff520a6a629649bdad2f82b (patch) | |
tree | d566fb5fe68fd306fcb2c8367f58b0406c309616 | |
parent | 372bd28db095daa99503dc964d211965ce1f7b83 (diff) |
features/quota: Don't error out if ctx is not set in inode.
This patch addresses the issues we might run into in the time-window
between crawler starts to build quota state and the crawler actually
reaches the inode. In this time-window, quota is enabled but context
of the inode in question is not populated.
Change-Id: I10ba66d9aa3680e6c46f8f599e77fc39cc9601c5
BUG: 969461
Signed-off-by: Raghavendra G <rgowdapp@redhat.com>
-rw-r--r-- | xlators/features/quota/src/quota.c | 215 |
1 files changed, 129 insertions, 86 deletions
diff --git a/xlators/features/quota/src/quota.c b/xlators/features/quota/src/quota.c index 13f5136c..07e5adb4 100644 --- a/xlators/features/quota/src/quota.c +++ b/xlators/features/quota/src/quota.c @@ -431,23 +431,20 @@ quota_build_ancestry_cbk (call_frame_t *frame, void *cookie, xlator_t *this, quota_inode_ctx_get (local->validate_loc.inode, this, &ctx, 0); - if (ctx == NULL) { - op_errno = EINVAL; - goto err; - } - local->link_count = 0; - LOCK (&ctx->lock); - { - list_for_each_entry (dentry, &ctx->parents, next) { - tmp = __quota_dentry_new (NULL, dentry->name, - dentry->par); - list_add_tail (&tmp->next, &parents); - local->link_count++; + if (ctx != NULL) { + LOCK (&ctx->lock); + { + list_for_each_entry (dentry, &ctx->parents, next) { + tmp = __quota_dentry_new (NULL, dentry->name, + dentry->par); + list_add_tail (&tmp->next, &parents); + local->link_count++; + } } + UNLOCK (&ctx->lock); } - UNLOCK (&ctx->lock); if (local->link_count != 0) { list_for_each_entry_safe (dentry, tmp, &parents, next) { @@ -504,10 +501,10 @@ quota_build_ancestry (call_frame_t *frame, inode_t *inode, xlator_t *this) gf_log (this->name, GF_LOG_DEBUG, "building ancestry for inode (%s)", uuid_utoa (inode->gfid)); - /* This would ask posix layer to construct dentry chain till root */ - STACK_WIND (frame, quota_build_ancestry_cbk, FIRST_CHILD(this), - FIRST_CHILD(this)->fops->getxattr, &local->validate_loc, - GET_ANCESTRY_DENTRY_KEY, xdata); + /* This would ask posix layer to construct dentry chain till root */ + STACK_WIND (frame, quota_build_ancestry_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->getxattr, &local->validate_loc, + GET_ANCESTRY_DENTRY_KEY, xdata); ret = 0; err: @@ -914,7 +911,7 @@ quota_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc, wind: STACK_WIND (frame, - priv->is_quota_on? quota_lookup_cbk: default_lookup_cbk, + priv->is_quota_on ? quota_lookup_cbk : default_lookup_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->lookup, loc, xattr_req); @@ -1108,7 +1105,7 @@ quota_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, struct iovec *vector, int32_t count, off_t off, uint32_t flags, struct iobref *iobref, dict_t *xdata) { - quota_priv_t *priv = NULL; + quota_priv_t *priv = NULL; int32_t ret = -1, op_errno = EINVAL; int32_t parents = 0; uint64_t size = 0; @@ -1138,10 +1135,11 @@ quota_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, ret = quota_inode_ctx_get (fd->inode, this, &ctx, 0); if (ctx == NULL) { - gf_log (this->name, GF_LOG_WARNING, - "quota context not set in inode (gfid:%s)", + gf_log (this->name, GF_LOG_DEBUG, "quota context is NULL on " + "inode (%s). " + "If quota is not enabled recently and crawler has " + "finished crawling, its an error", uuid_utoa (fd->inode->gfid)); - goto unwind; } stub = fop_writev_stub (frame, quota_writev_helper, fd, vector, count, @@ -1155,16 +1153,18 @@ quota_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, GF_VALIDATE_OR_GOTO (this->name, priv, unwind); size = iov_length (vector, count); - LOCK (&ctx->lock); - { - list_for_each_entry (dentry, &ctx->parents, next) { - tmp = __quota_dentry_new (NULL, dentry->name, - dentry->par); - list_add_tail (&tmp->next, &head); - parents++; + if (ctx != NULL) { + LOCK (&ctx->lock); + { + list_for_each_entry (dentry, &ctx->parents, next) { + tmp = __quota_dentry_new (NULL, dentry->name, + dentry->par); + list_add_tail (&tmp->next, &head); + parents++; + } } + UNLOCK (&ctx->lock); } - UNLOCK (&ctx->lock); local->delta = size; @@ -1172,9 +1172,6 @@ quota_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, local->stub = stub; if (parents == 0) { - /* nameless lookup on this inode, allow quota to reconstruct - * ancestry as part of check_limit. - */ local->link_count = 1; quota_check_limit (frame, fd->inode, this, NULL, NULL); } else { @@ -1192,9 +1189,8 @@ unwind: return 0; wind: - STACK_WIND (frame, - priv->is_quota_on? quota_writev_cbk: default_writev_cbk, - FIRST_CHILD(this), FIRST_CHILD(this)->fops->writev, fd, + STACK_WIND (frame, default_writev_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->writev, fd, vector, count, off, flags, iobref, xdata); return 0; } @@ -1577,11 +1573,11 @@ quota_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this, ret = quota_inode_ctx_get (inode, this, &ctx, 0); if ((ret == -1) || (ctx == NULL)) { - gf_log (this->name, GF_LOG_WARNING, "cannot find quota " - "context in %s (gfid:%s)", local->loc.path, + gf_log (this->name, GF_LOG_DEBUG, "quota context is NULL on " + "inode (%s). " + "If quota is not enabled recently and crawler has " + "finished crawling, its an error", uuid_utoa (inode->gfid)); - op_ret = -1; - op_errno = EINVAL; goto out; } @@ -1677,13 +1673,20 @@ quota_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc, WIND_IF_QUOTAOFF (priv->is_quota_on, wind); + quota_inode_ctx_get (oldloc->inode, this, &ctx, 0); + if (ctx == NULL) { + gf_log (this->name, GF_LOG_DEBUG, "quota context is NULL on " + "inode (%s). " + "If quota is not enabled recently and crawler has " + "finished crawling, its an error", + uuid_utoa (oldloc->inode->gfid)); + } local = quota_local_new (); if (local == NULL) { goto err; } - frame->local = (void *) local; if (xdata && dict_get (xdata, GLUSTERFS_INTERNAL_FOP_KEY)) { @@ -1704,16 +1707,7 @@ quota_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc, local->link_count = 1; local->stub = stub; - local->delta = ctx->buf.ia_blocks * 512; - - ret = quota_inode_ctx_get (oldloc->inode, this, &ctx, 0); - if (ctx == NULL) { - gf_log (this->name, GF_LOG_WARNING, - "quota context not set in inode (gfid:%s)", - oldloc->inode ? uuid_utoa (oldloc->inode->gfid) : "0"); - op_errno = EINVAL; - goto err; - } + local->delta = (ctx != NULL) ? ctx->buf.ia_blocks * 512 : 0; quota_check_limit (frame, newloc->parent, this, NULL, NULL); return 0; @@ -1727,7 +1721,7 @@ err: return 0; wind: - STACK_WIND (frame, priv->is_quota_on? quota_link_cbk: default_link_cbk, + STACK_WIND (frame, default_link_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->link, oldloc, newloc, xdata); return 0; @@ -1779,11 +1773,12 @@ quota_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this, ret = quota_inode_ctx_get (local->oldloc.inode, this, &ctx, 0); if ((ret == -1) || (ctx == NULL)) { - gf_log (this->name, GF_LOG_WARNING, "quota context not" - "set in inode(gfid:%s)", + gf_log (this->name, GF_LOG_DEBUG, "quota context is NULL on " + "inode (%s). " + "If quota is not enabled recently and crawler has " + "finished crawling, its an error", uuid_utoa (local->oldloc.inode->gfid)); - op_ret = -1; - op_errno = EINVAL; + goto out; } @@ -1934,13 +1929,15 @@ quota_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc, ret = quota_inode_ctx_get (oldloc->inode, this, &ctx, 0); if (ctx == NULL) { gf_log (this->name, GF_LOG_WARNING, - "quota context not set in inode (gfid:%s)", + "quota context not set in inode (gfid:%s), " + "considering file size as zero while enforcing " + "quota on new ancestry", oldloc->inode ? uuid_utoa (oldloc->inode->gfid) : "0"); - op_errno = EINVAL; - goto err; + local->delta = 0; + } else { + local->delta = ctx->buf.ia_blocks * 512; } - local->delta = ctx->buf.ia_blocks * 512; } else { local->delta = 0; } @@ -1954,8 +1951,7 @@ err: return 0; wind: - STACK_WIND (frame, - priv->is_quota_on? quota_rename_cbk: default_rename_cbk, + STACK_WIND (frame, default_rename_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->rename, oldloc, newloc, xdata); @@ -1985,9 +1981,12 @@ quota_symlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this, quota_inode_ctx_get (local->loc.inode, this, &ctx, 1); if (ctx == NULL) { - gf_log (this->name, GF_LOG_WARNING, - "quota context not set in inode (gfid:%s)", + gf_log (this->name, GF_LOG_DEBUG, "quota context is NULL on " + "inode (%s). " + "If quota is not enabled recently and crawler has " + "finished crawling, its an error", uuid_utoa (local->loc.inode->gfid)); + goto out; } @@ -2130,8 +2129,10 @@ quota_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this, quota_inode_ctx_get (local->loc.inode, this, &ctx, 0); if (ctx == NULL) { - gf_log (this->name, GF_LOG_WARNING, - "quota context not set in inode (gfid:%s)", + gf_log (this->name, GF_LOG_DEBUG, "quota context is NULL on " + "inode (%s). " + "If quota is not enabled recently and crawler has " + "finished crawling, its an error", uuid_utoa (local->loc.inode->gfid)); goto out; } @@ -2214,8 +2215,10 @@ quota_ftruncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this, quota_inode_ctx_get (local->loc.inode, this, &ctx, 0); if (ctx == NULL) { - gf_log (this->name, GF_LOG_WARNING, - "quota context not set in inode (gfid:%s)", + gf_log (this->name, GF_LOG_DEBUG, "quota context is NULL on " + "inode (%s). " + "If quota is not enabled recently and crawler has " + "finished crawling, its an error", uuid_utoa (local->loc.inode->gfid)); goto out; } @@ -2372,6 +2375,15 @@ quota_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, quota_inode_ctx_get (local->loc.inode, this, &ctx, 0); if (ctx == NULL) { + if (!IA_ISDIR (buf->ia_type)) { + gf_log (this->name, GF_LOG_DEBUG, + "quota context is NULL on " + "inode (%s). " + "If quota is not enabled recently and crawler " + "has finished crawling, its an error", + uuid_utoa (local->loc.inode->gfid)); + } + goto out; } @@ -2444,6 +2456,15 @@ quota_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, quota_inode_ctx_get (local->loc.inode, this, &ctx, 0); if (ctx == NULL) { + if (!IA_ISDIR (buf->ia_type)) { + gf_log (this->name, GF_LOG_DEBUG, + "quota context is NULL on " + "inode (%s). " + "If quota is not enabled recently and crawler " + "has finished crawling, its an error", + uuid_utoa (local->loc.inode->gfid)); + } + goto out; } @@ -2512,8 +2533,10 @@ quota_readlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this, quota_inode_ctx_get (local->loc.inode, this, &ctx, 0); if (ctx == NULL) { - gf_log (this->name, GF_LOG_WARNING, - "quota context not set in inode (gfid:%s)", + gf_log (this->name, GF_LOG_DEBUG, "quota context is NULL on " + "inode (%s). " + "If quota is not enabled recently and crawler has " + "finished crawling, its an error", uuid_utoa (local->loc.inode->gfid)); goto out; } @@ -2590,8 +2613,10 @@ quota_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this, quota_inode_ctx_get (local->loc.inode, this, &ctx, 0); if (ctx == NULL) { - gf_log (this->name, GF_LOG_WARNING, - "quota context not set in inode (gfid:%s)", + gf_log (this->name, GF_LOG_DEBUG, "quota context is NULL on " + "inode (%s). " + "If quota is not enabled recently and crawler has " + "finished crawling, its an error", uuid_utoa (local->loc.inode->gfid)); goto out; } @@ -2663,8 +2688,10 @@ quota_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, quota_inode_ctx_get (local->loc.inode, this, &ctx, 0); if (ctx == NULL) { - gf_log (this->name, GF_LOG_WARNING, - "quota context not set in inode (gfid:%s)", + gf_log (this->name, GF_LOG_DEBUG, "quota context is NULL on " + "inode (%s). " + "If quota is not enabled recently and crawler has " + "finished crawling, its an error", uuid_utoa (local->loc.inode->gfid)); goto out; } @@ -2736,6 +2763,14 @@ quota_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, quota_inode_ctx_get (local->loc.inode, this, &ctx, 0); if (ctx == NULL) { + if (!IA_ISDIR (statpost->ia_type)) { + gf_log (this->name, GF_LOG_DEBUG, "quota context is " + "NULL on inode (%s). " + "If quota is not enabled recently and crawler " + "has finished crawling, its an error", + uuid_utoa (local->loc.inode->gfid)); + } + goto out; } @@ -2811,6 +2846,14 @@ quota_fsetattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, quota_inode_ctx_get (local->loc.inode, this, &ctx, 0); if (ctx == NULL) { + if (!IA_ISDIR (statpost->ia_type)) { + gf_log (this->name, GF_LOG_DEBUG, "quota context is " + "NULL on inode (%s). " + "If quota is not enabled recently and crawler " + "has finished crawling, its an error", + uuid_utoa (local->loc.inode->gfid)); + } + goto out; } @@ -3490,10 +3533,11 @@ quota_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t mode, ret = quota_inode_ctx_get (fd->inode, this, &ctx, 0); if (ctx == NULL) { - gf_log (this->name, GF_LOG_WARNING, - "quota context not set in inode (gfid:%s)", - uuid_utoa (fd->inode->gfid)); - goto unwind; + gf_log (this->name, GF_LOG_DEBUG, "quota context is " + "NULL on inode (%s). " + "If quota is not enabled recently and crawler " + "has finished crawling, its an error", + uuid_utoa (local->loc.inode->gfid)); } stub = fop_fallocate_stub(frame, quota_fallocate_helper, fd, mode, @@ -3506,13 +3550,15 @@ quota_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t mode, priv = this->private; GF_VALIDATE_OR_GOTO (this->name, priv, unwind); - LOCK (&ctx->lock); - { - list_for_each_entry (dentry, &ctx->parents, next) { - parents++; + if (ctx != NULL) { + LOCK (&ctx->lock); + { + list_for_each_entry (dentry, &ctx->parents, next) { + parents++; + } } + UNLOCK (&ctx->lock); } - UNLOCK (&ctx->lock); /* * Note that by using len as the delta we're assuming the range from @@ -3524,9 +3570,6 @@ quota_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t mode, local->link_count = parents; if (parents == 0) { - /* nameless lookup on this inode, allow quota to reconstruct - * ancestry as part of check_limit. - */ local->link_count = 1; quota_check_limit (frame, fd->inode, this, NULL, NULL); } else { |