X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fquota%2Fqsd_config.c;h=6b18cb771f5c9bba48d902da5b932d1e6165349b;hb=8f793f14bf9928352623e61122f005252605b136;hp=1ad6fc952e0e104b107d8328c6d99cc6a237b881;hpb=34b9fe2f703d91e7ad5b315aaac696d3a314cf0b;p=fs%2Flustre-release.git diff --git a/lustre/quota/qsd_config.c b/lustre/quota/qsd_config.c index 1ad6fc9..6b18cb7 100644 --- a/lustre/quota/qsd_config.c +++ b/lustre/quota/qsd_config.c @@ -21,7 +21,7 @@ * GPL HEADER END */ /* - * Copyright (c) 2012, 2013, Intel Corporation. + * Copyright (c) 2012, 2014, Intel Corporation. * Use is subject to license terms. * * Author: Johann Lombardi @@ -31,11 +31,11 @@ #define DEBUG_SUBSYSTEM S_LQUOTA #include -#include +#include #include "qsd_internal.h" -static CFS_LIST_HEAD(qfs_list); +static LIST_HEAD(qfs_list); /* protect the qfs_list */ static DEFINE_SPINLOCK(qfs_list_lock); @@ -53,8 +53,8 @@ void qsd_put_fsinfo(struct qsd_fsinfo *qfs) LASSERT(qfs->qfs_ref > 0); qfs->qfs_ref--; if (qfs->qfs_ref == 0) { - LASSERT(cfs_list_empty(&qfs->qfs_qsd_list)); - cfs_list_del(&qfs->qfs_link); + LASSERT(list_empty(&qfs->qfs_qsd_list)); + list_del(&qfs->qfs_link); OBD_FREE_PTR(qfs); } spin_unlock(&qfs_list_lock); @@ -89,14 +89,14 @@ struct qsd_fsinfo *qsd_get_fsinfo(char *name, bool create) RETURN(NULL); mutex_init(&new->qfs_mutex); - CFS_INIT_LIST_HEAD(&new->qfs_qsd_list); + INIT_LIST_HEAD(&new->qfs_qsd_list); strcpy(new->qfs_name, name); new->qfs_ref = 1; } /* search in the fsinfo list */ spin_lock(&qfs_list_lock); - cfs_list_for_each_entry(qfs, &qfs_list, qfs_link) { + list_for_each_entry(qfs, &qfs_list, qfs_link) { if (!strcmp(qfs->qfs_name, name)) { qfs->qfs_ref++; goto out; @@ -107,7 +107,7 @@ struct qsd_fsinfo *qsd_get_fsinfo(char *name, bool create) if (new) { /* not found, but we were asked to create a new one */ - cfs_list_add_tail(&new->qfs_link, &qfs_list); + list_add_tail(&new->qfs_link, &qfs_list); qfs = new; new = NULL; } @@ -119,35 +119,13 @@ out: RETURN(qfs); } -/* - * Quota configuration handlers in charge of processing all per-filesystem quota - * parameters set via conf_param. - * - * \param lcfg - quota configuration log to be processed - */ -int qsd_process_config(struct lustre_cfg *lcfg) +int qsd_config(char *valstr, char *fsname, int pool) { - struct qsd_fsinfo *qfs; - char *fsname = lustre_cfg_string(lcfg, 0); - char *cfgstr = lustre_cfg_string(lcfg, 1); - char *keystr, *valstr; - int rc, pool, enabled = 0; - bool reint = false; - ENTRY; - - CDEBUG(D_QUOTA, "processing quota parameter: fs:%s cfgstr:%s\n", fsname, - cfgstr); - - if (class_match_param(cfgstr, PARAM_QUOTA, &keystr) != 0) - RETURN(-EINVAL); - - if (!class_match_param(keystr, QUOTA_METAPOOL_NAME, &valstr)) - pool = LQUOTA_RES_MD; - else if (!class_match_param(keystr, QUOTA_DATAPOOL_NAME, &valstr)) - pool = LQUOTA_RES_DT; - else - RETURN(-EINVAL); + struct qsd_fsinfo *qfs; + int rc, enabled = 0, old_enabled = 0; + bool reint = false; + ENTRY; qfs = qsd_get_fsinfo(fsname, 0); if (qfs == NULL) { CERROR("failed to find quota filesystem information for %s\n", @@ -156,9 +134,11 @@ int qsd_process_config(struct lustre_cfg *lcfg) } if (strchr(valstr, 'u')) - enabled |= 1 << USRQUOTA; + enabled |= BIT(USRQUOTA); if (strchr(valstr, 'g')) - enabled |= 1 << GRPQUOTA; + enabled |= BIT(GRPQUOTA); + if (strchr(valstr, 'p')) + enabled |= BIT(PRJQUOTA); mutex_lock(&qfs->qfs_mutex); if (qfs->qfs_enabled[pool - LQUOTA_FIRST_RES] == enabled) @@ -168,6 +148,7 @@ int qsd_process_config(struct lustre_cfg *lcfg) if ((qfs->qfs_enabled[pool - LQUOTA_FIRST_RES] & enabled) != enabled) reint = true; + old_enabled = qfs->qfs_enabled[pool - LQUOTA_FIRST_RES]; qfs->qfs_enabled[pool - LQUOTA_FIRST_RES] = enabled; /* trigger reintegration for all qsd */ @@ -175,7 +156,7 @@ int qsd_process_config(struct lustre_cfg *lcfg) struct qsd_instance *qsd; struct qsd_qtype_info *qqi; - cfs_list_for_each_entry(qsd, &qfs->qfs_qsd_list, qsd_link) { + list_for_each_entry(qsd, &qfs->qfs_qsd_list, qsd_link) { bool skip = false; int type; @@ -187,19 +168,25 @@ int qsd_process_config(struct lustre_cfg *lcfg) read_unlock(&qsd->qsd_lock); if (skip) continue; - if (qsd->qsd_acct_failed) { - LCONSOLE_ERROR("%s: can't enable quota " - "enforcement since space " - "accounting isn't functional. " - "Please run tunefs.lustre " - "--quota on an unmounted " - "filesystem if not done already" - "\n", qsd->qsd_svname); - continue; - } - for (type = USRQUOTA; type < MAXQUOTAS; type++) { + for (type = USRQUOTA; type < LL_MAXQUOTAS; type++) { qqi = qsd->qsd_type_array[type]; + /* only trigger reintegration if this + * type of quota is not enabled before */ + if ((old_enabled & BIT(type)) || + !(enabled & BIT(type))) + continue; + + if (qqi->qqi_acct_failed) { + LCONSOLE_ERROR("%s: can't enable quota " + "enforcement since space " + "accounting isn't functional. " + "Please run tunefs.lustre " + "--quota on an unmounted " + "filesystem if not done already" + "\n", qsd->qsd_svname); + continue; + } qsd_start_reint_thread(qqi); } } @@ -209,3 +196,33 @@ out: qsd_put_fsinfo(qfs); RETURN(0); } + +/* + * Quota configuration handlers in charge of processing all per-filesystem quota + * parameters set via conf_param. + * + * \param lcfg - quota configuration log to be processed + */ +int qsd_process_config(struct lustre_cfg *lcfg) +{ + char *fsname = lustre_cfg_string(lcfg, 0); + char *cfgstr = lustre_cfg_string(lcfg, 1); + char *keystr, *valstr; + int pool; + + ENTRY; + CDEBUG(D_QUOTA, "processing quota parameter: fs:%s cfgstr:%s\n", fsname, + cfgstr); + + if (class_match_param(cfgstr, PARAM_QUOTA, &keystr) != 0) + RETURN(-EINVAL); + + if (!class_match_param(keystr, QUOTA_METAPOOL_NAME, &valstr)) + pool = LQUOTA_RES_MD; + else if (!class_match_param(keystr, QUOTA_DATAPOOL_NAME, &valstr)) + pool = LQUOTA_RES_DT; + else + RETURN(-EINVAL); + + return qsd_config(valstr, fsname, pool); +}