* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/
/*
strcpy(cld->cld_logname, logname);
if (cfg)
cld->cld_cfg = *cfg;
+ cfs_mutex_init(&cld->cld_lock);
cld->cld_cfg.cfg_last_idx = 0;
cld->cld_cfg.cfg_flags = 0;
cld->cld_cfg.cfg_sb = sb;
RETURN(cld);
}
-/**
- * Add this log to our list of active logs.
+/** Add this log to the list of active logs watched by an MGC.
+ * Active means we're watching for updates.
* We have one active log per "mount" - client instance or servername.
* Each instance may be at a different point in the log.
*/
CFS_DECLARE_MUTEX(llog_process_lock);
-/* Stop watching for updates on this log. */
+/** Stop watching for updates on this log.
+ */
static int config_log_end(char *logname, struct config_llog_instance *cfg)
{
struct config_llog_data *cld, *cld_sptlrpc = NULL;
if (IS_ERR(cld))
RETURN(PTR_ERR(cld));
- cfs_down(&llog_process_lock);
+ cfs_mutex_lock(&cld->cld_lock);
/*
* if cld_stopping is set, it means we didn't start the log thus
* not owning the start ref. this can happen after previous umount:
* calling start_log.
*/
if (unlikely(cld->cld_stopping)) {
- cfs_up(&llog_process_lock);
+ cfs_mutex_unlock(&cld->cld_lock);
/* drop the ref from the find */
config_log_put(cld);
RETURN(rc);
}
cld->cld_stopping = 1;
- cfs_up(&llog_process_lock);
+ cfs_mutex_unlock(&cld->cld_lock);
cfs_spin_lock(&config_list_lock);
cld_sptlrpc = cld->cld_sptlrpc;
/* Always wait a few seconds to allow the server who
caused the lock revocation to finish its setup, plus some
random so everyone doesn't try to reconnect at once. */
- lwi_now = LWI_TIMEOUT(3 * CFS_HZ + (ll_rand() & 0xff) * \
+ lwi_now = LWI_TIMEOUT(3 * CFS_HZ + (cfs_rand() & 0xff) * \
(CFS_HZ / 100),
NULL, NULL);
l_wait_event(rq_waitq, rq_state & RQ_STOP, &lwi_now);
obd->obd_lvfs_ctxt.fs = get_ds();
push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
- dentry = lookup_one_len(MOUNT_CONFIGS_DIR, cfs_fs_pwd(current->fs),
- strlen(MOUNT_CONFIGS_DIR));
+ dentry = ll_lookup_one_len(MOUNT_CONFIGS_DIR, cfs_fs_pwd(current->fs),
+ strlen(MOUNT_CONFIGS_DIR));
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
if (IS_ERR(dentry)) {
err = PTR_ERR(dentry);
RETURN(rc);
}
-/* Get a config log from the MGS and process it.
- This func is called for both clients and servers. */
+/** Get a config log from the MGS and process it.
+ * This func is called for both clients and servers.
+ * Copy the log locally before parsing it if appropriate (non-MGS server)
+ */
int mgc_process_log(struct obd_device *mgc,
struct config_llog_data *cld)
{
sounds like badness. It actually might be fine, as long as
we're not trying to update from the same log
simultaneously (in which case we should use a per-log sem.) */
- cfs_down(&llog_process_lock);
+ cfs_mutex_lock(&cld->cld_lock);
if (cld->cld_stopping) {
- cfs_up(&llog_process_lock);
+ cfs_mutex_unlock(&cld->cld_lock);
RETURN(0);
}
ctxt = llog_get_context(mgc, LLOG_CONFIG_REPL_CTXT);
if (!ctxt) {
CERROR("missing llog context\n");
- cfs_up(&llog_process_lock);
+ cfs_mutex_unlock(&cld->cld_lock);
RETURN(-EINVAL);
}
CDEBUG(D_MGC, "%s: configuration from log '%s' %sed (%d).\n",
mgc->obd_name, cld->cld_logname, rc ? "fail" : "succeed", rc);
- cfs_up(&llog_process_lock);
+ cfs_mutex_unlock(&cld->cld_lock);
RETURN(rc);
}
+/** Called from lustre_process_log.
+ * LCFG_LOG_START gets the config log from the MGS, processes it to start
+ * any services, and adds it to the list logs to watch (follow).
+ */
static int mgc_process_config(struct obd_device *obd, obd_count len, void *buf)
{
struct lustre_cfg *lcfg = buf;
switch(cmd = lcfg->lcfg_command) {
case LCFG_LOV_ADD_OBD: {
- /* Add any new target, not just osts */
+ /* Overloading this cfg command: register a new target */
struct mgs_target_info *mti;
if (LUSTRE_CFG_BUFLEN(lcfg, 1) !=
break;
}
case LCFG_LOV_DEL_OBD:
- /* Remove target from the fs? */
- /* FIXME */
+ /* Unregister has no meaning at the moment. */
CERROR("lov_del_obd unimplemented\n");
rc = -ENOSYS;
break;