* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/
/*
#include "mdd_internal.h"
static int mdd_notify(struct obd_device *host, struct obd_device *watched,
- enum obd_notify_event ev, void *owner)
+ enum obd_notify_event ev, void *owner, void *data)
{
struct mdd_device *mdd = owner;
int rc = 0;
case OBD_NOTIFY_ACTIVE:
case OBD_NOTIFY_SYNC:
case OBD_NOTIFY_SYNC_NONBLOCK:
- rc = md_do_upcall(NULL, &mdd->mdd_md_dev, MD_LOV_SYNC);
+ rc = md_do_upcall(NULL, &mdd->mdd_md_dev,
+ MD_LOV_SYNC, data);
break;
case OBD_NOTIFY_CONFIG:
- rc = md_do_upcall(NULL, &mdd->mdd_md_dev, MD_LOV_CONFIG);
+ rc = md_do_upcall(NULL, &mdd->mdd_md_dev,
+ MD_LOV_CONFIG, data);
break;
+#ifdef HAVE_QUOTA_SUPPORT
+ case OBD_NOTIFY_QUOTA:
+ rc = md_do_upcall(NULL, &mdd->mdd_md_dev,
+ MD_LOV_QUOTA, data);
+ break;
+#endif
default:
CDEBUG(D_INFO, "Unhandled notification %#x\n", ev);
}
{
struct mdd_device *mdd = mdo2mdd(&obj->mod_obj);
struct obd_device *obd = mdd2obd_dev(mdd);
- struct obd_export *lov_exp = obd->u.mds.mds_osc_exp;
+ struct obd_export *lov_exp = obd->u.mds.mds_lov_exp;
struct lov_stripe_md *lsm = NULL;
int rc;
ENTRY;
int lmm_size, struct thandle *handle, int set_stripe)
{
struct lu_buf *buf;
- umode_t mode;
+ cfs_umode_t mode;
int rc = 0;
ENTRY;
RETURN(rc);
}
-/*
- * XXX: this is for create lsm object id, which should identify the lsm object
- * unique in the whole mds, as I see. But it seems, we still not need it
- * now. Right? So just borrow the ll_fid_build_ino().
- */
-static obd_id mdd_lov_create_id(const struct lu_fid *fid)
-{
- return fid_flatten(fid);
-}
-
int mdd_lov_objid_prepare(struct mdd_device *mdd, struct lov_mds_md *lmm)
{
/* copy mds_lov code is using wrong layer */
const struct md_op_spec *spec, struct lu_attr *la)
{
struct obd_device *obd = mdd2obd_dev(mdd);
- struct obd_export *lov_exp = obd->u.mds.mds_osc_exp;
+ struct obd_export *lov_exp = obd->u.mds.mds_lov_exp;
struct lu_site *site = mdd2lu_dev(mdd)->ld_site;
struct obdo *oa;
struct lov_stripe_md *lsm = NULL;
int rc = 0;
ENTRY;
- if (!md_should_create(create_flags))
+ if (!md_should_create(create_flags)) {
+ *lmm_size = 0;
RETURN(0);
-
+ }
oti_init(oti, NULL);
/* replay case, has objects already, only get lov from eadata */
if (spec->no_create != 0) {
*lmm = (struct lov_mds_md *)spec->u.sp_ea.eadata;
*lmm_size = spec->u.sp_ea.eadatalen;
- RETURN(0);
+ if (*lmm_size == lov_mds_md_size((*lmm)->lmm_stripe_count,
+ (*lmm)->lmm_magic)) {
+ RETURN(0);
+ } else {
+ CERROR("incorrect lsm received during recovery\n");
+ RETURN(-EPROTO);
+ }
}
if (OBD_FAIL_CHECK(OBD_FAIL_MDS_ALLOC_OBDO))
oa->o_uid = 0; /* must have 0 uid / gid on OST */
oa->o_gid = 0;
- oa->o_gr = mdt_to_obd_objgrp(lu_site2md(site)->ms_node_id);
+ oa->o_seq = mdt_to_obd_objseq(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_id = fid_ver_oid(mdd_object_fid(child));
oa->o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLFLAGS |
OBD_MD_FLMODE | OBD_MD_FLUID | OBD_MD_FLGID | OBD_MD_FLGROUP;
oa->o_size = 0;
0, &lsm, (void*)eadata);
if (rc)
GOTO(out_oti, rc);
- lsm->lsm_object_id = oa->o_id;
- lsm->lsm_object_gr = oa->o_gr;
} else if (parent != NULL) {
/* get lov ea from parent and set to lov */
struct lov_mds_md *_lmm;
XATTR_NAME_LOV);
if (rc > 0)
rc = obd_iocontrol(OBD_IOC_LOV_SETSTRIPE,
- lov_exp, 0, &lsm, _lmm);
+ lov_exp, *lmm_size,
+ &lsm, _lmm);
+
if (rc)
GOTO(out_oti, rc);
}
+ OBD_FAIL_TIMEOUT(OBD_FAIL_MDS_OPEN_WAIT_CREATE, 10);
rc = obd_create(lov_exp, oa, &lsm, oti);
if (rc) {
if (rc > 0) {
}
GOTO(out_oti, rc);
}
- LASSERT_MDS_GROUP(lsm->lsm_object_gr);
+ LASSERT_SEQ_IS_MDT(lsm->lsm_object_seq);
} else {
LASSERT(eadata != NULL);
rc = obd_iocontrol(OBD_IOC_LOV_SETEA, lov_exp, 0, &lsm,
(void*)eadata);
if (rc)
GOTO(out_oti, rc);
- lsm->lsm_object_id = oa->o_id;
- lsm->lsm_object_gr = oa->o_gr;
+
}
+ lsm->lsm_object_id = fid_ver_oid(mdd_object_fid(child));
+ lsm->lsm_object_seq = fid_seq(mdd_object_fid(child));
/*
* Sometimes, we may truncate some object(without lsm) then open it
* (with write flags), so creating lsm above. The Nonzero(truncated)
* filter_fid, but can not see what is the usages. So just pack
* o_seq o_ver here, maybe fix it after this cycle.
*/
- oa->o_fid = fid_seq(mdd_object_fid(child));
- oa->o_generation = fid_oid(mdd_object_fid(child));
- oa->o_valid |= OBD_MD_FLFID | OBD_MD_FLGENER;
+ obdo_from_inode(oa, NULL,
+ (struct lu_fid *)mdd_object_fid(child), 0);
oinfo->oi_oa = oa;
oinfo->oi_md = lsm;
oinfo->oi_capa = NULL;
GOTO(out_oti, rc);
}
}
-
/* blksize should be changed after create data object */
la->la_valid |= LA_BLKSIZE;
la->la_blksize = oa->o_blksize;
int log_unlink)
{
struct obd_device *obd = mdd2obd_dev(mdd);
- struct obd_export *lov_exp = obd->u.mds.mds_osc_exp;
+ struct obd_export *lov_exp = obd->u.mds.mds_lov_exp;
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;
}
oa->o_id = lsm->lsm_object_id;
- oa->o_gr = mdt_to_obd_objgrp(lu_site2md(site)->ms_node_id);
+ oa->o_seq = mdt_to_obd_objseq(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;
oti->oti_logcookies = logcookies;
}
- CDEBUG(D_INFO, "destroying OSS object %d/%d\n",
- (int)oa->o_id, (int)oa->o_gr);
+ CDEBUG(D_INFO, "destroying OSS object "LPU64":"LPU64"\n", oa->o_seq,
+ oa->o_id);
rc = obd_destroy(lov_exp, oa, lsm, oti, NULL, NULL);
}
/*
- * called with obj not locked.
+ * called with obj locked.
*/
-
int mdd_lov_destroy(const struct lu_env *env, struct mdd_device *mdd,
struct mdd_object *obj, struct lu_attr *la)
{
int rc;
ENTRY;
+ LASSERT(mdd_write_locked(env, obj) != 0);
+
+ if (unlikely(!S_ISREG(mdd_object_type(obj))))
+ RETURN(0);
+
if (unlikely(la->la_nlink != 0)) {
CWARN("Attempt to destroy OSS object when nlink == %d\n",
la->la_nlink);
/* get lov ea */
- rc = mdd_get_md_locked(env, obj, ma->ma_lmm, &ma->ma_lmm_size,
- XATTR_NAME_LOV);
+ rc = mdd_get_md(env, obj, ma->ma_lmm, &ma->ma_lmm_size,
+ XATTR_NAME_LOV);
if (rc <= 0) {
CWARN("Get lov ea failed for "DFID" rc = %d\n",
}
ma->ma_valid = MA_LOV;
-
+
rc = mdd_unlink_log(env, mdd, obj, ma);
if (rc) {
CWARN("mds unlink log for "DFID" failed: %d\n",
RETURN(rc);
}
-int mdd_log_op_unlink(struct obd_device *obd,
- struct lov_mds_md *lmm, int lmm_size,
- struct llog_cookie *logcookies, int cookies_size)
-{
- struct mds_obd *mds = &obd->u.mds;
- struct lov_stripe_md *lsm = NULL;
- struct llog_unlink_rec *lur;
- struct llog_ctxt *ctxt;
- int rc;
- ENTRY;
-
- if (IS_ERR(mds->mds_osc_obd))
- RETURN(PTR_ERR(mds->mds_osc_obd));
-
- rc = obd_unpackmd(mds->mds_osc_exp, &lsm, lmm, lmm_size);
- if (rc < 0)
- RETURN(rc);
- rc = obd_checkmd(mds->mds_osc_exp, obd->obd_self_export, lsm);
- if (rc)
- GOTO(out, rc);
- /* first prepare unlink log record */
- OBD_ALLOC(lur, sizeof(*lur));
- if (!lur)
- GOTO(out, rc = -ENOMEM);
- lur->lur_hdr.lrh_len = lur->lur_tail.lrt_len = sizeof(*lur);
- lur->lur_hdr.lrh_type = MDS_UNLINK_REC;
-
- ctxt = llog_get_context(obd, LLOG_MDS_OST_ORIG_CTXT);
- rc = llog_add(ctxt, &lur->lur_hdr, lsm, logcookies,
- cookies_size / sizeof(struct llog_cookie));
- llog_ctxt_put(ctxt);
-
- OBD_FREE(lur, sizeof(*lur));
- GOTO(out, rc);
-out:
- obd_free_memmd(mds->mds_osc_exp, &lsm);
- return rc;
-}
-
int mdd_unlink_log(const struct lu_env *env, struct mdd_device *mdd,
struct mdd_object *mdd_cobj, struct md_attr *ma)
{
- struct obd_device *obd = mdd2obd_dev(mdd);
-
LASSERT(ma->ma_valid & MA_LOV);
if ((ma->ma_cookie_size > 0) &&
- (mdd_log_op_unlink(obd, ma->ma_lmm, ma->ma_lmm_size,
+ (mds_log_op_unlink(mdd2obd_dev(mdd), ma->ma_lmm, ma->ma_lmm_size,
ma->ma_cookie, ma->ma_cookie_size) > 0)) {
+ CDEBUG(D_HA, "DEBUG: unlink log is added for object "DFID"\n",
+ PFID(mdd_object_fid(mdd_cobj)));
ma->ma_valid |= MA_COOKIE;
}
return 0;
}
int mdd_log_op_setattr(struct obd_device *obd, __u32 uid, __u32 gid,
- struct lov_mds_md *lmm, int lmm_size,
- struct llog_cookie *logcookies, int cookies_size)
+ struct lov_mds_md *lmm, int lmm_size,
+ struct llog_cookie *logcookies, int cookies_size)
{
struct mds_obd *mds = &obd->u.mds;
struct lov_stripe_md *lsm = NULL;
int rc;
ENTRY;
- if (IS_ERR(mds->mds_osc_obd))
- RETURN(PTR_ERR(mds->mds_osc_obd));
+ if (IS_ERR(mds->mds_lov_obd))
+ RETURN(PTR_ERR(mds->mds_lov_obd));
- rc = obd_unpackmd(mds->mds_osc_exp, &lsm, lmm, lmm_size);
+ rc = obd_unpackmd(mds->mds_lov_exp, &lsm, lmm, lmm_size);
if (rc < 0)
RETURN(rc);
- rc = obd_checkmd(mds->mds_osc_exp, obd->obd_self_export, lsm);
- if (rc)
- GOTO(out, rc);
-
OBD_ALLOC(lsr, sizeof(*lsr));
if (!lsr)
GOTO(out, rc = -ENOMEM);
OBD_FREE(lsr, sizeof(*lsr));
out:
- obd_free_memmd(mds->mds_osc_exp, &lsm);
+ obd_free_memmd(mds->mds_lov_exp, &lsm);
RETURN(rc);
}
static int mdd_osc_setattr_async(struct obd_device *obd, __u32 uid, __u32 gid,
struct lov_mds_md *lmm, int lmm_size,
- struct llog_cookie *logcookies, __u64 id, __u32 gen,
+ struct llog_cookie *logcookies, const struct lu_fid *parent,
struct obd_capa *oc)
{
struct mds_obd *mds = &obd->u.mds;
LASSERT(lmm);
- rc = obd_unpackmd(mds->mds_osc_exp, &oinfo.oi_md, lmm, lmm_size);
+ rc = obd_unpackmd(mds->mds_lov_exp, &oinfo.oi_md, lmm, lmm_size);
if (rc < 0) {
- CERROR("Error unpack md %p for inode "LPU64"\n", lmm, id);
- GOTO(out, rc);
- }
-
- rc = obd_checkmd(mds->mds_osc_exp, obd->obd_self_export, oinfo.oi_md);
- if (rc) {
- CERROR("Error revalidate lsm %p \n", oinfo.oi_md);
+ CERROR("Error unpack md %p for obj "DFID"\n", lmm,
+ PFID(parent));
GOTO(out, rc);
}
oinfo.oi_oa->o_uid = uid;
oinfo.oi_oa->o_gid = gid;
oinfo.oi_oa->o_id = oinfo.oi_md->lsm_object_id;
- oinfo.oi_oa->o_gr = oinfo.oi_md->lsm_object_gr;
+ oinfo.oi_oa->o_seq = oinfo.oi_md->lsm_object_seq;
oinfo.oi_oa->o_valid |= OBD_MD_FLID | OBD_MD_FLGROUP |
OBD_MD_FLUID | OBD_MD_FLGID;
if (logcookies) {
oti.oti_logcookies = logcookies;
}
- oinfo.oi_oa->o_fid = id;
- oinfo.oi_oa->o_generation = gen;
- oinfo.oi_oa->o_valid |= OBD_MD_FLFID | OBD_MD_FLGENER;
+ obdo_from_inode(oinfo.oi_oa, NULL, (struct lu_fid *)parent, 0);
oinfo.oi_capa = oc;
/* do async setattr from mds to ost not waiting for responses. */
- rc = obd_setattr_async(mds->mds_osc_exp, &oinfo, &oti, NULL);
+ rc = obd_setattr_async(mds->mds_lov_exp, &oinfo, &oti, NULL);
if (rc)
CDEBUG(D_INODE, "mds to ost setattr objid 0x"LPX64
" on ost error %d\n", oinfo.oi_md->lsm_object_id, rc);
out:
if (oinfo.oi_md)
- obd_free_memmd(mds->mds_osc_exp, &oinfo.oi_md);
+ obd_free_memmd(mds->mds_lov_exp, &oinfo.oi_md);
OBDO_FREE(oinfo.oi_oa);
RETURN(rc);
}
RETURN(rc);
rc = mdd_osc_setattr_async(obd, tmp_la->la_uid, tmp_la->la_gid, lmm,
- lmm_size, logcookies, fid_seq(fid),
- fid_oid(fid), NULL);
+ lmm_size, logcookies, fid, NULL);
RETURN(rc);
}