X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fquota%2Fqsd_config.c;h=282526c4c72da3d47b62425377198d7981f59ae7;hb=09141c0796802e7a3471c084ea5928674b3a1862;hp=26c06bbe4bc306d9920ab4268cab6c122c1e8a7f;hpb=c40c7939c0110ca53151c47249d85e56a6e0f24d;p=fs%2Flustre-release.git diff --git a/lustre/quota/qsd_config.c b/lustre/quota/qsd_config.c index 26c06bb..282526c 100644 --- a/lustre/quota/qsd_config.c +++ b/lustre/quota/qsd_config.c @@ -21,17 +21,13 @@ * 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 @@ -39,7 +35,7 @@ #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,12 +107,12 @@ 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); @@ -136,6 +132,7 @@ int qsd_process_config(struct lustre_cfg *lcfg) 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, @@ -153,7 +150,7 @@ int qsd_process_config(struct lustre_cfg *lcfg) qfs = qsd_get_fsinfo(fsname, 0); if (qfs == NULL) { - CERROR("Fail to find quota filesystem information for %s\n", + CERROR("failed to find quota filesystem information for %s\n", fsname); RETURN(-ENOENT); } @@ -163,12 +160,52 @@ int qsd_process_config(struct lustre_cfg *lcfg) if (strchr(valstr, 'g')) enabled |= 1 << GRPQUOTA; + mutex_lock(&qfs->qfs_mutex); if (qfs->qfs_enabled[pool - LQUOTA_FIRST_RES] == enabled) /* no change required */ GOTO(out, rc = 0); + if ((qfs->qfs_enabled[pool - LQUOTA_FIRST_RES] & enabled) != enabled) + reint = true; + qfs->qfs_enabled[pool - LQUOTA_FIRST_RES] = enabled; + + /* trigger reintegration for all qsd */ + if (reint) { + struct qsd_instance *qsd; + struct qsd_qtype_info *qqi; + + 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 */ + read_lock(&qsd->qsd_lock); + if (!qsd->qsd_prepared) + skip = true; + 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++) { + qqi = qsd->qsd_type_array[type]; + qsd_start_reint_thread(qqi); + } + } + } out: + mutex_unlock(&qfs->qfs_mutex); qsd_put_fsinfo(qfs); RETURN(0); }