X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fquota%2Fqmt_dev.c;h=f785ac969696401c9e67dda5ed6eb11a1d52f4d4;hb=b0e8ab1a5f6f8d4a7c01241fec192ed50ad0b896;hp=da01c5123a4a9ad53c67ed95c739674ad305a535;hpb=fb06c1a898a5f0edd248db2cd6fbf8c31eac8dfd;p=fs%2Flustre-release.git diff --git a/lustre/quota/qmt_dev.c b/lustre/quota/qmt_dev.c index da01c51..f785ac9 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, 2017, Intel Corporation. * Use is subject to license terms. * * Author: Johann Lombardi @@ -66,10 +66,6 @@ * mdt_quota_init() for more details. */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif - #define DEBUG_SUBSYSTEM S_LQUOTA #include @@ -111,7 +107,13 @@ static struct lu_device *qmt_device_fini(const struct lu_env *env, } /* stop rebalance thread */ - qmt_stop_reba_thread(qmt); + if (!qmt->qmt_child->dd_rdonly) + qmt_stop_reba_thread(qmt); + + if (qmt->qmt_root) { + dt_object_put(env, qmt->qmt_root); + qmt->qmt_root = NULL; + } /* disconnect from OSD */ if (qmt->qmt_child_exp != NULL) { @@ -206,12 +208,17 @@ static int qmt_device_init0(const struct lu_env *env, struct qmt_device *qmt, struct lu_device *ld = qmt2lu_dev(qmt); struct obd_device *obd, *mdt_obd; struct obd_type *type; + char *svname = lustre_cfg_string(cfg, 0); int rc; ENTRY; + if (svname == NULL) + RETURN(-EINVAL); + /* record who i am, it might be useful ... */ - strncpy(qmt->qmt_svname, lustre_cfg_string(cfg, 0), - sizeof(qmt->qmt_svname) - 1); + rc = strlcpy(qmt->qmt_svname, svname, sizeof(qmt->qmt_svname)); + if (rc >= sizeof(qmt->qmt_svname)) + RETURN(-E2BIG); /* look-up the obd_device associated with the qmt */ obd = class_name2obd(qmt->qmt_svname); @@ -239,15 +246,15 @@ static int qmt_device_init0(const struct lu_env *env, struct qmt_device *qmt, GOTO(out, rc); /* set up and start rebalance thread */ - thread_set_flags(&qmt->qmt_reba_thread, SVC_STOPPED); - cfs_waitq_init(&qmt->qmt_reba_thread.t_ctl_waitq); - CFS_INIT_LIST_HEAD(&qmt->qmt_reba_list); - cfs_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); + INIT_LIST_HEAD(&qmt->qmt_reba_list); + spin_lock_init(&qmt->qmt_reba_lock); + if (!qmt->qmt_child->dd_rdonly) { + 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 @@ -255,6 +262,9 @@ static int qmt_device_init0(const struct lu_env *env, struct qmt_device *qmt, type = class_search_type(LUSTRE_QMT_NAME); LASSERT(type != NULL); + /* put reference taken by class_search_type */ + kobject_put(&type->typ_kobj); + /* register proc directory associated with this qmt */ qmt->qmt_proc = lprocfs_register(qmt->qmt_svname, type->typ_procroot, NULL, NULL); @@ -269,6 +279,7 @@ static int qmt_device_init0(const struct lu_env *env, struct qmt_device *qmt, rc = qmt_pool_init(env, qmt); if (rc) GOTO(out, rc); + EXIT; out: if (rc) @@ -412,10 +423,14 @@ static int qmt_device_obd_disconnect(struct obd_export *exp) /* * obd device operations associated with the master target. */ -struct obd_ops qmt_obd_ops = { +static const struct obd_ops qmt_obd_ops = { .o_owner = THIS_MODULE, .o_connect = qmt_device_obd_connect, .o_disconnect = qmt_device_obd_disconnect, + .o_pool_new = qmt_pool_new, + .o_pool_rem = qmt_pool_rem, + .o_pool_add = qmt_pool_add, + .o_pool_del = qmt_pool_del, }; /* @@ -448,10 +463,9 @@ static int qmt_device_prepare(const struct lu_env *env, RETURN(rc); } + qmt->qmt_root = qmt_root; /* initialize on-disk indexes associated with each pool */ - rc = qmt_pool_prepare(env, qmt, qmt_root); - - lu_object_put(env, &qmt_root->do_lu); + rc = qmt_pool_prepare(env, qmt, qmt_root, NULL); RETURN(rc); } @@ -470,8 +484,8 @@ 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, + LUSTRE_QMT_NAME, &qmt_device_type); RETURN(rc); }