Whamcloud - gitweb
LU-12518 llite: Accept EBUSY for page unaligned read
[fs/lustre-release.git] / lustre / ptlrpc / sec_config.c
index dc3178c..e7e08ed 100644 (file)
@@ -618,66 +618,86 @@ static int sptlrpc_conf_merge_rule(struct sptlrpc_conf *conf,
  * find one through the target name in the record inside conf_lock;
  * otherwise means caller already hold conf_lock.
  */
-static int __sptlrpc_process_config(struct lustre_cfg *lcfg,
-                                    struct sptlrpc_conf *conf)
+static int __sptlrpc_process_config(char *target, const char *fsname,
+                                   struct sptlrpc_rule *rule,
+                                   struct sptlrpc_conf *conf)
 {
-        char                   *target, *param;
-        char                    fsname[MTI_NAME_MAXLEN];
-        struct sptlrpc_rule     rule;
-        int                     rc;
-        ENTRY;
-
-        target = lustre_cfg_string(lcfg, 1);
-        if (target == NULL) {
-                CERROR("missing target name\n");
-                RETURN(-EINVAL);
-        }
-
-        param = lustre_cfg_string(lcfg, 2);
-        if (param == NULL) {
-                CERROR("missing parameter\n");
-                RETURN(-EINVAL);
-        }
-
-        CDEBUG(D_SEC, "processing rule: %s.%s\n", target, param);
-
-        /* parse rule to make sure the format is correct */
-        if (strncmp(param, PARAM_SRPC_FLVR, sizeof(PARAM_SRPC_FLVR) - 1) != 0) {
-                CERROR("Invalid sptlrpc parameter: %s\n", param);
-                RETURN(-EINVAL);
-        }
-        param += sizeof(PARAM_SRPC_FLVR) - 1;
-
-        rc = sptlrpc_parse_rule(param, &rule);
-        if (rc)
-                RETURN(-EINVAL);
+       int rc;
 
-        if (conf == NULL) {
-               obdname2fsname(target, fsname, sizeof(fsname));
+       ENTRY;
+       if (!conf) {
+               if (!fsname)
+                       return -ENODEV;
 
                mutex_lock(&sptlrpc_conf_lock);
-                conf = sptlrpc_conf_get(fsname, 0);
-                if (conf == NULL) {
-                        CERROR("can't find conf\n");
-                        rc = -ENOMEM;
-                } else {
-                        rc = sptlrpc_conf_merge_rule(conf, target, &rule);
-                }
+               conf = sptlrpc_conf_get(fsname, 0);
+               if (!conf) {
+                       CERROR("can't find conf\n");
+                       rc = -ENOMEM;
+               } else {
+                       rc = sptlrpc_conf_merge_rule(conf, target, rule);
+               }
                mutex_unlock(&sptlrpc_conf_lock);
-        } else {
+       } else {
                LASSERT(mutex_is_locked(&sptlrpc_conf_lock));
-                rc = sptlrpc_conf_merge_rule(conf, target, &rule);
-        }
+               rc = sptlrpc_conf_merge_rule(conf, target, rule);
+       }
 
-        if (rc == 0)
-                conf->sc_modified++;
+       if (!rc)
+               conf->sc_modified++;
 
-        RETURN(rc);
+       RETURN(rc);
 }
 
 int sptlrpc_process_config(struct lustre_cfg *lcfg)
 {
-        return __sptlrpc_process_config(lcfg, NULL);
+       char fsname[MTI_NAME_MAXLEN];
+       struct sptlrpc_rule rule;
+       char *target, *param;
+       int rc;
+
+       print_lustre_cfg(lcfg);
+
+       target = lustre_cfg_string(lcfg, 1);
+       if (!target) {
+               CERROR("missing target name\n");
+               return -EINVAL;
+       }
+
+       param = lustre_cfg_string(lcfg, 2);
+       if (!param) {
+               CERROR("missing parameter\n");
+               return -EINVAL;
+       }
+
+       /* parse rule to make sure the format is correct */
+       if (strncmp(param, PARAM_SRPC_FLVR,
+                   sizeof(PARAM_SRPC_FLVR) - 1) != 0) {
+               CERROR("Invalid sptlrpc parameter: %s\n", param);
+               return -EINVAL;
+       }
+       param += sizeof(PARAM_SRPC_FLVR) - 1;
+
+       CDEBUG(D_SEC, "processing rule: %s.%s\n", target, param);
+
+       /*
+        * Three types of targets exist for sptlrpc using conf_param
+        * 1.   '_mgs' which targets mgc srpc settings. Treat it as
+        *      as a special file system name.
+        * 2.   target is a device which can be fsname-MDTXXXX or
+        *      fsname-OSTXXXX. This can be verified by the function
+        *      server_name2fsname.
+        * 3.   If both above conditions are not meet then the target
+        *      is a actual filesystem.
+        */
+       if (server_name2fsname(target, fsname, NULL))
+               strlcpy(fsname, target, sizeof(target));
+
+       rc = sptlrpc_parse_rule(param, &rule);
+       if (rc)
+               return rc;
+
+       return __sptlrpc_process_config(target, fsname, &rule, NULL);
 }
 EXPORT_SYMBOL(sptlrpc_process_config);
 
@@ -891,11 +911,11 @@ void sptlrpc_conf_client_adapt(struct obd_device *obd)
 
        imp = obd->u.cli.cl_import;
        if (imp) {
-               spin_lock(&imp->imp_lock);
+               write_lock(&imp->imp_sec_lock);
                if (imp->imp_sec)
                        imp->imp_sec_expire = ktime_get_real_seconds() +
                                SEC_ADAPT_DELAY;
-               spin_unlock(&imp->imp_lock);
+               write_unlock(&imp->imp_sec_lock);
        }
 
        up_read(&obd->u.cli.cl_sem);