X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_quota.c;h=39059f080d08e5816a631de59e44f908f2774b50;hb=92e7ffbdb01f680ed9f299ed109f2189f144a31d;hp=2d3c80c8c36339f2179e33d04a9c0caf8146725e;hpb=08aa217ce49aba1ded52e0f7adb8a607035123fd;p=fs%2Flustre-release.git diff --git a/lustre/osd-ldiskfs/osd_quota.c b/lustre/osd-ldiskfs/osd_quota.c index 2d3c80c..39059f0 100644 --- a/lustre/osd-ldiskfs/osd_quota.c +++ b/lustre/osd-ldiskfs/osd_quota.c @@ -65,6 +65,10 @@ int osd_acct_obj_lookup(struct osd_thread_info *info, struct osd_device *osd, 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)); @@ -74,7 +78,7 @@ int osd_acct_obj_lookup(struct osd_thread_info *info, struct osd_device *osd, 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); @@ -100,7 +104,11 @@ static int osd_acct_index_lookup(const struct lu_env *env, 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); @@ -112,8 +120,13 @@ static int osd_acct_index_lookup(const struct lu_env *env, rc = sb->s_qcop->get_dqblk(sb, obj2type(dtobj), (qid_t) id, dqblk); 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); } @@ -511,9 +524,9 @@ int osd_declare_qid(const struct lu_env *env, struct osd_thandle *oh, 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); @@ -833,6 +846,8 @@ out: 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) { @@ -842,8 +857,14 @@ static int truncate_quota_index(const struct lu_env *env, struct dt_object *dt, 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); @@ -902,11 +923,18 @@ out_lock: 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); } 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; @@ -926,16 +954,12 @@ static int set_quota_index_version(const struct lu_env *env, 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) { @@ -1029,7 +1053,7 @@ int osd_quota_migration(const struct lu_env *env, struct dt_object *dt, 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 */ @@ -1064,10 +1088,10 @@ out: PFID(lu_object_fid(&dt->do_lu)), rc); } - /* bump index version to 1, so the migration will be skipped - * next time. */ + /* 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,