X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fquota%2Fqmt_dev.c;h=28783a03601b6b9682261fda25dde3fe1e4639d1;hb=73ef5dcd8bcf32e4127e0011357b8bc39472cdba;hp=701cc161a3fbe2e0b04b89aa94f5442bfc28a444;hpb=294aa9cb666c48e02da1057c222fe5f206ce38fc;p=fs%2Flustre-release.git diff --git a/lustre/quota/qmt_dev.c b/lustre/quota/qmt_dev.c index 701cc16..28783a0 100644 --- a/lustre/quota/qmt_dev.c +++ b/lustre/quota/qmt_dev.c @@ -21,7 +21,7 @@ * GPL HEADER END */ /* - * Copyright (c) 2012 Intel, Inc. + * Copyright (c) 2012, Intel Corporation. * Use is subject to license terms. * * Author: Johann Lombardi @@ -45,7 +45,7 @@ * The QMT device is currently set up by the MDT and should probably be moved * to a separate target in the future. Meanwhile, the MDT forwards all quota * requests to the QMT via a list of request handlers (see struct qmt_handlers - * in lquota.h). The QMT also borrows the LDLM namespace from the MDT. + * in lustre_quota.h). The QMT also borrows the LDLM namespace from the MDT. * * To bring up a QMT device, the following steps must be completed: * @@ -66,10 +66,6 @@ * mdt_quota_init() for more details. */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif - #define DEBUG_SUBSYSTEM S_LQUOTA #include @@ -101,14 +97,17 @@ static struct lu_device *qmt_device_fini(const struct lu_env *env, CDEBUG(D_QUOTA, "%s: initiating QMT shutdown\n", qmt->qmt_svname); qmt->qmt_stopping = true; + /* kill pool instances, if any */ + qmt_pool_fini(env, qmt); + /* remove qmt proc entry */ if (qmt->qmt_proc != NULL && !IS_ERR(qmt->qmt_proc)) { lprocfs_remove(&qmt->qmt_proc); qmt->qmt_proc = NULL; } - /* kill pool instances, if any */ - qmt_pool_fini(env, qmt); + /* stop rebalance thread */ + qmt_stop_reba_thread(qmt); /* disconnect from OSD */ if (qmt->qmt_child_exp != NULL) { @@ -117,12 +116,9 @@ static struct lu_device *qmt_device_fini(const struct lu_env *env, qmt->qmt_child = NULL; } - /* release reference on MDT namespace */ - if (ld->ld_obd->obd_namespace != NULL) { - ldlm_namespace_put(ld->ld_obd->obd_namespace); - ld->ld_obd->obd_namespace = NULL; - qmt->qmt_ns = NULL; - } + /* clear references to MDT namespace */ + ld->ld_obd->obd_namespace = NULL; + qmt->qmt_ns = NULL; RETURN(NULL); } @@ -227,10 +223,9 @@ static int qmt_device_init0(const struct lu_env *env, struct qmt_device *qmt, if (mdt_obd == NULL) RETURN(-ENOENT); - /* grab reference on MDT namespace. kind of a hack until we have our - * own namespace & service threads */ + /* borrow MDT namespace. kind of a hack until we have our own namespace + * & service threads */ LASSERT(mdt_obd->obd_namespace != NULL); - ldlm_namespace_get(mdt_obd->obd_namespace); obd->obd_namespace = mdt_obd->obd_namespace; qmt->qmt_ns = obd->obd_namespace; @@ -239,14 +234,26 @@ static int qmt_device_init0(const struct lu_env *env, struct qmt_device *qmt, if (rc) GOTO(out, rc); + /* set up and start rebalance thread */ + thread_set_flags(&qmt->qmt_reba_thread, SVC_STOPPED); + init_waitqueue_head(&qmt->qmt_reba_thread.t_ctl_waitq); + CFS_INIT_LIST_HEAD(&qmt->qmt_reba_list); + spin_lock_init(&qmt->qmt_reba_lock); + rc = qmt_start_reba_thread(qmt); + if (rc) { + CERROR("%s: failed to start rebalance thread (%d)\n", + qmt->qmt_svname, rc); + GOTO(out, rc); + } + /* at the moment there is no linkage between lu_type and obd_type, so * we lookup obd_type this way */ type = class_search_type(LUSTRE_QMT_NAME); LASSERT(type != NULL); /* register proc directory associated with this qmt */ - qmt->qmt_proc = lprocfs_register(qmt->qmt_svname, type->typ_procroot, - NULL, NULL); + qmt->qmt_proc = lprocfs_seq_register(qmt->qmt_svname, type->typ_procroot, + NULL, NULL); if (IS_ERR(qmt->qmt_proc)) { rc = PTR_ERR(qmt->qmt_proc); CERROR("%s: failed to create qmt proc entry (%d)\n", @@ -459,8 +466,11 @@ int qmt_glb_init(void) int rc; ENTRY; - rc = class_register_type(&qmt_obd_ops, NULL, NULL, LUSTRE_QMT_NAME, - &qmt_device_type); + rc = class_register_type(&qmt_obd_ops, NULL, true, NULL, +#ifndef HAVE_ONLY_PROCFS_SEQ + NULL, +#endif + LUSTRE_QMT_NAME, &qmt_device_type); RETURN(rc); }