From 821b1fdc893c0dd603d4c43a0b31f1ea495a46c9 Mon Sep 17 00:00:00 2001 From: vmallika Date: Wed, 15 Apr 2015 17:35:07 +0530 Subject: quota: support for inode quota in quota.conf Currently when quota limit is set, corresponding gfid is set in quota.conf. This patch supports storing inode-quota limits in quota.conf and also stores additional byte for each gfid to differentiate between usage quota limit and inode quota limit. Change-Id: I444d7399407594edd280e640681679a784d4c46a BUG: 1202244 Signed-off-by: vmallika Signed-off-by: Sachin Pandit Reviewed-on: http://review.gluster.org/10069 Tested-by: NetBSD Build System Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- libglusterfs/src/quota-common-utils.c | 154 ++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) (limited to 'libglusterfs/src/quota-common-utils.c') diff --git a/libglusterfs/src/quota-common-utils.c b/libglusterfs/src/quota-common-utils.c index ab153209d0d..97965b09947 100644 --- a/libglusterfs/src/quota-common-utils.c +++ b/libglusterfs/src/quota-common-utils.c @@ -13,6 +13,7 @@ #include "logging.h" #include "byte-order.h" #include "quota-common-utils.h" +#include "common-utils.h" int32_t quota_data_to_meta (data_t *data, char *key, quota_meta_t *meta) @@ -112,3 +113,156 @@ out: return ret; } +int32_t +quota_conf_read_header (int fd, char *buf) +{ + int header_len = 0; + int ret = 0; + + header_len = strlen (QUOTA_CONF_HEADER); + + ret = gf_nread (fd, buf, header_len); + if (ret <= 0) { + goto out; + } else if (ret > 0 && ret != header_len) { + ret = -1; + goto out; + } + + buf[header_len-1] = 0; + +out: + if (ret < 0) + gf_log_callingfn ("quota", GF_LOG_ERROR, "failed to read " + "header from a quota conf"); + + return ret; +} + +int32_t +quota_conf_read_version (int fd, float *version) +{ + int ret = 0; + char buf[PATH_MAX] = ""; + char *tail = NULL; + float value = 0.0f; + + ret = quota_conf_read_header (fd, buf); + if (ret == 0) { + /* quota.conf is empty */ + value = GF_QUOTA_CONF_VERSION; + goto out; + } else if (ret < 0) { + goto out; + } + + value = strtof ((buf + strlen(buf) - 3), &tail); + if (tail[0] != '\0') { + ret = -1; + gf_log_callingfn ("quota", GF_LOG_ERROR, "invalid quota conf " + "version"); + goto out; + } + + ret = 0; + +out: + if (ret >= 0) + *version = value; + else + gf_log_callingfn ("quota", GF_LOG_ERROR, "failed to read " + "version from a quota conf header"); + + return ret; +} + +int32_t +quota_conf_write_header (int fd) +{ + int header_len = 0; + int ret = 0; + + header_len = strlen (QUOTA_CONF_HEADER); + + ret = gf_nwrite (fd, QUOTA_CONF_HEADER, header_len); + if (ret != header_len) { + ret = -1; + goto out; + } + + ret = 0; + +out: + if (ret < 0) + gf_log_callingfn ("quota", GF_LOG_ERROR, "failed to write " + "header to a quota conf"); + + return ret; +} + +int32_t +quota_conf_write_gfid (int fd, void *buf, char type) +{ + int ret = 0; + + ret = gf_nwrite (fd, buf, 16); + if (ret != 16) { + ret = -1; + goto out; + } + + ret = gf_nwrite (fd, &type, 1); + if (ret != 1) { + ret = -1; + goto out; + } + + ret = 0; + +out: + if (ret < 0) + gf_log_callingfn ("quota", GF_LOG_ERROR, "failed to write " + "gfid %s to a quota conf", uuid_utoa (buf)); + + return ret; +} + +int32_t +quota_conf_read_gfid (int fd, void *buf, char *type, float version) +{ + int ret = 0; + + ret = gf_nread (fd, buf, 16); + if (ret <= 0) + goto out; + + if (ret != 16) { + ret = -1; + goto out; + } + + if (version >= 1.2f) { + ret = gf_nread (fd, type, 1); + if (ret != 1) { + ret = -1; + goto out; + } + ret = 17; + } else { + *type = GF_QUOTA_CONF_TYPE_USAGE; + } + +out: + if (ret < 0) + gf_log_callingfn ("quota", GF_LOG_ERROR, "failed to read " + "gfid from a quota conf"); + + return ret; +} + +int32_t +quota_conf_skip_header (int fd) +{ + return gf_skip_header_section (fd, strlen (QUOTA_CONF_HEADER)); +} + -- cgit