struct lustre_capa *old,
__u64 opc);
int (*do_object_sync)(const struct lu_env *, struct dt_object *);
+ /**
+ * Get object info of next level. Currently, only get inode from osd.
+ * This is only used by quota b=16542
+ * precondition: dt_object_exists(dt);
+ */
+ int (*do_data_get)(const struct lu_env *env, struct dt_object *dt,
+ void **data);
};
/**
struct obd_device *obd,
unsigned int uid, unsigned int gid, int count,
int *flag, struct obd_trans_info *oti,
- int isblk, struct inode *inode, int frags)
+ int isblk, void *data, int frags)
{
int rc;
ENTRY;
QUOTA_CHECK_OP(interface, acquire);
rc = QUOTA_OP(interface, chkquota)(obd, uid, gid, count, flag,
QUOTA_OP(interface, acquire), oti,
- isblk, inode, frags);
+ isblk, (struct inode *)data, frags);
RETURN(rc);
}
rc = mdd_la_get(env, mdd_tobj, la_tmp, BYPASS_CAPA);
if (!rc) {
+ void *data = NULL;
+ mdd_data_get(env, mdd_tobj, &data);
quota_opc = FSFILT_OP_LINK;
mdd_quota_wrapper(la_tmp, qids);
/* get block quota for parent */
lquota_chkquota(mds_quota_interface_ref, obd,
qids[USRQUOTA], qids[GRPQUOTA], 1,
&rec_pending, NULL, LQUOTA_FLAGS_BLK,
- NULL, 0);
+ data, 1);
}
}
#endif
rc = mdd_la_get(env, mdd_obj, la_tmp, BYPASS_CAPA);
if (!rc) {
+ void *data = NULL;
+ mdd_data_get(env, mdd_obj, &data);
quota_opc = FSFILT_OP_LINK;
mdd_quota_wrapper(la_tmp, qids);
/* get block quota for parent */
lquota_chkquota(mds_quota_interface_ref, obd,
qids[USRQUOTA], qids[GRPQUOTA],
1, &rec_pending, NULL,
- LQUOTA_FLAGS_BLK, NULL, 0);
+ LQUOTA_FLAGS_BLK, data, 1);
}
} else {
uc->mu_cap |= CFS_CAP_SYS_RESOURCE_MASK;
rc = mdd_la_get(env, mdd_tpobj, la_tmp, BYPASS_CAPA);
if (!rc) {
+ void *data = NULL;
+ mdd_data_get(env, mdd_tpobj, &data);
quota_opc = FSFILT_OP_LINK;
mdd_quota_wrapper(la_tmp, qpids);
/* get block quota for target parent */
lquota_chkquota(mds_quota_interface_ref, obd,
qpids[USRQUOTA], qpids[GRPQUOTA], 1,
&rec_pending, NULL, LQUOTA_FLAGS_BLK,
- NULL, 0);
+ data, 1);
}
}
#endif
rc = mdd_la_get(env, mdd_tpobj, la_tmp,
BYPASS_CAPA);
if (!rc) {
+ void *data = NULL;
+ mdd_data_get(env, mdd_tpobj, &data);
quota_opc = FSFILT_OP_LINK;
mdd_quota_wrapper(la_tmp, qtpids);
/* get block quota for target parent */
qtpids[GRPQUOTA], 1,
&rec_pending, NULL,
LQUOTA_FLAGS_BLK,
- NULL, 0);
+ data, 1);
}
}
}
void *md, int *md_size, const char *name);
int mdd_get_md_locked(const struct lu_env *env, struct mdd_object *obj,
void *md, int *md_size, const char *name);
+int mdd_data_get(const struct lu_env *env, struct mdd_object *obj, void **data);
int mdd_la_get(const struct lu_env *env, struct mdd_object *obj,
struct lu_attr *la, struct lustre_capa *capa);
int mdd_attr_set_internal(const struct lu_env *env,
return __mdd_permission_internal(env, obj, la, mask, role);
}
+static inline int mdo_data_get(const struct lu_env *env,
+ struct mdd_object *obj,
+ void **data)
+{
+ struct dt_object *next = mdd_object_child(obj);
+ next->do_ops->do_data_get(env, next, data);
+ return 0;
+}
+
/* mdd inline func for calling osd_dt_object ops */
static inline int mdo_attr_get(const struct lu_env *env, struct mdd_object *obj,
struct lu_attr *la, struct lustre_capa *capa)
struct md_object *obj, struct lu_buf *buf,
const char *name);
+int mdd_data_get(const struct lu_env *env, struct mdd_object *obj,
+ void **data)
+{
+ LASSERTF(mdd_object_exists(obj), "FID is "DFID"\n",
+ PFID(mdd_object_fid(obj)));
+ mdo_data_get(env, obj, data);
+ return 0;
+}
+
int mdd_la_get(const struct lu_env *env, struct mdd_object *obj,
struct lu_attr *la, struct lustre_capa *capa)
{
qnids[USRQUOTA], qnids[GRPQUOTA], 1,
&inode_pending, NULL, 0, NULL, 0);
block_count = (la_tmp->la_blocks + 7) >> 3;
- if (block_count)
+ if (block_count) {
+ void *data = NULL;
+ mdd_data_get(env, mdd_obj, &data);
/* get block quota for new owner */
lquota_chkquota(mds_quota_interface_ref, obd,
qnids[USRQUOTA],
qnids[GRPQUOTA],
block_count, &block_pending,
NULL, LQUOTA_FLAGS_BLK,
- NULL, 0);
+ data, 1);
+ }
}
}
#endif
* decide if it is out of quota or not b=14783 */
lquota_chkquota(filter_quota_interface_ref, obd, oa->o_uid,
oa->o_gid, niocount, &rec_pending, oti,
- LQUOTA_FLAGS_BLK, inode, obj->ioo_bufcnt);
+ LQUOTA_FLAGS_BLK, (void *)inode, obj->ioo_bufcnt);
iobuf = filter_iobuf_get(&obd->u.filter, oti);
if (IS_ERR(iobuf))
RETURN(rc);
}
+static int osd_data_get(const struct lu_env *env, struct dt_object *dt,
+ void **data)
+{
+ struct osd_object *obj = osd_dt_obj(dt);
+ ENTRY;
+
+ *data = (void *)obj->oo_inode;
+ RETURN(0);
+}
+
static const struct dt_object_operations osd_obj_ops = {
.do_read_lock = osd_object_read_lock,
.do_write_lock = osd_object_write_lock,
.do_xattr_list = osd_xattr_list,
.do_capa_get = osd_capa_get,
.do_object_sync = osd_object_sync,
+ .do_data_get = osd_data_get,
};
/**
.do_xattr_list = osd_xattr_list,
.do_capa_get = osd_capa_get,
.do_object_sync = osd_object_sync,
+ .do_data_get = osd_data_get,
};
/*
/* in order to complete this write, we need extra
* meta blocks. This function can get it through
* data needed to be written b=16542 */
- mb = *pending;
- LASSERT(inode && frags > 0);
- if (fsfilt_get_mblk(obd, qctxt->lqc_sb, &mb,
- inode, frags) < 0)
- CDEBUG(D_ERROR,
- "can't get extra meta blocks.\n");
- else
- *pending += mb;
+ if (inode) {
+ mb = *pending;
+ rc = fsfilt_get_mblk(obd, qctxt->lqc_sb,
+ &mb, inode,frags);
+ if (rc)
+ CDEBUG(D_ERROR,
+ "can't get extra "
+ "meta blocks.\n");
+ else
+ *pending += mb;
+ }
lqs->lqs_bwrite_pending += *pending;
} else {
*pending = count;
ONLY=${ONLY:-"$*"}
# enable test_23 after bug 16542 fixed.
-ALWAYS_EXCEPT="10 23 $SANITY_QUOTA_EXCEPT"
+ALWAYS_EXCEPT="10 $SANITY_QUOTA_EXCEPT"
# UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
case `uname -r` in