struct osd_object *obj,
struct osd_thandle *oh, long long bspace,
qid_t old_id, qid_t new_id, bool enforce,
- unsigned type)
+ unsigned type, bool ignore_edquot)
{
int rc;
struct osd_thread_info *info = osd_oti_get(env);
qi->lqi_space = 1;
/* Reserve credits for the new id */
rc = osd_declare_qid(env, oh, qi, NULL, enforce, NULL);
- if (rc == -EDQUOT || rc == -EINPROGRESS)
+ if (ignore_edquot && (rc == -EDQUOT || rc == -EINPROGRESS))
rc = 0;
if (rc)
RETURN(rc);
qi->lqi_id.qid_uid = old_id;
qi->lqi_space = -1;
rc = osd_declare_qid(env, oh, qi, obj, enforce, NULL);
- if (rc == -EDQUOT || rc == -EINPROGRESS)
+ if (ignore_edquot && (rc == -EDQUOT || rc == -EINPROGRESS))
rc = 0;
if (rc)
RETURN(rc);
* to save credit reservation.
*/
rc = osd_declare_qid(env, oh, qi, obj, enforce, NULL);
- if (rc == -EDQUOT || rc == -EINPROGRESS)
+ if (ignore_edquot && (rc == -EDQUOT || rc == -EINPROGRESS))
rc = 0;
if (rc)
RETURN(rc);
qi->lqi_id.qid_uid = old_id;
qi->lqi_space = -bspace;
rc = osd_declare_qid(env, oh, qi, obj, enforce, NULL);
- if (rc == -EDQUOT || rc == -EINPROGRESS)
+ if (ignore_edquot && (rc == -EDQUOT || rc == -EINPROGRESS))
rc = 0;
RETURN(rc);
if (attr == NULL || obj->oo_inode == NULL)
RETURN(rc);
- bspace = obj->oo_inode->i_blocks;
- bspace <<= obj->oo_inode->i_sb->s_blocksize_bits;
+ bspace = obj->oo_inode->i_blocks << 9;
bspace = toqb(bspace);
/* Changing ownership is always preformed by super user, it should not
- * fail with EDQUOT.
+ * fail with EDQUOT unless required explicitly.
*
* We still need to call the osd_declare_qid() to calculate the journal
* credits for updating quota accounting files and to trigger quota
* space adjustment once the operation is completed.*/
if (attr->la_valid & LA_UID || attr->la_valid & LA_GID) {
+ bool ignore_edquot = !(attr->la_flags & LUSTRE_SET_SYNC_FL);
+
+ if (!ignore_edquot)
+ CDEBUG(D_QUOTA, "%s: enforce quota on UID %u, GID %u"
+ "(the quota space is %lld)\n",
+ obj->oo_inode->i_sb->s_id, attr->la_uid,
+ attr->la_gid, bspace);
+
/* USERQUOTA */
uid = i_uid_read(obj->oo_inode);
enforce = (attr->la_valid & LA_UID) && (attr->la_uid != uid);
rc = osd_declare_attr_qid(env, obj, oh, bspace, uid,
- attr->la_uid, enforce, USRQUOTA);
+ attr->la_uid, enforce, USRQUOTA,
+ true);
if (rc)
RETURN(rc);
enforce = (attr->la_valid & LA_GID) && (attr->la_gid != gid);
rc = osd_declare_attr_qid(env, obj, oh, bspace,
i_gid_read(obj->oo_inode),
- attr->la_gid, enforce, GRPQUOTA);
+ attr->la_gid, enforce, GRPQUOTA,
+ ignore_edquot);
if (rc)
RETURN(rc);
(attr->la_projid != projid);
rc = osd_declare_attr_qid(env, obj, oh, bspace,
(qid_t)projid, (qid_t)attr->la_projid,
- enforce, PRJQUOTA);
+ enforce, PRJQUOTA, true);
if (rc)
RETURN(rc);
}
i_projid_read(inode) != 0)
rc = osd_declare_attr_qid(env, osd_dt_obj(dt), oh,
0, i_projid_read(inode),
- 0, false, PRJQUOTA);
+ 0, false, PRJQUOTA, true);
#endif
}