/*
* Add here for obd notify mechanism, when adding a new ost, the mds
- * will notify this mdd.
+ * will notify this mdd. The mds will be used for quota also.
*/
obd->obd_upcall.onu_upcall = mdd_notify;
obd->obd_upcall.onu_owner = mdd;
mdd->mdd_obd_dev = obd;
-
EXIT;
class_detach:
if (rc)
if (rc)
GOTO(lcfg_cleanup, rc);
mdd->mdd_obd_dev = NULL;
-
+
EXIT;
lcfg_cleanup:
return rc;
*md_size = 0;
rc = 0;
} else if (rc < 0) {
- CERROR("Error %d reading eadata \n", rc);
+ CERROR("Error %d reading eadata - %d\n", rc, *md_size);
} else {
/* XXX: Convert lov EA but fixed after verification test. */
*md_size = rc;
RETURN(rc);
obd_free_memmd(lov_exp, &lsm);
- rc = mdd_xattr_set_txn(env, obj, buf, MDS_LOV_MD_NAME, 0, handle);
+ rc = mdd_xattr_set_txn(env, obj, buf, XATTR_NAME_LOV, 0, handle);
CDEBUG(D_INFO, "set lov ea of "DFID" rc %d \n", PFID(mdo2fid(obj)), rc);
RETURN(rc);
lum->lmm_stripe_offset == (typeof(lum->lmm_stripe_offset))(-1) &&
lum->lmm_magic != LOV_USER_MAGIC_V3) {
rc = mdd_xattr_set_txn(env, obj, &LU_BUF_NULL,
- MDS_LOV_MD_NAME, 0, handle);
+ XATTR_NAME_LOV, 0, handle);
if (rc == -ENODATA)
rc = 0;
CDEBUG(D_INFO, "delete lov ea of "DFID" rc %d \n",
rc = mdd_lov_set_stripe_md(env, child, buf, handle);
} else {
rc = mdd_xattr_set_txn(env, child, buf,
- MDS_LOV_MD_NAME, 0, handle);
+ XATTR_NAME_LOV, 0, handle);
}
} else if (S_ISDIR(mode)) {
if (lmmp == NULL && lmm_size == 0) {
/* Get parent dir stripe and set */
if (pobj != NULL)
rc = mdd_get_md_locked(env, pobj, lmm, &size,
- MDS_LOV_MD_NAME);
+ XATTR_NAME_LOV);
if (rc > 0) {
buf = mdd_buf_get(env, lmm, size);
rc = mdd_xattr_set_txn(env, child, buf,
- MDS_LOV_MD_NAME, 0, handle);
+ XATTR_NAME_LOV, 0, handle);
if (rc)
CERROR("error on copy stripe info: rc "
"= %d\n", rc);
return fid_flatten(fid);
}
-static void mdd_lov_update_objids(struct obd_device *obd, struct lov_mds_md *lmm)
+int mdd_lov_objid_prepare(struct mdd_device *mdd, struct lov_mds_md *lmm)
{
- struct mds_obd *mds = &obd->u.mds;
- int j;
- struct lov_ost_data_v1 *lmm_objects;
- ENTRY;
-
- /* if we create file without objects - lmm is NULL */
- if (lmm == NULL)
- return;
-
- if (le32_to_cpu(lmm->lmm_magic) == LOV_MAGIC_V3)
- lmm_objects = ((struct lov_mds_md_v3 *)lmm)->lmm_objects;
- else
- lmm_objects = lmm->lmm_objects;
-
- for (j = 0; j < le32_to_cpu(lmm->lmm_stripe_count); j++) {
- int i = le32_to_cpu(lmm_objects[j].l_ost_idx);
- obd_id id = le64_to_cpu(lmm_objects[j].l_object_id);
- int page = i / OBJID_PER_PAGE();
- int idx = i % OBJID_PER_PAGE();
- obd_id *data = mds->mds_lov_page_array[page];
-
- CDEBUG(D_INODE,"update last object for ost %d - new %llu"
- " old %llu\n", i, id, data[idx]);
- if (id > data[idx]) {
- data[idx] = id;
- cfs_bitmap_set(mds->mds_lov_page_dirty, page);
- }
- }
- EXIT;
+ /* copy mds_lov code is using wrong layer */
+ return mds_lov_prepare_objids(mdd->mdd_obd_dev, lmm);
}
void mdd_lov_objid_update(struct mdd_device *mdd, struct lov_mds_md *lmm)
{
- mdd_lov_update_objids(mdd->mdd_obd_dev, lmm);
+ /* copy mds_lov code is using wrong layer */
+ mds_lov_update_objids(mdd->mdd_obd_dev, lmm);
}
void mdd_lov_create_finish(const struct lu_env *env, struct mdd_device *mdd,
struct lov_mds_md *lmm, int lmm_size,
const struct md_op_spec *spec)
{
- if (lmm && !spec->u.sp_ea.no_lov_create)
+ if (lmm && !spec->no_create)
OBD_FREE(lmm, lmm_size);
}
{
struct obd_device *obd = mdd2obd_dev(mdd);
struct obd_export *lov_exp = obd->u.mds.mds_osc_exp;
+ struct lu_site *site = mdd2lu_dev(mdd)->ld_site;
struct obdo *oa;
struct lov_stripe_md *lsm = NULL;
const void *eadata = spec->u.sp_ea.eadata;
oti_init(oti, NULL);
/* replay case, has objects already, only get lov from eadata */
- if (spec->u.sp_ea.no_lov_create != 0) {
+ if (spec->no_create != 0) {
*lmm = (struct lov_mds_md *)spec->u.sp_ea.eadata;
*lmm_size = spec->u.sp_ea.eadatalen;
RETURN(0);
oa->o_uid = 0; /* must have 0 uid / gid on OST */
oa->o_gid = 0;
- oa->o_gr = FILTER_GROUP_MDS0 +
- lu_site2md(mdd2lu_dev(mdd)->ld_site)->ms_node_id;
+ oa->o_gr = mdt_to_obd_objgrp(lu_site2md(site)->ms_node_id);
oa->o_mode = S_IFREG | 0600;
oa->o_id = mdd_lov_create_id(mdd_object_fid(child));
oa->o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLFLAGS |
rc = mdd_get_md_locked(env, parent, _lmm,
&_lmm_size,
- MDS_LOV_MD_NAME);
+ XATTR_NAME_LOV);
if (rc > 0)
rc = obd_iocontrol(OBD_IOC_LOV_SETSTRIPE,
lov_exp, 0, &lsm, _lmm);
}
GOTO(out_oti, rc);
}
- LASSERT(lsm->lsm_object_gr >= FILTER_GROUP_MDS0);
+ LASSERT_MDS_GROUP(lsm->lsm_object_gr);
} else {
LASSERT(eadata != NULL);
rc = obd_iocontrol(OBD_IOC_LOV_SETEA, lov_exp, 0, &lsm,
oa->o_valid |= OBD_MD_FLFID | OBD_MD_FLGENER;
oinfo->oi_oa = oa;
oinfo->oi_md = lsm;
- oinfo->oi_capa = mdo_capa_get(env, child, NULL,
- CAPA_OPC_MDS_DEFAULT);
+ oinfo->oi_capa = NULL;
oinfo->oi_policy.l_extent.start = la->la_size;
oinfo->oi_policy.l_extent.end = OBD_OBJECT_EOF;
- if (IS_ERR(oinfo->oi_capa))
- oinfo->oi_capa = NULL;
-
rc = obd_punch_rqset(lov_exp, oinfo, oti);
- capa_put(oinfo->oi_capa);
if (rc) {
CERROR("Error setting attrs for "DFID": rc %d\n",
PFID(mdo2fid(child)), rc);
CERROR("Cannot pack lsm, err = %d\n", rc);
GOTO(out_oti, rc);
}
+ if (mdd_lov_objid_prepare(mdd, *lmm) != 0) {
+ CERROR("Not have memory for update objid\n");
+ OBD_FREE(*lmm, rc);
+ *lmm = NULL;
+ GOTO(out_oti, rc = -ENOMEM);
+ }
*lmm_size = rc;
rc = 0;
EXIT;
struct lov_stripe_md *lsm = NULL;
struct obd_trans_info *oti = &mdd_env_info(env)->mti_oti;
struct obdo *oa = &mdd_env_info(env)->mti_oa;
+ struct lu_site *site = mdd2lu_dev(mdd)->ld_site;
int rc;
ENTRY;
}
oa->o_id = lsm->lsm_object_id;
- oa->o_gr = FILTER_GROUP_MDS0 + mdd2lu_dev(mdd)->ld_site->ls_node_id;
+ oa->o_gr = mdt_to_obd_objgrp(lu_site2md(site)->ms_node_id);
oa->o_mode = la->la_mode & S_IFMT;
oa->o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLGROUP;
CDEBUG(D_INFO, "destroying OSS object %d/%d\n",
(int)oa->o_id, (int)oa->o_gr);
- rc = obd_destroy(lov_exp, oa, lsm, oti, NULL);
+ rc = obd_destroy(lov_exp, oa, lsm, oti, NULL, NULL);
obd_free_memmd(lov_exp, &lsm);
RETURN(rc);
}
-
/*
* called with obj not locked.
*/
+
int mdd_lov_destroy(const struct lu_env *env, struct mdd_device *mdd,
struct mdd_object *obj, struct lu_attr *la)
{
RETURN(rc = -ENOMEM);
/* get lov ea */
+
rc = mdd_get_md_locked(env, obj, ma->ma_lmm, &ma->ma_lmm_size,
- MDS_LOV_MD_NAME);
- if (rc) {
- CWARN("Get lov ea failed for "DFID"\n", PFID(mdo2fid(obj)));
+ XATTR_NAME_LOV);
+
+ if (rc <= 0) {
+ CWARN("Get lov ea failed for "DFID" rc = %d\n",
+ PFID(mdo2fid(obj)), rc);
+ if (rc == 0)
+ rc = -ENOENT;
RETURN(rc);
}
+
ma->ma_valid = MA_LOV;
rc = mdd_unlink_log(env, mdd, obj, ma);
PFID(mdo2fid(obj)), rc);
RETURN(rc);
}
- if (ma->ma_valid | MA_COOKIE)
- rc = mdd_lovobj_unlink(env, mdd, obj, la,
+
+ if (ma->ma_valid & MA_COOKIE)
+ rc = mdd_lovobj_unlink(env, mdd, obj, la,
ma->ma_lmm, ma->ma_lmm_size,
ma->ma_cookie, 1);
RETURN(rc);
llog_ctxt_put(ctxt);
OBD_FREE(lur, sizeof(*lur));
+ GOTO(out, rc);
out:
obd_free_memmd(mds->mds_osc_exp, &lsm);
- RETURN(rc);
+ return rc;
}
int mdd_unlink_log(const struct lu_env *env, struct mdd_device *mdd,
{
struct mds_obd *mds = &obd->u.mds;
struct lov_stripe_md *lsm = NULL;
- struct llog_setattr_rec *lsr;
+ struct llog_setattr64_rec *lsr;
struct llog_ctxt *ctxt;
int rc;
ENTRY;
/* prepare setattr log record */
lsr->lsr_hdr.lrh_len = lsr->lsr_tail.lrt_len = sizeof(*lsr);
- lsr->lsr_hdr.lrh_type = MDS_SETATTR_REC;
+ lsr->lsr_hdr.lrh_type = MDS_SETATTR64_REC;
lsr->lsr_uid = uid;
lsr->lsr_gid = gid;
/* journal chown/chgrp in llog, just like unlink */
if (lmm_size > 0) {
CDEBUG(D_INFO, "setattr llog for uid/gid=%lu/%lu\n",
- (unsigned long)ma->ma_attr.la_uid,
+ (unsigned long)ma->ma_attr.la_uid,
(unsigned long)ma->ma_attr.la_gid);
return mdd_log_op_setattr(obd, ma->ma_attr.la_uid,
- ma->ma_attr.la_gid, lmm,
+ ma->ma_attr.la_gid, lmm,
lmm_size, logcookies,
cookies_size);
} else
}
int mdd_lov_setattr_async(const struct lu_env *env, struct mdd_object *obj,
- struct lov_mds_md *lmm, int lmm_size,
+ struct lov_mds_md *lmm, int lmm_size,
struct llog_cookie *logcookies)
{
struct mdd_device *mdd = mdo2mdd(&obj->mod_obj);
struct obd_device *obd = mdd2obd_dev(mdd);
struct lu_attr *tmp_la = &mdd_env_info(env)->mti_la;
const struct lu_fid *fid = mdd_object_fid(obj);
- struct obd_capa *oc;
int rc = 0;
ENTRY;
if (rc)
RETURN(rc);
- oc = mdo_capa_get(env, obj, NULL, CAPA_OPC_MDS_DEFAULT);
- if (IS_ERR(oc))
- oc = NULL;
-
rc = mdd_osc_setattr_async(obd, tmp_la->la_uid, tmp_la->la_gid, lmm,
lmm_size, logcookies, fid_seq(fid),
- fid_oid(fid), oc);
-
- capa_put(oc);
-
+ fid_oid(fid), NULL);
RETURN(rc);
}