diff options
| -rw-r--r-- | libglusterfs/src/quota-common-utils.c | 51 | ||||
| -rw-r--r-- | libglusterfs/src/quota-common-utils.h | 8 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-quota.c | 88 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.c | 77 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.h | 6 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 5 | 
6 files changed, 165 insertions, 70 deletions
diff --git a/libglusterfs/src/quota-common-utils.c b/libglusterfs/src/quota-common-utils.c index 97965b09947..012f80fab48 100644 --- a/libglusterfs/src/quota-common-utils.c +++ b/libglusterfs/src/quota-common-utils.c @@ -177,57 +177,6 @@ out:  }  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; diff --git a/libglusterfs/src/quota-common-utils.h b/libglusterfs/src/quota-common-utils.h index e80c74cba72..2c3632b903c 100644 --- a/libglusterfs/src/quota-common-utils.h +++ b/libglusterfs/src/quota-common-utils.h @@ -16,6 +16,8 @@  #define GF_QUOTA_CONF_VERSION 1.2  #define QUOTA_CONF_HEADER                           \          "GlusterFS Quota conf | version: v1.2\n" +#define QUOTA_CONF_HEADER_1_1                       \ +        "GlusterFS Quota conf | version: v1.1\n"  typedef enum {          GF_QUOTA_CONF_TYPE_USAGE = 1, @@ -52,12 +54,6 @@ int32_t  quota_conf_read_version (int fd, float *version);  int32_t -quota_conf_write_header (int fd); - -int32_t -quota_conf_write_gfid (int fd, void *buf, char type); - -int32_t  quota_conf_read_gfid (int fd, void *buf, char *type, float version);  int32_t diff --git a/xlators/mgmt/glusterd/src/glusterd-quota.c b/xlators/mgmt/glusterd/src/glusterd-quota.c index 7176e683fd9..ff6ece9bbca 100644 --- a/xlators/mgmt/glusterd/src/glusterd-quota.c +++ b/xlators/mgmt/glusterd/src/glusterd-quota.c @@ -87,6 +87,15 @@ glusterd_is_quota_supported (int32_t type, char **op_errstr)              (type > GF_QUOTA_OPTION_TYPE_VERSION_OBJECTS))                  goto out; +        /* Quota Operations that change quota.conf shouldn't +         * be allowed as the quota.conf format changes in 3.7 +         */ +        if ((conf->op_version < GD_OP_VERSION_3_7_0) && +            (type == GF_QUOTA_OPTION_TYPE_ENABLE || +             type == GF_QUOTA_OPTION_TYPE_LIMIT_USAGE || +             type == GF_QUOTA_OPTION_TYPE_REMOVE)) +                goto out; +          supported = _gf_true;  out: @@ -635,14 +644,60 @@ glusterd_update_quota_conf_version (glusterd_volinfo_t *volinfo)   * and continue the search.   */  static gf_boolean_t -glusterd_find_gfid_match (uuid_t gfid, char gfid_type, unsigned char *buf, -                          size_t bytes_read, int opcode, -                          size_t *write_byte_count) +glusterd_find_gfid_match_3_6 (uuid_t gfid, unsigned char *buf, +                              size_t bytes_read, int opcode, +                              size_t *write_byte_count)  {          int           gfid_index  = 0;          int           shift_count = 0;          unsigned char tmp_buf[17] = {0,}; -        char          type        = 0; + +        /* This function if for backward compatibility */ + +        while (gfid_index != bytes_read) { +                memcpy ((void *)tmp_buf, (void *)&buf[gfid_index], 16); +                if (!gf_uuid_compare (gfid, tmp_buf)) { +                        if (opcode == GF_QUOTA_OPTION_TYPE_REMOVE) { +                                shift_count = bytes_read - (gfid_index + 16); +                                memmove ((void *)&buf[gfid_index], +                                         (void *)&buf[gfid_index+16], +                                         shift_count); +                                *write_byte_count = bytes_read - 16; +                        } else { +                                *write_byte_count = bytes_read; +                        } +                        return _gf_true; +                } else { +                        gfid_index += 16; +                } +        } +        if (gfid_index == bytes_read) +                *write_byte_count = bytes_read; + +        return _gf_false; +} + +static gf_boolean_t +glusterd_find_gfid_match (uuid_t gfid, char gfid_type, unsigned char *buf, +                          size_t bytes_read, int opcode, +                          size_t *write_byte_count) +{ +        int                 gfid_index  = 0; +        int                 shift_count = 0; +        unsigned char       tmp_buf[17] = {0,}; +        char                type        = 0; +        xlator_t           *this        = NULL; +        glusterd_conf_t    *conf        = NULL; + +        this = THIS; +        GF_VALIDATE_OR_GOTO ("glusterd", this, out); + +        conf = this->private; +        GF_VALIDATE_OR_GOTO (this->name, conf, out); + +        if (conf->op_version < GD_OP_VERSION_3_7_0) +                return glusterd_find_gfid_match_3_6 (gfid, buf, bytes_read, +                                                     opcode, write_byte_count);          while (gfid_index != bytes_read) {                  memcpy ((void *)tmp_buf, (void *)&buf[gfid_index], 16); @@ -667,6 +722,8 @@ glusterd_find_gfid_match (uuid_t gfid, char gfid_type, unsigned char *buf,          if (gfid_index == bytes_read)                  *write_byte_count = bytes_read; +out: +          return _gf_false;  } @@ -737,7 +794,7 @@ glusterd_store_quota_conf_upgrade (glusterd_volinfo_t *volinfo)          if (ret)                  goto out; -        ret = quota_conf_write_header (fd); +        ret = glusterd_quota_conf_write_header (fd);          if (ret)                  goto out; @@ -748,7 +805,7 @@ glusterd_store_quota_conf_upgrade (glusterd_volinfo_t *volinfo)                  else if (ret < 0)                          goto out; -                ret = quota_conf_write_gfid (fd, gfid, +                ret = glusterd_quota_conf_write_gfid (fd, gfid,                                               GF_QUOTA_CONF_TYPE_USAGE);                  if (ret < 0)                          goto out; @@ -803,6 +860,7 @@ glusterd_store_quota_config (glusterd_volinfo_t *volinfo, char *path,          glusterd_conf_t   *conf                  = NULL;          float              version               = 0.0f;          char               type                  = 0; +        int                quota_conf_line_sz    = 16;          this = THIS;          GF_ASSERT (this); @@ -821,7 +879,8 @@ glusterd_store_quota_config (glusterd_volinfo_t *volinfo, char *path,          if (ret)                  goto out; -        if (version < 1.2f) { +        if (version < 1.2f && conf->op_version >= GD_OP_VERSION_3_7_0) { +                /* Upgrade quota.conf file to newer format */                  close (conf_fd);                  ret = glusterd_store_quota_conf_upgrade(volinfo);                  if (ret) @@ -838,13 +897,20 @@ glusterd_store_quota_config (glusterd_volinfo_t *volinfo, char *path,                          goto out;          } +        /* If op-ver is gt 3.7, then quota.conf will be upgraded, and 17 bytes +         * storted in the new format. 16 bytes uuid and +         * 1 byte type (usage/object) +         */ +        if (conf->op_version >= GD_OP_VERSION_3_7_0) +                quota_conf_line_sz++; +          fd = gf_store_mkstemp (volinfo->quota_conf_shandle);          if (fd < 0) {                  ret = -1;                  goto out;          } -        ret = quota_conf_write_header (fd); +        ret = glusterd_quota_conf_write_header (fd);          if (ret)                  goto out; @@ -882,7 +948,7 @@ glusterd_store_quota_config (glusterd_volinfo_t *volinfo, char *path,                                  is_file_empty = _gf_true;                          break;                  } -                if ((bytes_read % 17) != 0) { +                if ((bytes_read % quota_conf_line_sz) != 0) {                          gf_log (this->name, GF_LOG_ERROR, "quota.conf "                                  "corrupted");                          ret = -1; @@ -915,7 +981,7 @@ glusterd_store_quota_config (glusterd_volinfo_t *volinfo, char *path,          switch (opcode) {          case GF_QUOTA_OPTION_TYPE_LIMIT_USAGE:                  if (!found) { -                        ret = quota_conf_write_gfid (fd, gfid, +                        ret = glusterd_quota_conf_write_gfid (fd, gfid,                                                       GF_QUOTA_CONF_TYPE_USAGE);                          if (ret == -1) {                                  gf_log (this->name, GF_LOG_ERROR, @@ -929,7 +995,7 @@ glusterd_store_quota_config (glusterd_volinfo_t *volinfo, char *path,                  break;          case GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS:                  if (!found) { -                        ret = quota_conf_write_gfid (fd, gfid, +                        ret = glusterd_quota_conf_write_gfid (fd, gfid,                                                     GF_QUOTA_CONF_TYPE_OBJECTS);                          if (ret == -1) {                                  gf_log (this->name, GF_LOG_ERROR, diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index c3cb4e490d9..cb312ae9a63 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -41,6 +41,7 @@  #include "rpc-clnt.h"  #include "common-utils.h" +#include "quota-common-utils.h"  #include <sys/resource.h>  #include <inttypes.h> @@ -4301,3 +4302,79 @@ out:          gf_store_handle_destroy (shandle);          return ret;  } + +int32_t +glusterd_quota_conf_write_header (int fd) +{ +        int                 header_len    = 0; +        int                 ret           = -1; +        xlator_t           *this          = NULL; +        glusterd_conf_t    *conf          = NULL; + +        this = THIS; +        GF_VALIDATE_OR_GOTO ("quota", this, out); + +        conf = this->private; +        GF_VALIDATE_OR_GOTO (this->name, conf, out); + + +        if (conf->op_version < GD_OP_VERSION_3_7_0) { +                header_len = strlen (QUOTA_CONF_HEADER_1_1); +                ret = gf_nwrite (fd, QUOTA_CONF_HEADER_1_1, header_len); +        } else { +                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 +glusterd_quota_conf_write_gfid (int fd, void *buf, char type) +{ +        int                 ret        = -1; +        xlator_t           *this       = NULL; +        glusterd_conf_t    *conf       = NULL; + +        this = THIS; +        GF_VALIDATE_OR_GOTO ("quota", this, out); + +        conf = this->private; +        GF_VALIDATE_OR_GOTO (this->name, conf, out); + + +        ret = gf_nwrite (fd, buf, 16); +        if (ret != 16) { +                ret = -1; +                goto out; +        } + +        if (conf->op_version >= GD_OP_VERSION_3_7_0) { +                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; +} diff --git a/xlators/mgmt/glusterd/src/glusterd-store.h b/xlators/mgmt/glusterd/src/glusterd-store.h index 0a243d399a1..5ba0add32c3 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.h +++ b/xlators/mgmt/glusterd/src/glusterd-store.h @@ -181,4 +181,10 @@ glusterd_store_retrieve_volume (char *volname, glusterd_snap_t *snap);  int  glusterd_restore_op_version (xlator_t *this); +int32_t +glusterd_quota_conf_write_header (int fd); + +int32_t +glusterd_quota_conf_write_gfid (int fd, void *buf, char type); +  #endif diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 387e0a6e8ae..f90abc19b2e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -2998,7 +2998,7 @@ glusterd_import_quota_conf (dict_t *peer_data, int vol_idx,          if (ret)                  goto out; -        ret = quota_conf_write_header (fd); +        ret = glusterd_quota_conf_write_header (fd);          if (ret)                  goto out; @@ -3018,7 +3018,8 @@ glusterd_import_quota_conf (dict_t *peer_data, int vol_idx,                          gfid_type = GF_QUOTA_CONF_TYPE_USAGE;                  gf_uuid_parse (gfid_str, gfid); -                ret = quota_conf_write_gfid (fd, gfid, (char)gfid_type); +                ret = glusterd_quota_conf_write_gfid (fd, gfid, +                                                      (char)gfid_type);                  if (ret < 0) {                          gf_log (this->name, GF_LOG_CRITICAL, "Unable to write "                                  "gfid %s into quota.conf for %s", gfid_str,  | 
