Whamcloud - gitweb
LU-148 ll_readpage has to unlock vmpage by any means
[fs/lustre-release.git] / lustre / mgc / mgc_request.c
index 883b621..8f4c568 100644 (file)
@@ -26,7 +26,7 @@
  * 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.
  */
 /*
@@ -221,6 +221,7 @@ struct config_llog_data *do_config_log_add(struct obd_device *obd,
         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;
@@ -261,8 +262,8 @@ struct config_llog_data *do_config_log_add(struct obd_device *obd,
         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.
  */
@@ -313,7 +314,8 @@ static int config_log_add(struct obd_device *obd, char *logname,
 
 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;
@@ -324,7 +326,7 @@ static int config_log_end(char *logname, struct config_llog_instance *cfg)
         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:
@@ -333,14 +335,14 @@ static int config_log_end(char *logname, struct config_llog_instance *cfg)
          * 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;
@@ -417,7 +419,7 @@ static int mgc_requeue_thread(void *data)
                 /* 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);
@@ -569,8 +571,8 @@ static int mgc_fs_setup(struct obd_device *obd, struct super_block *sb,
         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);
@@ -1242,8 +1244,10 @@ out:
         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)
 {
@@ -1261,10 +1265,10 @@ int mgc_process_log(struct obd_device *mgc,
            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);
         }
 
@@ -1279,7 +1283,7 @@ int mgc_process_log(struct obd_device *mgc,
         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);
         }
 
@@ -1366,11 +1370,15 @@ out_pop:
         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;
@@ -1380,7 +1388,7 @@ static int mgc_process_config(struct obd_device *obd, obd_count len, void *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) !=
@@ -1394,8 +1402,7 @@ static int mgc_process_config(struct obd_device *obd, obd_count len, void *buf)
                 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;