RETURN(qfs);
}
-/*
- * Quota configuration handlers in charge of processing all per-filesystem quota
- * parameters set via conf_param.
- *
- * \param lcfg - quota configuration log to be processed
- */
-int qsd_process_config(struct lustre_cfg *lcfg)
+int qsd_config(char *valstr, char *fsname, int pool)
{
- struct qsd_fsinfo *qfs;
- char *fsname = lustre_cfg_string(lcfg, 0);
- char *cfgstr = lustre_cfg_string(lcfg, 1);
- char *keystr, *valstr;
- int rc, pool, enabled = 0;
- bool reint = false;
- ENTRY;
-
- CDEBUG(D_QUOTA, "processing quota parameter: fs:%s cfgstr:%s\n", fsname,
- cfgstr);
-
- if (class_match_param(cfgstr, PARAM_QUOTA, &keystr) != 0)
- RETURN(-EINVAL);
-
- if (!class_match_param(keystr, QUOTA_METAPOOL_NAME, &valstr))
- pool = LQUOTA_RES_MD;
- else if (!class_match_param(keystr, QUOTA_DATAPOOL_NAME, &valstr))
- pool = LQUOTA_RES_DT;
- else
- RETURN(-EINVAL);
+ struct qsd_fsinfo *qfs;
+ int rc, enabled = 0;
+ bool reint = false;
+ ENTRY;
qfs = qsd_get_fsinfo(fsname, 0);
if (qfs == NULL) {
CERROR("failed to find quota filesystem information for %s\n",
qsd_put_fsinfo(qfs);
RETURN(0);
}
+
+/*
+ * Quota configuration handlers in charge of processing all per-filesystem quota
+ * parameters set via conf_param.
+ *
+ * \param lcfg - quota configuration log to be processed
+ */
+int qsd_process_config(struct lustre_cfg *lcfg)
+{
+ char *fsname = lustre_cfg_string(lcfg, 0);
+ char *cfgstr = lustre_cfg_string(lcfg, 1);
+ char *keystr, *valstr;
+ int pool;
+
+ ENTRY;
+ CDEBUG(D_QUOTA, "processing quota parameter: fs:%s cfgstr:%s\n", fsname,
+ cfgstr);
+
+ if (class_match_param(cfgstr, PARAM_QUOTA, &keystr) != 0)
+ RETURN(-EINVAL);
+
+ if (!class_match_param(keystr, QUOTA_METAPOOL_NAME, &valstr))
+ pool = LQUOTA_RES_MD;
+ else if (!class_match_param(keystr, QUOTA_DATAPOOL_NAME, &valstr))
+ pool = LQUOTA_RES_DT;
+ else
+ RETURN(-EINVAL);
+
+ return qsd_config(valstr, fsname, pool);
+}
seq_printf(m, "%s\n", enabled);
return 0;
}
-LPROC_SEQ_FOPS_RO(qsd_enabled);
+
+static ssize_t qsd_enabled_seq_write(struct file *file,
+ const char __user *buffer,
+ size_t count, loff_t *off)
+{
+ struct seq_file *m = file->private_data;
+ struct qsd_instance *qsd = m->private;
+ char fsname[LUSTRE_MAXFSNAME];
+ int enabled = 0;
+ char valstr[5];
+ int pool, rc;
+
+ if (count > 4)
+ return -E2BIG;
+
+ if (copy_from_user(valstr, buffer, count))
+ GOTO(out, count = -EFAULT);
+
+ if (strchr(valstr, 'u'))
+ enabled |= BIT(USRQUOTA);
+ if (strchr(valstr, 'g'))
+ enabled |= BIT(GRPQUOTA);
+ if (strchr(valstr, 'p'))
+ enabled |= BIT(PRJQUOTA);
+
+ if (enabled == 0 && strcmp(valstr, "none"))
+ GOTO(out, count = -EINVAL);
+
+ if (qsd->qsd_is_md)
+ pool = LQUOTA_RES_MD;
+ else
+ pool = LQUOTA_RES_DT;
+
+ if (server_name2fsname(qsd->qsd_svname, fsname, NULL))
+ GOTO(out, count = -EINVAL);
+
+ rc = qsd_config(valstr, fsname, pool);
+ if (rc)
+ count = rc;
+out:
+ return count;
+}
+LPROC_SEQ_FOPS(qsd_enabled);
/* force reintegration procedure to be executed.
* Used for test/debugging purpose */