memset(it, 0, sizeof(*it));
lu_object_get(lo);
it->oiq_obj = obj;
- CFS_INIT_LIST_HEAD(&it->oiq_list);
+ INIT_LIST_HEAD(&it->oiq_list);
/* LUSTRE_DQTREEOFF is the initial offset where the tree can be found */
it->oiq_blk[0] = LUSTRE_DQTREEOFF;
lu_object_put(env, &it->oiq_obj->oo_dt.do_lu);
- cfs_list_for_each_entry_safe(leaf, tmp, &it->oiq_list, oql_link) {
- cfs_list_del_init(&leaf->oql_link);
+ list_for_each_entry_safe(leaf, tmp, &it->oiq_list, oql_link) {
+ list_del_init(&leaf->oql_link);
OBD_FREE_PTR(leaf);
}
EXIT;
OBD_ALLOC_PTR(leaf);
if (leaf == NULL)
RETURN(-ENOMEM);
- CFS_INIT_LIST_HEAD(&leaf->oql_link);
+ INIT_LIST_HEAD(&leaf->oql_link);
leaf->oql_blk = it->oiq_blk[depth];
- cfs_list_add_tail(&leaf->oql_link, &it->oiq_list);
+ list_add_tail(&leaf->oql_link, &it->oiq_list);
RETURN(0);
}
* 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;
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;
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);
}
* \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
*/
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;
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 */
/* 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 */
RETURN(rcu ? rcu : rcg);
}
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 7, 53, 0)
/* Following code is used to migrate old admin quota files (in Linux quota
* file v2 format) into the new quota global indexes (in IAM format). */
-#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2,7,50,0)
-
/* copied from osd_it_acct_get(), only changed the 'type' to -1 */
static int osd_it_admin_get(const struct lu_env *env, struct dt_it *di,
const struct dt_key *key)
struct inode *inode;
int rc;
struct iam_container *bag = &(osd_dt_obj(dt))->oo_dir->od_container;
+ struct lu_buf *lb = &osd_oti_get(env)->oti_buf;
ENTRY;
LASSERT(bag->ic_root_bh != NULL);
inode = osd_dt_obj(dt)->oo_inode;
LASSERT(inode);
- rc = dt_declare_record_write(env, dt, NULL, 0, th);
+ /* iam_lfix_create() writes two blocks at the beginning */
+ lb->lb_len = osd_sb(osd)->s_blocksize * 2;
+ rc = dt_declare_record_write(env, dt, lb, 0, th);
if (rc)
GOTO(out, rc);
RETURN(rc);
}
-#else
-#warning "remove old quota compatibility code"
-#endif
+#endif /* LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 7, 53, 0) */