* \retval -ve - failure
*/
int osd_declare_inode_qid(const struct lu_env *env, qid_t uid, qid_t gid,
- long long space, struct osd_thandle *oh,
+ __u32 projid, long long space, struct osd_thandle *oh,
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;
- int rcu, rcg; /* user & group rc */
+ int rcu, rcg, rcp; /* user & group & project rc */
ENTRY;
/* let's start with user quota */
if (force && (rcg == -EDQUOT || rcg == -EINPROGRESS))
/* as before, ignore EDQUOT & EINPROGRESS for root */
rcg = 0;
+ if (rcg && (rcg != -EDQUOT || flags == NULL))
+ RETURN(rcg);
- RETURN(rcu ? rcu : rcg);
+ /* and now project quota */
+ qi->lqi_id.qid_gid = projid;
+ qi->lqi_type = PRJQUOTA; /* false now */
+ rcp = osd_declare_qid(env, oh, qi, obj, false, flags);
+
+ if (force && (rcp == -EDQUOT || rcp == -EINPROGRESS))
+ /* as before, ignore EDQUOT & EINPROGRESS for root */
+ rcp = 0;
+
+ if (rcu)
+ RETURN(rcu);
+ if (rcg)
+ RETURN(rcg);
+ if (rcp)
+ RETURN(rcp);
+
+ RETURN(0);
}
int osd_quota_migration(const struct lu_env *env, struct dt_object *dt)