X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fquota%2Fqsd_lib.c;h=253f6b4cccad8cc9985a7b3c61295b32b49059ab;hb=ef0f617b354d8e41c07efa74c9fe051012ed773f;hp=3a6ca616a1536bd23d5f644f6125c773a1c2cc9e;hpb=9fb46705ae86aa2c0ac29427f0ff24f923560eb7;p=fs%2Flustre-release.git diff --git a/lustre/quota/qsd_lib.c b/lustre/quota/qsd_lib.c index 3a6ca61..253f6b4 100644 --- a/lustre/quota/qsd_lib.c +++ b/lustre/quota/qsd_lib.c @@ -21,7 +21,7 @@ * GPL HEADER END */ /* - * Copyright (c) 2012 Intel, Inc. + * Copyright (c) 2012, 2013, Intel Corporation. * Use is subject to license terms. * * Author: Johann Lombardi @@ -49,16 +49,12 @@ * freed via qsd_fini(). */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif - #define DEBUG_SUBSYSTEM S_LQUOTA #include #include "qsd_internal.h" -cfs_mem_cache_t *upd_kmem; +struct kmem_cache *upd_kmem; struct lu_kmem_descr qsd_caches[] = { { @@ -104,16 +100,26 @@ static int lprocfs_qsd_rd_state(char *page, char **start, off_t off, qsd->qsd_is_md ? "md" : "dt", enabled, qsd->qsd_exp_valid ? "setup" : "not setup yet"); - if (qsd->qsd_prepared) + if (qsd->qsd_prepared) { + memset(enabled, 0, sizeof(enabled)); + if (qsd->qsd_type_array[USRQUOTA]->qqi_acct_obj != NULL) + strcat(enabled, "u"); + if (qsd->qsd_type_array[GRPQUOTA]->qqi_acct_obj != NULL) + strcat(enabled, "g"); + if (strlen(enabled) == 0) + strcat(enabled, "none"); rc += snprintf(page + rc, count - rc, + "space acct: %s\n" "user uptodate: glb[%d],slv[%d],reint[%d]\n" "group uptodate: glb[%d],slv[%d],reint[%d]\n", + enabled, qsd->qsd_type_array[USRQUOTA]->qqi_glb_uptodate, qsd->qsd_type_array[USRQUOTA]->qqi_slv_uptodate, qsd->qsd_type_array[USRQUOTA]->qqi_reint, qsd->qsd_type_array[GRPQUOTA]->qqi_glb_uptodate, qsd->qsd_type_array[GRPQUOTA]->qqi_slv_uptodate, qsd->qsd_type_array[GRPQUOTA]->qqi_reint); + } return rc; } @@ -225,8 +231,6 @@ static int qsd_conn_callback(void *data) /* qsd_exp should now be valid */ LASSERT(qsd->qsd_exp); - /* grab reference on namespace */ - ldlm_namespace_get(class_exp2obd(qsd->qsd_exp)->obd_namespace); qsd->qsd_ns = class_exp2obd(qsd->qsd_exp)->obd_namespace; write_lock(&qsd->qsd_lock); @@ -243,7 +247,7 @@ static int qsd_conn_callback(void *data) * step 3) will have to wait for qsd_start() to be called */ for (type = USRQUOTA; type < MAXQUOTAS; type++) { struct qsd_qtype_info *qqi = qsd->qsd_type_array[type]; - cfs_waitq_signal(&qqi->qqi_reint_thread.t_ctl_waitq); + wake_up(&qqi->qqi_reint_thread.t_ctl_waitq); } RETURN(0); @@ -348,21 +352,20 @@ static int qsd_qtype_init(const struct lu_env *env, struct qsd_instance *qsd, qqi->qqi_glb_uptodate = false; qqi->qqi_slv_uptodate = false; qqi->qqi_reint = false; - cfs_waitq_init(&qqi->qqi_reint_thread.t_ctl_waitq); + init_waitqueue_head(&qqi->qqi_reint_thread.t_ctl_waitq); thread_set_flags(&qqi->qqi_reint_thread, SVC_STOPPED); CFS_INIT_LIST_HEAD(&qqi->qqi_deferred_glb); CFS_INIT_LIST_HEAD(&qqi->qqi_deferred_slv); - memset(&qqi->qqi_lockh, 0, sizeof(qqi->qqi_lockh)); /* open accounting object */ LASSERT(qqi->qqi_acct_obj == NULL); qqi->qqi_acct_obj = acct_obj_lookup(env, qsd->qsd_dev, qtype); - if (qqi->qqi_acct_obj == NULL) { - LCONSOLE_ERROR("%s: No %s space accounting support. Please use " - "tunefs.lustre --quota option to enable quota " - "accounting.\n", - qsd->qsd_svname, QTYPE_NAME(qtype)); - GOTO(out, rc = -ENOENT); + if (IS_ERR(qqi->qqi_acct_obj)) { + CDEBUG(D_QUOTA, "%s: no %s space accounting support rc:%ld\n", + qsd->qsd_svname, QTYPE_NAME(qtype), + PTR_ERR(qqi->qqi_acct_obj)); + qqi->qqi_acct_obj = NULL; + qsd->qsd_acct_failed = true; } /* open global index copy */ @@ -450,14 +453,6 @@ void qsd_fini(const struct lu_env *env, struct qsd_instance *qsd) qsd->qsd_stopping = true; write_unlock(&qsd->qsd_lock); - /* remove from the list of fsinfo */ - if (!cfs_list_empty(&qsd->qsd_link)) { - LASSERT(qsd->qsd_fsinfo != NULL); - down(&qsd->qsd_fsinfo->qfs_sem); - cfs_list_del_init(&qsd->qsd_link); - up(&qsd->qsd_fsinfo->qfs_sem); - } - /* remove qsd proc entry */ if (qsd->qsd_proc != NULL) { lprocfs_remove(&qsd->qsd_proc); @@ -474,9 +469,7 @@ void qsd_fini(const struct lu_env *env, struct qsd_instance *qsd) qsd_stop_reint_thread(qsd->qsd_type_array[qtype]); } - /* release reference on namespace */ if (qsd->qsd_ns != NULL) { - ldlm_namespace_put(qsd->qsd_ns); qsd->qsd_ns = NULL; } @@ -486,11 +479,17 @@ void qsd_fini(const struct lu_env *env, struct qsd_instance *qsd) /* deregister connection to the quota master */ qsd->qsd_exp_valid = false; - lustre_deregister_osp_item(&qsd->qsd_exp); + lustre_deregister_lwp_item(&qsd->qsd_exp); /* release per-filesystem information */ - if (qsd->qsd_fsinfo != NULL) + if (qsd->qsd_fsinfo != NULL) { + down(&qsd->qsd_fsinfo->qfs_sem); + /* remove from the list of fsinfo */ + cfs_list_del_init(&qsd->qsd_link); + up(&qsd->qsd_fsinfo->qfs_sem); qsd_put_fsinfo(qsd->qsd_fsinfo); + qsd->qsd_fsinfo = NULL; + } /* release quota root directory */ if (qsd->qsd_root != NULL) { @@ -547,7 +546,7 @@ struct qsd_instance *qsd_init(const struct lu_env *env, char *svname, rwlock_init(&qsd->qsd_lock); CFS_INIT_LIST_HEAD(&qsd->qsd_link); thread_set_flags(&qsd->qsd_upd_thread, SVC_STOPPED); - cfs_waitq_init(&qsd->qsd_upd_thread.t_ctl_waitq); + init_waitqueue_head(&qsd->qsd_upd_thread.t_ctl_waitq); CFS_INIT_LIST_HEAD(&qsd->qsd_upd_list); spin_lock_init(&qsd->qsd_adjust_lock); CFS_INIT_LIST_HEAD(&qsd->qsd_adjust_list); @@ -555,7 +554,9 @@ struct qsd_instance *qsd_init(const struct lu_env *env, char *svname, qsd->qsd_started = false; /* copy service name */ - strncpy(qsd->qsd_svname, svname, MAX_OBD_NAME); + if (strlcpy(qsd->qsd_svname, svname, sizeof(qsd->qsd_svname)) + >= sizeof(qsd->qsd_svname)) + GOTO(out, rc = -E2BIG); /* grab reference on osd device */ lu_device_get(&dev->dd_lu_dev); @@ -675,6 +676,15 @@ int qsd_prepare(const struct lu_env *env, struct qsd_instance *qsd) for (qtype = USRQUOTA; qtype < MAXQUOTAS; qtype++) { struct qsd_qtype_info *qqi = qsd->qsd_type_array[qtype]; + if (qsd_type_enabled(qsd, qtype) && 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); + break; + } + rc = qsd_start_reint_thread(qqi); if (rc) { CERROR("%s: failed to start reint thread for type %s " @@ -693,7 +703,7 @@ int qsd_prepare(const struct lu_env *env, struct qsd_instance *qsd) } /* generate osp name */ - rc = tgt_name2ospname((char *)qsd->qsd_svname, qti->qti_buf); + rc = tgt_name2lwpname((char *)qsd->qsd_svname, qti->qti_buf); if (rc) { CERROR("%s: failed to generate ospname (%d)\n", qsd->qsd_svname, rc); @@ -702,7 +712,7 @@ int qsd_prepare(const struct lu_env *env, struct qsd_instance *qsd) /* the connection callback will start the reintegration * procedure if quota is enabled */ - rc = lustre_register_osp_item(qti->qti_buf, &qsd->qsd_exp, + rc = lustre_register_lwp_item(qti->qti_buf, &qsd->qsd_exp, qsd_conn_callback, (void *)qsd); if (rc) { CERROR("%s: fail to get connection to master (%d)\n", @@ -733,7 +743,7 @@ int qsd_start(const struct lu_env *env, struct qsd_instance *qsd) write_lock(&qsd->qsd_lock); if (!qsd->qsd_prepared) { - CERROR("%s: can't start qsd instance since it was properly " + CERROR("%s: can't start qsd instance since it wasn't properly " "initialized\n", qsd->qsd_svname); rc = -EFAULT; } else if (qsd->qsd_started) { @@ -752,7 +762,7 @@ int qsd_start(const struct lu_env *env, struct qsd_instance *qsd) * up to usage; If usage < granted, release down to usage. */ for (type = USRQUOTA; type < MAXQUOTAS; type++) { struct qsd_qtype_info *qqi = qsd->qsd_type_array[type]; - cfs_waitq_signal(&qqi->qqi_reint_thread.t_ctl_waitq); + wake_up(&qqi->qqi_reint_thread.t_ctl_waitq); } RETURN(rc);