X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_quota.c;h=405164011fa11e6411d30b9c4144a659a8a3b085;hp=8513bfa1c6dc4d41494b7df7bec33b4c4d330cf7;hb=020941416419ab282f3d9b694014b2059d299d51;hpb=386818f0c56e438779e17d0ca12b481f17c53682 diff --git a/lustre/osd-ldiskfs/osd_quota.c b/lustre/osd-ldiskfs/osd_quota.c index 8513bfa..4051640 100644 --- a/lustre/osd-ldiskfs/osd_quota.c +++ b/lustre/osd-ldiskfs/osd_quota.c @@ -493,23 +493,26 @@ static inline void osd_qid_set_type(struct osd_thandle *oh, int i, int type) * Reserve journal credits for quota files update first, then call * ->op_begin() to perform quota enforcement. * - * \param env - the environment passed by the caller - * \param oh - osd transaction handle - * \param qi - quota id & space required for this operation - * \param allocated - dquot entry in quota accounting file has been allocated - * \param flags - if the operation is write, return no user quota, no - * group quota, or sync commit flags to the caller + * \param env - the environment passed by the caller + * \param oh - osd transaction handle + * \param qi - quota id & space required for this operation + * \param obj - osd object, could be NULL when it's under create + * \param enforce - whether to perform quota enforcement + * \param flags - if the operation is write, return no user quota, no + * group quota, or sync commit flags to the caller * - * \retval 0 - success - * \retval -ve - failure + * \retval 0 - success + * \retval -ve - failure */ int osd_declare_qid(const struct lu_env *env, struct osd_thandle *oh, - struct lquota_id_info *qi, bool allocated, int *flags) + struct lquota_id_info *qi, struct osd_object *obj, + bool enforce, int *flags) { struct osd_thread_info *info = osd_oti_get(env); struct osd_device *dev = info->oti_dev; struct qsd_instance *qsd = dev->od_quota_slave; - int i, rc; + struct inode *inode = NULL; + int i, rc = 0; bool found = false; ENTRY; @@ -532,8 +535,12 @@ int osd_declare_qid(const struct lu_env *env, struct osd_thandle *oh, RETURN(-EOVERFLOW); } + if (obj != NULL) + inode = obj->oo_inode; osd_trans_declare_op(env, oh, OSD_OT_QUOTA, - (allocated || qi->lqi_id.qid_uid == 0) ? + (qi->lqi_id.qid_uid == 0 || + (inode != NULL && + inode->i_dquot[qi->lqi_type] != NULL)) ? 1: LDISKFS_QUOTA_INIT_BLOCKS(osd_sb(dev))); oh->ot_id_array[i] = qi->lqi_id.qid_uid; @@ -546,7 +553,8 @@ int osd_declare_qid(const struct lu_env *env, struct osd_thandle *oh, RETURN(0); /* check quota */ - rc = qsd_op_begin(env, qsd, oh->ot_quota_trans, qi, flags); + if (enforce) + rc = qsd_op_begin(env, qsd, oh->ot_quota_trans, qi, flags); RETURN(rc); } @@ -558,8 +566,8 @@ int osd_declare_qid(const struct lu_env *env, struct osd_thandle *oh, * \param gid - group id of the inode * \param space - how many blocks/inodes will be consumed/released * \param oh - osd transaction handle + * \param obj - osd object, could be NULL when it's under create * \param is_blk - block quota or inode quota? - * \param allocated - dquot entry in quota accounting file has been allocated * \param flags - if the operation is write, return no user quota, no * group quota, or sync commit flags to the caller * \param force - set to 1 when changes are performed by root user and thus @@ -570,7 +578,8 @@ int osd_declare_qid(const struct lu_env *env, struct osd_thandle *oh, */ int osd_declare_inode_qid(const struct lu_env *env, qid_t uid, qid_t gid, long long space, struct osd_thandle *oh, - bool is_blk, bool allocated, int *flags, bool force) + struct osd_object *obj, bool is_blk, int *flags, + bool force) { struct osd_thread_info *info = osd_oti_get(env); struct lquota_id_info *qi = &info->oti_qi; @@ -582,7 +591,7 @@ int osd_declare_inode_qid(const struct lu_env *env, qid_t uid, qid_t gid, qi->lqi_type = USRQUOTA; qi->lqi_space = space; qi->lqi_is_blk = is_blk; - rcu = osd_declare_qid(env, oh, qi, allocated, flags); + rcu = osd_declare_qid(env, oh, qi, obj, true, flags); if (force && (rcu == -EDQUOT || rcu == -EINPROGRESS)) /* ignore EDQUOT & EINPROGRESS when changes are done by root */ @@ -598,7 +607,7 @@ int osd_declare_inode_qid(const struct lu_env *env, qid_t uid, qid_t gid, /* and now group quota */ qi->lqi_id.qid_gid = gid; qi->lqi_type = GRPQUOTA; - rcg = osd_declare_qid(env, oh, qi, allocated, flags); + rcg = osd_declare_qid(env, oh, qi, obj, true, flags); if (force && (rcg == -EDQUOT || rcg == -EINPROGRESS)) /* as before, ignore EDQUOT & EINPROGRESS for root */