#ifdef __KERNEL__
#include <obd_class.h>
#include <linux/string.h>
+#include <lustre_disk.h>
#else
#include <liblustre.h>
#include <string.h>
#include <obd_class.h>
#include <obd.h>
#endif
+#include <lustre_ioctl.h>
#include <lustre_log.h>
#include <lprocfs_status.h>
#include <lustre_param.h>
obd->obd_pool_limit = 0;
obd->obd_pool_slv = 0;
- CFS_INIT_LIST_HEAD(&obd->obd_exports);
- CFS_INIT_LIST_HEAD(&obd->obd_unlinked_exports);
- CFS_INIT_LIST_HEAD(&obd->obd_delayed_exports);
- CFS_INIT_LIST_HEAD(&obd->obd_exports_timed);
- CFS_INIT_LIST_HEAD(&obd->obd_nid_stats);
+ INIT_LIST_HEAD(&obd->obd_exports);
+ INIT_LIST_HEAD(&obd->obd_unlinked_exports);
+ INIT_LIST_HEAD(&obd->obd_delayed_exports);
+ INIT_LIST_HEAD(&obd->obd_exports_timed);
+ INIT_LIST_HEAD(&obd->obd_nid_stats);
spin_lock_init(&obd->obd_nid_lock);
spin_lock_init(&obd->obd_dev_lock);
mutex_init(&obd->obd_dev_mutex);
spin_lock_init(&obd->obd_recovery_task_lock);
init_waitqueue_head(&obd->obd_next_transno_waitq);
init_waitqueue_head(&obd->obd_evict_inprogress_waitq);
- CFS_INIT_LIST_HEAD(&obd->obd_req_replay_queue);
- CFS_INIT_LIST_HEAD(&obd->obd_lock_replay_queue);
- CFS_INIT_LIST_HEAD(&obd->obd_final_req_queue);
- CFS_INIT_LIST_HEAD(&obd->obd_evict_list);
+ INIT_LIST_HEAD(&obd->obd_req_replay_queue);
+ INIT_LIST_HEAD(&obd->obd_lock_replay_queue);
+ INIT_LIST_HEAD(&obd->obd_final_req_queue);
+ INIT_LIST_HEAD(&obd->obd_evict_list);
+ INIT_LIST_HEAD(&obd->obd_lwp_list);
- llog_group_init(&obd->obd_olg, FID_SEQ_LLOG);
+ llog_group_init(&obd->obd_olg);
obd->obd_conn_inprogress = 0;
}
memcpy(obd->obd_uuid.uuid, uuid, len);
- /* do the attach */
- if (OBP(obd, attach)) {
- rc = OBP(obd,attach)(obd, sizeof *lcfg, lcfg);
- if (rc)
- GOTO(out, rc = -EINVAL);
- }
-
/* Detach drops this */
spin_lock(&obd->obd_dev_lock);
- cfs_atomic_set(&obd->obd_refcount, 1);
+ atomic_set(&obd->obd_refcount, 1);
spin_unlock(&obd->obd_dev_lock);
lu_ref_init(&obd->obd_reference);
lu_ref_add(&obd->obd_reference, "attach", obd);
obd->obd_attached = 1;
CDEBUG(D_IOCTL, "OBD: dev %d attached type %s with refcount %d\n",
- obd->obd_minor, typename, cfs_atomic_read(&obd->obd_refcount));
+ obd->obd_minor, typename, atomic_read(&obd->obd_refcount));
RETURN(0);
out:
if (obd != NULL) {
GOTO(err_hash, err = PTR_ERR(exp));
obd->obd_self_export = exp;
- cfs_list_del_init(&exp->exp_obd_chain_timed);
+ list_del_init(&exp->exp_obd_chain_timed);
class_export_put(exp);
err = obd_setup(obd, lcfg);
}
/* Leave this on forever */
obd->obd_stopping = 1;
+ spin_unlock(&obd->obd_dev_lock);
/* wait for already-arrived-connections to finish. */
- while (obd->obd_conn_inprogress > 0) {
- spin_unlock(&obd->obd_dev_lock);
-
- cond_resched();
-
- spin_lock(&obd->obd_dev_lock);
- }
- spin_unlock(&obd->obd_dev_lock);
+ while (obd->obd_conn_inprogress > 0)
+ yield();
+ smp_rmb();
if (lcfg->lcfg_bufcount >= 2 && LUSTRE_CFG_BUFLEN(lcfg, 1) > 0) {
for (flag = lustre_cfg_string(lcfg, 1); *flag != 0; flag++)
/* The three references that should be remaining are the
* obd_self_export and the attach and setup references. */
- if (cfs_atomic_read(&obd->obd_refcount) > 3) {
+ if (atomic_read(&obd->obd_refcount) > 3) {
/* refcounf - 3 might be the number of real exports
(excluding self export). But class_incref is called
by other things as well, so don't count on it. */
CDEBUG(D_IOCTL, "%s: forcing exports to disconnect: %d\n",
- obd->obd_name, cfs_atomic_read(&obd->obd_refcount) - 3);
+ obd->obd_name, atomic_read(&obd->obd_refcount) - 3);
dump_exports(obd, 0);
class_disconnect_exports(obd);
}
const char *scope, const void *source)
{
lu_ref_add_atomic(&obd->obd_reference, scope, source);
- cfs_atomic_inc(&obd->obd_refcount);
+ atomic_inc(&obd->obd_refcount);
CDEBUG(D_INFO, "incref %s (%p) now %d\n", obd->obd_name, obd,
- cfs_atomic_read(&obd->obd_refcount));
+ atomic_read(&obd->obd_refcount));
return obd;
}
int refs;
spin_lock(&obd->obd_dev_lock);
- cfs_atomic_dec(&obd->obd_refcount);
- refs = cfs_atomic_read(&obd->obd_refcount);
+ atomic_dec(&obd->obd_refcount);
+ refs = atomic_read(&obd->obd_refcount);
spin_unlock(&obd->obd_dev_lock);
lu_ref_del(&obd->obd_reference, scope, source);
CERROR("Cleanup %s returned %d\n",
obd->obd_name, err);
}
- if (OBP(obd, detach)) {
- err = OBP(obd, detach)(obd);
- if (err)
- CERROR("Detach returned %d\n", err);
- }
+
class_release_dev(obd);
}
}
RETURN(rc);
}
-CFS_LIST_HEAD(lustre_profile_list);
+struct list_head lustre_profile_list =
+ LIST_HEAD_INIT(lustre_profile_list);
struct lustre_profile *class_get_profile(const char * prof)
{
struct lustre_profile *lprof;
ENTRY;
- cfs_list_for_each_entry(lprof, &lustre_profile_list, lp_list) {
+ list_for_each_entry(lprof, &lustre_profile_list, lp_list) {
if (!strcmp(lprof->lp_profile, prof)) {
RETURN(lprof);
}
OBD_ALLOC(lprof, sizeof(*lprof));
if (lprof == NULL)
RETURN(-ENOMEM);
- CFS_INIT_LIST_HEAD(&lprof->lp_list);
+ INIT_LIST_HEAD(&lprof->lp_list);
LASSERT(proflen == (strlen(prof) + 1));
OBD_ALLOC(lprof->lp_profile, proflen);
memcpy(lprof->lp_md, mdc, mdclen);
}
- cfs_list_add(&lprof->lp_list, &lustre_profile_list);
+ list_add(&lprof->lp_list, &lustre_profile_list);
RETURN(err);
out:
lprof = class_get_profile(prof);
if (lprof) {
- cfs_list_del(&lprof->lp_list);
+ list_del(&lprof->lp_list);
OBD_FREE(lprof->lp_profile, strlen(lprof->lp_profile) + 1);
OBD_FREE(lprof->lp_dt, strlen(lprof->lp_dt) + 1);
if (lprof->lp_md)
struct lustre_profile *lprof, *n;
ENTRY;
- cfs_list_for_each_entry_safe(lprof, n, &lustre_profile_list, lp_list) {
- cfs_list_del(&lprof->lp_list);
+ list_for_each_entry_safe(lprof, n, &lustre_profile_list, lp_list) {
+ list_del(&lprof->lp_list);
OBD_FREE(lprof->lp_profile, strlen(lprof->lp_profile) + 1);
OBD_FREE(lprof->lp_dt, strlen(lprof->lp_dt) + 1);
if (lprof->lp_md)
#define lustre_check_exclusion(a,b) 0
#endif
+/*
+ * Supplemental functions for config logs, it allocates lustre_cfg
+ * buffers plus initialized llog record header at the beginning.
+ */
+struct llog_cfg_rec *lustre_cfg_rec_new(int cmd, struct lustre_cfg_bufs *bufs)
+{
+ struct llog_cfg_rec *lcr;
+ int reclen;
+
+ ENTRY;
+
+ reclen = lustre_cfg_len(bufs->lcfg_bufcount, bufs->lcfg_buflen);
+ reclen = llog_data_len(reclen) + sizeof(struct llog_rec_hdr) +
+ sizeof(struct llog_rec_tail);
+
+ OBD_ALLOC(lcr, reclen);
+ if (lcr == NULL)
+ RETURN(NULL);
+
+ lustre_cfg_init(&lcr->lcr_cfg, cmd, bufs);
+
+ lcr->lcr_hdr.lrh_len = reclen;
+ lcr->lcr_hdr.lrh_type = OBD_CFG_REC;
+
+ RETURN(lcr);
+}
+EXPORT_SYMBOL(lustre_cfg_rec_new);
+
+void lustre_cfg_rec_free(struct llog_cfg_rec *lcr)
+{
+ ENTRY;
+ OBD_FREE(lcr, lcr->lcr_hdr.lrh_len);
+ EXIT;
+}
+EXPORT_SYMBOL(lustre_cfg_rec_free);
+
/** Parse a configuration llog, doing various manipulations on them
* for various reasons, (modifications for compatibility, skip obsolete
* records, change uuids, etc), then class_process_config() resulting
if (marker->cm_flags & CM_START) {
/* all previous flags off */
clli->cfg_flags = CFG_F_MARKER;
+ server_name2index(marker->cm_tgtname,
+ &clli->cfg_lwp_idx, NULL);
if (marker->cm_flags & CM_SKIP) {
clli->cfg_flags |= CFG_F_SKIP;
CDEBUG(D_CONFIG, "SKIP #%d\n",
}
lcfg_new = lustre_cfg_new(lcfg->lcfg_command, &bufs);
+ if (lcfg_new == NULL)
+ GOTO(out, rc = -ENOMEM);
lcfg_new->lcfg_num = lcfg->lcfg_num;
lcfg_new->lcfg_flags = lcfg->lcfg_flags;
if (rec->lrh_type == OBD_CFG_REC) {
class_config_parse_rec(rec, outstr, 256);
- LCONSOLE(D_WARNING, " %s", outstr);
+ LCONSOLE(D_WARNING, " %s\n", outstr);
} else {
LCONSOLE(D_WARNING, "unhandled lrh_type: %#x\n", rec->lrh_type);
rc = -EINVAL;
}
static void *
-uuid_key(cfs_hlist_node_t *hnode)
+uuid_key(struct hlist_node *hnode)
{
- struct obd_export *exp;
+ struct obd_export *exp;
- exp = cfs_hlist_entry(hnode, struct obd_export, exp_uuid_hash);
+ exp = hlist_entry(hnode, struct obd_export, exp_uuid_hash);
- return &exp->exp_client_uuid;
+ return &exp->exp_client_uuid;
}
/*
* state with this function
*/
static int
-uuid_keycmp(const void *key, cfs_hlist_node_t *hnode)
+uuid_keycmp(const void *key, struct hlist_node *hnode)
{
struct obd_export *exp;
LASSERT(key);
- exp = cfs_hlist_entry(hnode, struct obd_export, exp_uuid_hash);
+ exp = hlist_entry(hnode, struct obd_export, exp_uuid_hash);
return obd_uuid_equals(key, &exp->exp_client_uuid) &&
!exp->exp_failed;
}
static void *
-uuid_export_object(cfs_hlist_node_t *hnode)
+uuid_export_object(struct hlist_node *hnode)
{
- return cfs_hlist_entry(hnode, struct obd_export, exp_uuid_hash);
+ return hlist_entry(hnode, struct obd_export, exp_uuid_hash);
}
static void
-uuid_export_get(cfs_hash_t *hs, cfs_hlist_node_t *hnode)
+uuid_export_get(cfs_hash_t *hs, struct hlist_node *hnode)
{
struct obd_export *exp;
- exp = cfs_hlist_entry(hnode, struct obd_export, exp_uuid_hash);
+ exp = hlist_entry(hnode, struct obd_export, exp_uuid_hash);
class_export_get(exp);
}
static void
-uuid_export_put_locked(cfs_hash_t *hs, cfs_hlist_node_t *hnode)
+uuid_export_put_locked(cfs_hash_t *hs, struct hlist_node *hnode)
{
struct obd_export *exp;
- exp = cfs_hlist_entry(hnode, struct obd_export, exp_uuid_hash);
+ exp = hlist_entry(hnode, struct obd_export, exp_uuid_hash);
class_export_put(exp);
}
}
static void *
-nid_key(cfs_hlist_node_t *hnode)
+nid_key(struct hlist_node *hnode)
{
struct obd_export *exp;
- exp = cfs_hlist_entry(hnode, struct obd_export, exp_nid_hash);
+ exp = hlist_entry(hnode, struct obd_export, exp_nid_hash);
RETURN(&exp->exp_connection->c_peer.nid);
}
* state with this function
*/
static int
-nid_kepcmp(const void *key, cfs_hlist_node_t *hnode)
+nid_kepcmp(const void *key, struct hlist_node *hnode)
{
struct obd_export *exp;
LASSERT(key);
- exp = cfs_hlist_entry(hnode, struct obd_export, exp_nid_hash);
+ exp = hlist_entry(hnode, struct obd_export, exp_nid_hash);
RETURN(exp->exp_connection->c_peer.nid == *(lnet_nid_t *)key &&
!exp->exp_failed);
}
static void *
-nid_export_object(cfs_hlist_node_t *hnode)
+nid_export_object(struct hlist_node *hnode)
{
- return cfs_hlist_entry(hnode, struct obd_export, exp_nid_hash);
+ return hlist_entry(hnode, struct obd_export, exp_nid_hash);
}
static void
-nid_export_get(cfs_hash_t *hs, cfs_hlist_node_t *hnode)
+nid_export_get(cfs_hash_t *hs, struct hlist_node *hnode)
{
struct obd_export *exp;
- exp = cfs_hlist_entry(hnode, struct obd_export, exp_nid_hash);
+ exp = hlist_entry(hnode, struct obd_export, exp_nid_hash);
class_export_get(exp);
}
static void
-nid_export_put_locked(cfs_hash_t *hs, cfs_hlist_node_t *hnode)
+nid_export_put_locked(cfs_hash_t *hs, struct hlist_node *hnode)
{
struct obd_export *exp;
- exp = cfs_hlist_entry(hnode, struct obd_export, exp_nid_hash);
+ exp = hlist_entry(hnode, struct obd_export, exp_nid_hash);
class_export_put(exp);
}
*/
static void *
-nidstats_key(cfs_hlist_node_t *hnode)
+nidstats_key(struct hlist_node *hnode)
{
struct nid_stat *ns;
- ns = cfs_hlist_entry(hnode, struct nid_stat, nid_hash);
+ ns = hlist_entry(hnode, struct nid_stat, nid_hash);
return &ns->nid;
}
static int
-nidstats_keycmp(const void *key, cfs_hlist_node_t *hnode)
+nidstats_keycmp(const void *key, struct hlist_node *hnode)
{
return *(lnet_nid_t *)nidstats_key(hnode) == *(lnet_nid_t *)key;
}
static void *
-nidstats_object(cfs_hlist_node_t *hnode)
+nidstats_object(struct hlist_node *hnode)
{
- return cfs_hlist_entry(hnode, struct nid_stat, nid_hash);
+ return hlist_entry(hnode, struct nid_stat, nid_hash);
}
static void
-nidstats_get(cfs_hash_t *hs, cfs_hlist_node_t *hnode)
+nidstats_get(cfs_hash_t *hs, struct hlist_node *hnode)
{
struct nid_stat *ns;
- ns = cfs_hlist_entry(hnode, struct nid_stat, nid_hash);
+ ns = hlist_entry(hnode, struct nid_stat, nid_hash);
nidstat_getref(ns);
}
static void
-nidstats_put_locked(cfs_hash_t *hs, cfs_hlist_node_t *hnode)
+nidstats_put_locked(cfs_hash_t *hs, struct hlist_node *hnode)
{
struct nid_stat *ns;
- ns = cfs_hlist_entry(hnode, struct nid_stat, nid_hash);
+ ns = hlist_entry(hnode, struct nid_stat, nid_hash);
nidstat_putref(ns);
}