summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaghavendra G <rgowdapp@redhat.com>2013-08-08 16:18:31 +0530
committerKrishnan Parthasarathi <kparthas@redhat.com>2013-08-12 00:48:15 +0530
commit0bcdd3e3a632ffa5359a8d9ee74b364ca3af6bbe (patch)
treec2621c448005b5f3d4ec38873171f9188272c448
parent008d261e9b939fa2b71b1e3f23945d86fec4f632 (diff)
features/quota: fixes to code reading limits from xattrs.
It was assumed that hard and soft limits are stored as two different xattrs on disk. However they are stored as two members of a structure which is stored as a value for a single key. Change-Id: I947fa5c375209c31fe1511bda0d5cb0e249af9ba BUG: 969461 Signed-off-by: Raghavendra G <rgowdapp@redhat.com>
-rw-r--r--libglusterfs/src/glusterfs.h3
-rw-r--r--xlators/features/quota/src/quota.c72
-rw-r--r--xlators/features/quota/src/quota.h5
3 files changed, 34 insertions, 46 deletions
diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h
index f7195ac5..7a71fa4f 100644
--- a/libglusterfs/src/glusterfs.h
+++ b/libglusterfs/src/glusterfs.h
@@ -114,8 +114,7 @@
#define GLUSTERFS_PARENT_ENTRYLK "glusterfs.parent-entrylk"
#define GLUSTERFS_INODELK_DOM_COUNT "glusterfs.inodelk-dom-count"
#define QUOTA_SIZE_KEY "trusted.glusterfs.quota.size"
-#define QUOTA_HARD_LIMIT_KEY "trusted.glusterfs.quota.hard-limit"
-#define QUOTA_SOFT_LIMIT_KEY "trusted.glusterfs.quota.soft-limit"
+#define QUOTA_LIMIT_KEY "trusted.glusterfs.quota.limit-set"
#define GFID_TO_PATH_KEY "glusterfs.gfid2path"
#define GF_XATTR_STIME_PATTERN "trusted.glusterfs.*.stime"
diff --git a/xlators/features/quota/src/quota.c b/xlators/features/quota/src/quota.c
index 94f3183c..85ee3718 100644
--- a/xlators/features/quota/src/quota.c
+++ b/xlators/features/quota/src/quota.c
@@ -16,6 +16,7 @@
int32_t
quota_check_limit (call_frame_t *frame, inode_t *inode, xlator_t *this,
char *name, uuid_t par);
+
struct volume_options options[];
@@ -605,22 +606,20 @@ quota_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
quota_dentry_t *dentry = NULL;
uint64_t value = 0;
int64_t *size = NULL;
- int64_t hard_lim = -1, soft_lim = -1, *ptr = NULL;
+ quota_limit_t *limit = NULL;
+ int64_t hard_lim = -1, soft_lim_percent = -1, *ptr = NULL;
quota_local_t *local = NULL;
if (op_ret < 0)
goto unwind;
if (dict != NULL) {
- ret = dict_get_bin (dict, QUOTA_SOFT_LIMIT_KEY, (void **) &ptr);
- if (ptr != NULL) {
- soft_lim = ntoh64 (*ptr);
- }
+ ret = dict_get_bin (dict, QUOTA_LIMIT_KEY, (void **) &ptr);
+ limit = ptr;
- ptr = NULL;
- ret = dict_get_bin (dict, QUOTA_HARD_LIMIT_KEY, (void **) &ptr);
- if (ptr != NULL) {
- hard_lim = ntoh64 (*ptr);
+ if (limit) {
+ hard_lim = ntoh64 (limit->hard_lim);
+ soft_lim_percent = ntoh64 (limit->soft_lim_percent);
}
}
@@ -630,8 +629,8 @@ quota_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
ctx = (quota_inode_ctx_t *)(unsigned long)value;
if ((((ctx == NULL) || (ctx->hard_lim == hard_lim))
- && (hard_lim < 0) && !((IA_ISREG (buf->ia_type))
- || (IA_ISLNK (buf->ia_type))))) {
+ && (hard_lim < 0) && !((IA_ISREG (buf->ia_type))
+ || (IA_ISLNK (buf->ia_type))))) {
goto unwind;
}
@@ -649,17 +648,11 @@ quota_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
LOCK (&ctx->lock);
{
ctx->hard_lim = hard_lim;
- ctx->soft_lim = soft_lim;
+ ctx->soft_lim = (hard_lim > 0) ?
+ (soft_lim_percent * hard_lim)/100 : -1;
ctx->buf = *buf;
- /* will be useful for quotad to determine whether quota xlator's
- context is maintaining the correct size.
- */
- size = GF_CALLOC (1, sizeof (*size), gf_quota_mt_int64_t);
- *size = hton64 (ctx->size);
- ret = dict_set_bin (dict, "trusted.limit.set", size, 8);
-
if (!(IA_ISREG (buf->ia_type) || IA_ISLNK (buf->ia_type))) {
goto unlock;
}
@@ -682,7 +675,7 @@ quota_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
local->loc.parent->gfid);
if (dentry == NULL) {
/*
- gf_log (this->name, GF_LOG_WARNING,
+ gf_log (this->name, GF_LOG_WARNING,
"cannot create a new dentry (par:%"
PRId64", name:%s) for inode(ino:%"
PRId64", gfid:%s)",
@@ -716,34 +709,25 @@ quota_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc,
WIND_IF_QUOTAOFF (priv->is_quota_on, wind);
- if (priv->is_quota_on) {
- local = quota_local_new ();
- if (local == NULL) {
- goto err;
- }
-
- frame->local = local;
- loc_copy (&local->loc, loc);
+ local = quota_local_new ();
+ if (local == NULL) {
+ goto err;
+ }
- if (xattr_req == NULL) {
- xattr_req = dict_new ();
- if (xattr_req == NULL)
- goto err;
- }
+ frame->local = local;
+ loc_copy (&local->loc, loc);
- ret = dict_set_int8 (xattr_req, QUOTA_HARD_LIMIT_KEY, 1);
- if (ret < 0) {
- gf_log (this->name, GF_LOG_WARNING,
- "dict set of key for hard-limit failed");
+ if (xattr_req == NULL) {
+ xattr_req = dict_new ();
+ if (xattr_req == NULL)
goto err;
- }
+ }
- ret = dict_set_int8 (xattr_req, QUOTA_SOFT_LIMIT_KEY, 1);
- if (ret < 0) {
- gf_log (this->name, GF_LOG_WARNING,
- "dict set of key for soft-limit failed");
- goto err;
- }
+ ret = dict_set_int8 (xattr_req, QUOTA_LIMIT_KEY, 1);
+ if (ret < 0) {
+ gf_log (this->name, GF_LOG_WARNING,
+ "dict set of key for hard-limit failed");
+ goto err;
}
wind:
diff --git a/xlators/features/quota/src/quota.h b/xlators/features/quota/src/quota.h
index 3f1458a3..c4d5c6ad 100644
--- a/xlators/features/quota/src/quota.h
+++ b/xlators/features/quota/src/quota.h
@@ -184,6 +184,11 @@ struct quota_priv {
};
typedef struct quota_priv quota_priv_t;
+typedef struct quota_limit {
+ int64_t hard_lim;
+ int64_t soft_lim_percent;
+} quota_limit_t __attribute__ ((packed));
+
int
quota_enforcer_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc,
dict_t *xdata, fop_lookup_cbk_t cbk);