* GPL HEADER END
*/
/*
- * Copyright (c) 2012, Intel Corporation.
+ * Copyright (c) 2012, 2013, Intel Corporation.
* Use is subject to license terms.
*
* Author: Johann Lombardi <johann@whamcloud.com>
const struct lu_fid *fid, struct osd_inode_id *id)
{
struct super_block *sb = osd_sb(osd);
+ unsigned long qf_inums[2] = {
+ le32_to_cpu(LDISKFS_SB(sb)->s_es->s_usr_quota_inum),
+ le32_to_cpu(LDISKFS_SB(sb)->s_es->s_grp_quota_inum)
+ };
ENTRY;
LASSERT(fid_is_acct(fid));
RETURN(-ENOENT);
id->oii_gen = OSD_OII_NOGEN;
- id->oii_ino = LDISKFS_SB(sb)->s_qf_inums[fid2type(fid)];
+ id->oii_ino = qf_inums[fid2type(fid)];
if (!ldiskfs_valid_inum(sb, id->oii_ino))
RETURN(-ENOENT);
RETURN(0);
struct lustre_capa *capa)
{
struct osd_thread_info *info = osd_oti_get(env);
+#ifdef HAVE_DQUOT_FS_DISK_QUOTA
+ struct fs_disk_quota *dqblk = &info->oti_fdq;
+#else
struct if_dqblk *dqblk = &info->oti_dqblk;
+#endif
struct super_block *sb = osd_sb(osd_obj2dev(osd_dt_obj(dtobj)));
struct lquota_acct_rec *rec = (struct lquota_acct_rec *)dtrec;
__u64 id = *((__u64 *)dtkey);
int rc;
+#ifdef HAVE_DQUOT_KQID
+ struct kqid qid;
+#endif
ENTRY;
memset((void *)dqblk, 0, sizeof(struct obd_dqblk));
+#ifdef HAVE_DQUOT_KQID
+ qid = make_kqid(&init_user_ns, obj2type(dtobj), id);
+ rc = sb->s_qcop->get_dqblk(sb, qid, dqblk);
+#else
rc = sb->s_qcop->get_dqblk(sb, obj2type(dtobj), (qid_t) id, dqblk);
+#endif
if (rc)
RETURN(rc);
+#ifdef HAVE_DQUOT_FS_DISK_QUOTA
+ rec->bspace = dqblk->d_bcount;
+ rec->ispace = dqblk->d_icount;
+#else
rec->bspace = dqblk->dqb_curspace;
rec->ispace = dqblk->dqb_curinodes;
+#endif
RETURN(+1);
}
RETURN(-EOVERFLOW);
}
- OSD_DECLARE_OP(oh, quota,
- (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);
return rc;
}
+/* Nobdy else can access the global index now, it's safe to truncate and
+ * reinitialize it */
static int truncate_quota_index(const struct lu_env *env, struct dt_object *dt,
const struct dt_index_features *feat)
{
struct osd_thandle *oth;
struct inode *inode;
int rc;
+ struct iam_container *bag = &(osd_dt_obj(dt))->oo_dir->od_container;
ENTRY;
+ LASSERT(bag->ic_root_bh != NULL);
+ iam_container_fini(bag);
+
+ LASSERT(fid_seq(lu_object_fid(&dt->do_lu)) == FID_SEQ_QUOTA_GLB);
+
OBD_ALLOC_PTR(attr);
if (attr == NULL)
RETURN(-ENOMEM);
inode = osd_dt_obj(dt)->oo_inode;
LASSERT(inode);
- rc = dt_declare_record_write(env, dt, inode->i_sb->s_blocksize * 2, 0, th);
+ rc = dt_declare_record_write(env, dt, NULL, 0, th);
if (rc)
GOTO(out, rc);
out:
dt_trans_stop(env, &osd->od_dt_dev, th);
OBD_FREE_PTR(attr);
+
+ if (rc == 0) {
+ rc = iam_container_setup(bag);
+ if (rc != 0)
+ iam_container_fini(bag);
+ }
RETURN(rc);
}
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, converted = false;
+ bool isblk = false, converted = false;
int rc;
ENTRY;
if (rc) {
CERROR("%s: Failed to truncate the quota index "DFID", rc:%d\n",
osd->od_svname, PFID(lu_object_fid(&dt->do_lu)), rc);
- RETURN(rc);
+ GOTO(out, rc);
}
/* set up indexing operations for the admin file */