X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fquota%2Fqsd_config.c;h=507786124343193825b97d5fd2bfaa77be6e5d33;hb=fe0e096567ba148d5690316d2bad2226c0cf70bf;hp=0ad0d64ab6105813fcc5d55865966509bda3545e;hpb=b2cb6fd1095f9c483b7bc1ebbbfdaef719aea87c;p=fs%2Flustre-release.git diff --git a/lustre/quota/qsd_config.c b/lustre/quota/qsd_config.c index 0ad0d64..5077861 100644 --- a/lustre/quota/qsd_config.c +++ b/lustre/quota/qsd_config.c @@ -21,25 +21,21 @@ * GPL HEADER END */ /* - * Copyright (c) 2012 Intel, Inc. + * Copyright (c) 2012, 2014, Intel Corporation. * Use is subject to license terms. * * Author: Johann Lombardi * Author: Niu Yawei */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif - #define DEBUG_SUBSYSTEM S_LQUOTA #include -#include +#include #include "qsd_internal.h" -static CFS_LIST_HEAD(qfs_list); +static struct list_head qfs_list = LIST_HEAD_INIT(qfs_list); /* protect the qfs_list */ static DEFINE_SPINLOCK(qfs_list_lock); @@ -53,15 +49,15 @@ void qsd_put_fsinfo(struct qsd_fsinfo *qfs) ENTRY; LASSERT(qfs != NULL); - cfs_spin_lock(&qfs_list_lock); + spin_lock(&qfs_list_lock); 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); } - cfs_spin_unlock(&qfs_list_lock); + spin_unlock(&qfs_list_lock); EXIT; } @@ -92,15 +88,15 @@ struct qsd_fsinfo *qsd_get_fsinfo(char *name, bool create) if (new == NULL) RETURN(NULL); - cfs_sema_init(&new->qfs_sem, 1); - CFS_INIT_LIST_HEAD(&new->qfs_qsd_list); + mutex_init(&new->qfs_mutex); + INIT_LIST_HEAD(&new->qfs_qsd_list); strcpy(new->qfs_name, name); new->qfs_ref = 1; } /* search in the fsinfo list */ - cfs_spin_lock(&qfs_list_lock); - cfs_list_for_each_entry(qfs, &qfs_list, qfs_link) { + spin_lock(&qfs_list_lock); + list_for_each_entry(qfs, &qfs_list, qfs_link) { if (!strcmp(qfs->qfs_name, name)) { qfs->qfs_ref++; goto out; @@ -111,47 +107,25 @@ 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; } out: - cfs_spin_unlock(&qfs_list_lock); + spin_unlock(&qfs_list_lock); if (new) OBD_FREE_PTR(new); 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", @@ -163,8 +137,10 @@ int qsd_process_config(struct lustre_cfg *lcfg) enabled |= 1 << USRQUOTA; if (strchr(valstr, 'g')) enabled |= 1 << GRPQUOTA; + if (strchr(valstr, 'p')) + enabled |= 1 << PRJQUOTA; - cfs_down(&qfs->qfs_sem); + mutex_lock(&qfs->qfs_mutex); if (qfs->qfs_enabled[pool - LQUOTA_FIRST_RES] == enabled) /* no change required */ GOTO(out, rc = 0); @@ -172,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 */ @@ -179,27 +156,73 @@ 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; /* start reintegration only if qsd_prepare() was * successfully called */ - cfs_read_lock(&qsd->qsd_lock); + read_lock(&qsd->qsd_lock); if (!qsd->qsd_prepared) skip = true; - cfs_read_unlock(&qsd->qsd_lock); + read_unlock(&qsd->qsd_lock); if (skip) 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 & 1 << type) || + !(enabled & 1 << 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); } } } out: - cfs_up(&qfs->qfs_sem); + mutex_unlock(&qfs->qfs_mutex); 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); +}