* GPL HEADER END
*/
/*
- * Copyright (c) 2011, 2012, Whamcloud, Inc.
+ * Copyright (c) 2012, Intel Corporation.
* Use is subject to license terms.
*
* Author: Johann Lombardi <johann@whamcloud.com>
* Author: Niu Yawei <niu@whamcloud.com>
*/
-#include <lquota.h>
+#include <lustre_quota.h>
#include "osd_internal.h"
/**
#define QUOTA_IT_READ_ERROR(it, rc) \
CERROR("%s: Error while trying to read quota information, " \
"failed with %d\n", \
- it->oiq_obj->oo_dt.do_lu.lo_dev->ld_obd->obd_name, rc); \
+ osd_dev(it->oiq_obj->oo_dt.do_lu.lo_dev)->od_svname, rc); \
/**
* Initialize osd Iterator for given osd index object.
RETURN(-EOVERFLOW);
}
- oh->ot_credits += (allocated || qi->lqi_id.qid_uid == 0) ?
- 1 : LDISKFS_QUOTA_INIT_BLOCKS(osd_sb(dev));
+ osd_trans_declare_op(env, oh, OSD_OT_QUOTA,
+ (allocated || qi->lqi_id.qid_uid == 0) ?
+ 1: LDISKFS_QUOTA_INIT_BLOCKS(osd_sb(dev)));
oh->ot_id_array[i] = qi->lqi_id.qid_uid;
osd_qid_set_type(oh, i, qi->lqi_type);
}
};
-static int write_quota_rec(const struct lu_env *env, struct dt_object *dt,
- __u64 id, struct lquota_glb_rec *rec)
-{
- struct osd_device *osd = osd_obj2dev(osd_dt_obj(dt));
- struct thandle *th;
- struct dt_key *key = (struct dt_key *)&id;
- int rc;
- ENTRY;
-
- th = dt_trans_create(env, &osd->od_dt_dev);
- if (IS_ERR(th))
- RETURN(PTR_ERR(th));
-
- /* the entry with 0 key can always be found in IAM file. */
- if (id == 0) {
- rc = dt_declare_delete(env, dt, key, th);
- if (rc)
- GOTO(out, rc);
- }
-
- rc = dt_declare_insert(env, dt, (struct dt_rec *)rec, key, th);
- if (rc)
- GOTO(out, rc);
-
- rc = dt_trans_start_local(env, &osd->od_dt_dev, th);
- if (rc)
- GOTO(out, rc);
-
- dt_write_lock(env, dt, 0);
-
- if (id == 0) {
- struct lquota_glb_rec *tmp;
-
- OBD_ALLOC_PTR(tmp);
- if (tmp == NULL)
- GOTO(out_lock, rc = -ENOMEM);
-
- rc = dt_lookup(env, dt, (struct dt_rec *)tmp, key,
- BYPASS_CAPA);
-
- OBD_FREE_PTR(tmp);
- if (rc == 0) {
- rc = dt_delete(env, dt, key, th, BYPASS_CAPA);
- if (rc)
- GOTO(out_lock, rc);
- }
- rc = 0;
- }
-
- rc = dt_insert(env, dt, (struct dt_rec *)rec, key, th, BYPASS_CAPA, 1);
-out_lock:
- dt_write_unlock(env, dt);
-out:
- dt_trans_stop(env, &osd->od_dt_dev, th);
- RETURN(rc);
-}
-
static int convert_quota_file(const struct lu_env *env,
struct dt_object *old, struct dt_object *new,
bool isblk)
grace = isblk ? dqinfo->dqi_bgrace : dqinfo->dqi_igrace;
if (grace != 0) {
glb_rec->qbr_time = grace;
- rc = write_quota_rec(env, new, 0, glb_rec);
+ rc = lquota_disk_write_glb(env, new, 0, glb_rec);
if (rc)
GOTO(out, rc);
glb_rec->qbr_time = 0;
glb_rec->qbr_softlimit = isblk ? dqblk->dqb_bsoftlimit :
dqblk->dqb_isoftlimit;
- rc = write_quota_rec(env, new, *((__u64 *)key), glb_rec);
+ rc = lquota_disk_write_glb(env, new, *((__u64 *)key), glb_rec);
if (rc)
GOTO(out_it, rc);
next:
}
static int set_quota_index_version(const struct lu_env *env,
- struct dt_object *dt)
+ struct dt_object *dt,
+ dt_obj_version_t version)
{
struct osd_device *osd = osd_obj2dev(osd_dt_obj(dt));
struct thandle *th;
GOTO(out, rc);
th->th_sync = 1;
- dt_version_set(env, dt, 1, th);
+ dt_version_set(env, dt, version, th);
out:
dt_trans_stop(env, &osd->od_dt_dev, th);
RETURN(rc);
}
-#define OBJECTS "OBJECTS"
-#define ADMIN_USR "admin_quotafile_v2.usr"
-#define ADMIN_GRP "admin_quotafile_v2.grp"
-
int osd_quota_migration(const struct lu_env *env, struct dt_object *dt,
const struct dt_index_features *feat)
{
struct dt_object *root, *parent = NULL, *admin = NULL;
dt_obj_version_t version;
char *fname;
- bool isblk;
+ bool isblk, converted = false;
int rc;
ENTRY;
if (rc)
CERROR("%s: Migrate old admin quota file(%s) failed, rc:%d\n",
osd->od_svname, fname, rc);
+ converted = true;
out:
- /* bump index version to 1, so the migration will be skipped
- * next time. */
+ /* if no migration happen, we need to set the default grace time. */
+ if (!converted && rc == 0) {
+ struct lquota_glb_rec *rec = &oti->oti_quota_rec.lqr_glb_rec;
+
+ rec->qbr_hardlimit = 0;
+ rec->qbr_softlimit = 0;
+ rec->qbr_granted = 0;
+ rec->qbr_time = isblk ? MAX_DQ_TIME : MAX_IQ_TIME;
+
+ rc = lquota_disk_write_glb(env, dt, 0, rec);
+ if (rc)
+ CERROR("%s: Failed to set default grace time for "
+ "index("DFID"), rc:%d\n", osd->od_svname,
+ PFID(lu_object_fid(&dt->do_lu)), rc);
+ }
+
+ /* bump index version to 1 (or 2 if migration happened), so the
+ * migration will be skipped next time. */
if (rc == 0) {
- rc = set_quota_index_version(env , dt);
+ rc = set_quota_index_version(env , dt, converted ? 2 : 1);
if (rc)
CERROR("%s: Failed to set quota index("DFID") "
"version, rc:%d\n", osd->od_svname,