* GPL HEADER END
*/
/*
- * Copyright (c) 2012, 2016, Intel Corporation.
+ * Copyright (c) 2012, 2017, Intel Corporation.
* Use is subject to license terms.
*
* Author: Johann Lombardi <johann.lombardi@intel.com>
strcat(enabled, "u");
if (qsd_type_enabled(qsd, GRPQUOTA))
strcat(enabled, "g");
+ if (qsd_type_enabled(qsd, PRJQUOTA))
+ strncat(enabled, "p", 1);
if (strlen(enabled) == 0)
strcat(enabled, "none");
strcat(enabled, "u");
if (qsd->qsd_type_array[GRPQUOTA]->qqi_acct_obj != NULL)
strcat(enabled, "g");
+ if (qsd->qsd_type_array[PRJQUOTA]->qqi_acct_obj != NULL)
+ strncat(enabled, "p", 1);
if (strlen(enabled) == 0)
strcat(enabled, "none");
seq_printf(m, "space acct: %s\n"
"user uptodate: glb[%d],slv[%d],reint[%d]\n"
- "group uptodate: glb[%d],slv[%d],reint[%d]\n",
+ "group uptodate: glb[%d],slv[%d],reint[%d]\n"
+ "project uptodate: glb[%d],slv[%d],reint[%d]\n",
enabled,
qsd->qsd_type_array[USRQUOTA]->qqi_glb_uptodate,
qsd->qsd_type_array[USRQUOTA]->qqi_slv_uptodate,
qsd->qsd_type_array[USRQUOTA]->qqi_reint,
qsd->qsd_type_array[GRPQUOTA]->qqi_glb_uptodate,
qsd->qsd_type_array[GRPQUOTA]->qqi_slv_uptodate,
- qsd->qsd_type_array[GRPQUOTA]->qqi_reint);
+ qsd->qsd_type_array[GRPQUOTA]->qqi_reint,
+ qsd->qsd_type_array[PRJQUOTA]->qqi_glb_uptodate,
+ qsd->qsd_type_array[PRJQUOTA]->qqi_slv_uptodate,
+ qsd->qsd_type_array[PRJQUOTA]->qqi_reint);
}
return 0;
}
strcat(enabled, "u");
if (qsd_type_enabled(qsd, GRPQUOTA))
strcat(enabled, "g");
+ if (qsd_type_enabled(qsd, PRJQUOTA))
+ strncat(enabled, "p", 1);
if (strlen(enabled) == 0)
strcat(enabled, "none");
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 */
}
return rc == 0 ? count : rc;
}
-LPROC_SEQ_FOPS_WO_TYPE(qsd, force_reint);
+LPROC_SEQ_FOPS_WR_ONLY(qsd, force_reint);
static int qsd_timeout_seq_show(struct seq_file *m, void *data)
{
size_t count, loff_t *off)
{
struct qsd_instance *qsd = ((struct seq_file *)file->private_data)->private;
+ time64_t timeout;
int rc;
- __s64 timeout;
- LASSERT(qsd != NULL);
- rc = lprocfs_str_to_s64(buffer, count, &timeout);
+ LASSERT(qsd != NULL);
+ rc = kstrtoll_from_user(buffer, count, 0, &timeout);
if (rc)
return rc;
- if (timeout < 0 || timeout > INT_MAX)
+
+ if (timeout < 0)
return -EINVAL;
qsd->qsd_timeout = timeout;
static const char *qtype2acct_name(int qtype)
{
+ static char unknown[24];
+
switch (qtype) {
case USRQUOTA:
return "acct_user";
return "acct_project";
}
- LASSERTF(0, "invalid quota type: %d", qtype);
- return NULL;
+ snprintf(unknown, sizeof(unknown), "acct_unknown_%u", qtype);
+ return unknown;
}
static const char *qtype2glb_name(int qtype)
{
+ static char unknown[24];
+
switch (qtype) {
case USRQUOTA:
return "limit_user";
return "limit_project";
}
- LASSERTF(0, "invalid quota type: %d", qtype);
- return NULL;
+ snprintf(unknown, sizeof(unknown), "acct_unknown_%u", qtype);
+ return unknown;
}
/*
for (qtype = USRQUOTA; qtype < LL_MAXQUOTAS; qtype++)
qsd_qtype_fini(env, qsd, qtype);
- if (qsd->qsd_exp) {
- /* deregister connection to the quota master */
- qsd->qsd_exp_valid = false;
- lustre_deregister_lwp_item(&qsd->qsd_exp);
- }
+ /* deregister connection to the quota master */
+ qsd->qsd_exp_valid = false;
+ lustre_deregister_lwp_item(&qsd->qsd_exp);
/* release per-filesystem information */
if (qsd->qsd_fsinfo != NULL) {
". Please run tunefs.lustre --quota on "
"an unmounted filesystem if not done "
"already\n", qsd->qsd_svname);
- break;
+ continue;
}
rc = qsd_start_reint_thread(qqi);