summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
aecfa92)
All filesystems upgraded to 2.4 should run tunefs.lustre --quota to
have functional space accounting. If not done, we still allow the
filesystem to be started, but print an error on the console if the
administrator tries to enable quota.
Signed-off-by: Johann Lombardi <johann.lombardi@intel.com>
Change-Id: I98ff2cf5e5c381353b219679b935bc0584b033cc
Reviewed-on: http://review.whamcloud.com/4642
Tested-by: Hudson
Reviewed-by: Niu Yawei <yawei.niu@intel.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
/* Initialize the common environment to be used in the seq operations */
rc = lu_env_init(&lqp->lqp_env, LCT_LOCAL);
if (rc) {
/* Initialize the common environment to be used in the seq operations */
rc = lu_env_init(&lqp->lqp_env, LCT_LOCAL);
if (rc) {
+ char *obd_name = "quota";
+
+ if (lqp->lqp_obj != NULL)
+ obd_name = lqp->lqp_obj->do_lu.lo_dev->ld_obd->obd_name;
+
CERROR("%s: error initializing procfs quota env: rc = %d\n",
CERROR("%s: error initializing procfs quota env: rc = %d\n",
- lqp->lqp_obj->do_lu.lo_dev->ld_obd->obd_name, rc);
read_unlock(&qsd->qsd_lock);
if (skip)
continue;
read_unlock(&qsd->qsd_lock);
if (skip)
continue;
+ if (qsd->qsd_acct_failed) {
+ LCONSOLE_ERROR("%s: can't enable quota "
+ "enforcement since space "
+ "accounting isn't functional. "
+ "Please run tunefs.lustre "
+ "--quota on an unmounted "
+ "filesystem if not done already"
+ "\n", qsd->qsd_svname);
+ continue;
+ }
for (type = USRQUOTA; type < MAXQUOTAS; type++) {
qqi = qsd->qsd_type_array[type];
for (type = USRQUOTA; type < MAXQUOTAS; type++) {
qqi = qsd->qsd_type_array[type];
qsd_prepared:1, /* qsd_prepare() successfully
* called */
qsd_exp_valid:1,/* qsd_exp is now valid */
qsd_prepared:1, /* qsd_prepare() successfully
* called */
qsd_exp_valid:1,/* qsd_exp is now valid */
- qsd_stopping:1; /* qsd_instance is stopping */
+ qsd_stopping:1, /* qsd_instance is stopping */
+ qsd_acct_failed:1; /* failed to set up acct
+ * for one quota type */
qsd->qsd_is_md ? "md" : "dt", enabled,
qsd->qsd_exp_valid ? "setup" : "not setup yet");
qsd->qsd_is_md ? "md" : "dt", enabled,
qsd->qsd_exp_valid ? "setup" : "not setup yet");
+ if (qsd->qsd_prepared) {
+ memset(enabled, 0, sizeof(enabled));
+ if (qsd->qsd_type_array[USRQUOTA]->qqi_acct_obj != NULL)
+ strcat(enabled, "u");
+ if (qsd->qsd_type_array[GRPQUOTA]->qqi_acct_obj != NULL)
+ strcat(enabled, "g");
+ if (strlen(enabled) == 0)
+ strcat(enabled, "none");
rc += snprintf(page + rc, count - rc,
rc += snprintf(page + rc, count - rc,
"user uptodate: glb[%d],slv[%d],reint[%d]\n"
"group uptodate: glb[%d],slv[%d],reint[%d]\n",
"user uptodate: glb[%d],slv[%d],reint[%d]\n"
"group uptodate: glb[%d],slv[%d],reint[%d]\n",
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[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);
/* open accounting object */
LASSERT(qqi->qqi_acct_obj == NULL);
qqi->qqi_acct_obj = acct_obj_lookup(env, qsd->qsd_dev, qtype);
/* open accounting object */
LASSERT(qqi->qqi_acct_obj == NULL);
qqi->qqi_acct_obj = acct_obj_lookup(env, qsd->qsd_dev, qtype);
- if (qqi->qqi_acct_obj == NULL) {
- LCONSOLE_ERROR("%s: No %s space accounting support. Please use "
- "tunefs.lustre --quota option to enable quota "
- "accounting.\n",
- qsd->qsd_svname, QTYPE_NAME(qtype));
- GOTO(out, rc = -ENOENT);
+ if (IS_ERR(qqi->qqi_acct_obj)) {
+ LCONSOLE_WARN("%s: No %s space accounting support. Please "
+ "consider running tunefs.lustre --quota on an "
+ "unmounted filesystem to enable quota accounting."
+ "\n", qsd->qsd_svname,
+ QTYPE_NAME(qtype));
+ qqi->qqi_acct_obj = NULL;
+ qsd->qsd_acct_failed = true;
}
/* open global index copy */
}
/* open global index copy */
for (qtype = USRQUOTA; qtype < MAXQUOTAS; qtype++) {
struct qsd_qtype_info *qqi = qsd->qsd_type_array[qtype];
for (qtype = USRQUOTA; qtype < MAXQUOTAS; qtype++) {
struct qsd_qtype_info *qqi = qsd->qsd_type_array[qtype];
+ if (qsd_type_enabled(qsd, qtype) && qsd->qsd_acct_failed) {
+ LCONSOLE_ERROR("%s: can't enable quota enforcement "
+ "since space accounting isn't functional"
+ ". Please run tunefs.lustre --quota on "
+ "an unmounted filesystem if not done "
+ "already\n", qsd->qsd_svname);
+ break;
+ }
+
rc = qsd_start_reint_thread(qqi);
if (rc) {
CERROR("%s: failed to start reint thread for type %s "
rc = qsd_start_reint_thread(qqi);
if (rc) {
CERROR("%s: failed to start reint thread for type %s "
write_lock(&qsd->qsd_lock);
if (!qsd->qsd_prepared) {
write_lock(&qsd->qsd_lock);
if (!qsd->qsd_prepared) {
- CERROR("%s: can't start qsd instance since it was properly "
+ CERROR("%s: can't start qsd instance since it wasn't properly "
"initialized\n", qsd->qsd_svname);
rc = -EFAULT;
} else if (qsd->qsd_started) {
"initialized\n", qsd->qsd_svname);
rc = -EFAULT;
} else if (qsd->qsd_started) {
if (!qsd_type_enabled(qqi->qqi_qsd, qqi->qqi_qtype))
RETURN(0);
if (!qsd_type_enabled(qqi->qqi_qsd, qqi->qqi_qtype))
RETURN(0);
+ if (qqi->qqi_qsd->qsd_acct_failed)
+ /* no space accounting support, can't enable enforcement */
+ RETURN(0);
+
/* check if the reintegration has already started or finished */
write_lock(&qsd->qsd_lock);
/* check if the reintegration has already started or finished */
write_lock(&qsd->qsd_lock);
+ if (qsd->qsd_acct_failed) {
+ /* don't bother kicking off reintegration if space accounting
+ * failed to be enabled */
+ write_unlock(&qsd->qsd_lock);
+ return job_pending;
+ }
+
for (qtype = USRQUOTA; qtype < MAXQUOTAS; qtype++) {
struct qsd_qtype_info *qqi = qsd->qsd_type_array[qtype];
for (qtype = USRQUOTA; qtype < MAXQUOTAS; qtype++) {
struct qsd_qtype_info *qqi = qsd->qsd_type_array[qtype];