int rc;
ENTRY;
+ mdd_read_lock(ctxt, obj);
rc = __mdd_la_get(ctxt, obj, la);
+ mdd_read_unlock(ctxt, obj);
if (rc == 0)
mdd_flags_xlate(obj, la->la_flags);
RETURN(rc);
RETURN(rc);
}
-static inline int mdd_attr_get_internal_locked (const struct lu_context *ctxt,
- struct mdd_object *mdd_obj,
- struct md_attr *ma)
+static inline int mdd_attr_get_internal_locked(const struct lu_context *ctxt,
+ struct mdd_object *mdd_obj,
+ struct md_attr *ma)
{
int rc;
mdd_read_lock(ctxt, mdd_obj);
LASSERT(lu_object_exists(&obj->mo_lu));
next = mdd_object_child(mdd_obj);
+ mdd_read_lock(ctxt, mdd_obj);
rc = next->do_ops->do_xattr_get(ctxt, next, buf, buf_len, name);
+ mdd_read_unlock(ctxt, mdd_obj);
RETURN(rc);
}
ma->ma_attr.la_mtime, ma->ma_attr.la_ctime);
*la_copy = ma->ma_attr;
+ mdd_write_lock(ctxt, mdd_obj);
rc = mdd_fix_attr(ctxt, mdd_obj, ma, la_copy);
+ mdd_write_unlock(ctxt, mdd_obj);
if (rc)
GOTO(cleanup, rc);
if (tobj && lu_object_exists(&tobj->mo_lu)) {
+ mdd_write_lock(ctxt, mdd_tobj);
__mdd_ref_del(ctxt, mdd_tobj, handle);
/* remove dot reference */
if (is_dir)
__mdd_ref_del(ctxt, mdd_tobj, handle);
rc = __mdd_finish_unlink(ctxt, mdd_tobj, ma);
+ mdd_write_unlock(ctxt, mdd_tobj);
}
cleanup:
mdd_rename_unlock(ctxt, mdd_spobj, mdd_tpobj);
struct md_object *pobj,
const char *name, struct md_attr *ma)
{
- struct lu_attr *la = &mdd_ctx_info(ctxt)->mti_la;
- struct lu_fid *fid = &mdd_ctx_info(ctxt)->mti_fid;
+ struct mdd_thread_info *info = mdd_ctx_info(ctxt);
+ struct lu_attr *la = &info->mti_la;
+ struct lu_fid *fid = &info->mti_fid;
+ struct mdd_object *obj = md2mdd_obj(pobj);
int rc;
ENTRY;
/* EEXIST check */
- if (mdd_is_dead_obj(md2mdd_obj(pobj)))
+ if (mdd_is_dead_obj(obj))
RETURN(-ENOENT);
rc = mdd_lookup(ctxt, pobj, name, fid);
- if (rc != -ENOENT) {
- rc = rc ? rc : -EEXIST;
- RETURN(rc);
- }
+ if (rc != -ENOENT)
+ RETURN(rc ? : -EEXIST);
+
/* sgid check */
- rc = __mdd_la_get(ctxt, md2mdd_obj(pobj), la);
+ mdd_read_lock(ctxt, obj);
+ rc = __mdd_la_get(ctxt, obj, la);
+ mdd_read_unlock(ctxt, obj);
if (rc != 0)
RETURN(rc);
* Maybe we should do the same. For now: creation-first.
*/
+ mdd_write_lock(ctxt, son);
rc = __mdd_object_create(ctxt, son, ma, handle);
- if (rc)
+ if (rc) {
+ mdd_write_unlock(ctxt, son);
GOTO(cleanup, rc);
+ }
created = 1;
rc = __mdd_object_initialize(ctxt, mdd_pobj, son, ma, handle);
+ mdd_write_unlock(ctxt, son);
if (rc)
/*
* Object has no links, so it will be destroyed when last
rc = -EFAULT;
}
/* return attr back */
- rc = mdd_attr_get_internal(ctxt, son, ma);
+ rc = mdd_attr_get_internal_locked(ctxt, son, ma);
cleanup:
if (rc && created) {
int rc2 = 0;
static int mdd_close(const struct lu_context *ctxt, struct md_object *obj,
struct md_attr *ma)
{
- if (atomic_dec_and_test(&md2mdd_obj(obj)->mod_count)) {
+ int rc;
+ struct mdd_object *mdd_obj;
+
+ mdd_obj = md2mdd_obj(obj);
+ if (atomic_dec_and_test(&mdd_obj->mod_count)) {
/*TODO: Remove it from orphan list */
}
- return __mdd_finish_unlink(ctxt, md2mdd_obj(obj), ma);
+ mdd_read_lock(ctxt, mdd_obj);
+ rc = __mdd_finish_unlink(ctxt, mdd_obj, ma);
+ mdd_read_unlock(ctxt, mdd_obj);
+ return rc;
}
static int mdd_readpage(const struct lu_context *ctxt, struct md_object *obj,
return rc;
}
-static inline int mdt_write_last_rcvd_header(const struct lu_context *ctx,
+static inline int mdt_write_last_rcvd_header(const struct lu_context *ctx,
struct mdt_device *mdt,
struct mdt_server_data *msd,
struct thandle *th)
static inline int mdt_read_last_rcvd(const struct lu_context *ctx,
struct mdt_device *mdt,
struct mdt_client_data *mcd, loff_t *off)
-{
+{
int rc;
rc = mdt->mdt_last_rcvd->do_body_ops->dbo_read(ctx, mdt->mdt_last_rcvd,
return rc;
}
-static inline int mdt_write_last_rcvd(const struct lu_context *ctx,
+static inline int mdt_write_last_rcvd(const struct lu_context *ctx,
struct mdt_device *mdt,
struct mdt_client_data *mcd,
loff_t *off, struct thandle *th)
struct mdt_client_data *mcd = NULL;
struct obd_device *obd = mdt->mdt_md_dev.md_lu_dev.ld_obd;
struct mdt_thread_info *mti;
+ struct dt_object *obj;
struct lu_attr *la;
unsigned long last_rcvd_size = 0;
__u64 mount_count;
sizeof(msd->msd_padding) == LR_SERVER_SIZE);
LASSERT(offsetof(struct mdt_client_data, mcd_padding) +
sizeof(mcd->mcd_padding) == LR_CLIENT_SIZE);
-
+
mti = lu_context_key_get(ctx, &mdt_thread_key);
LASSERT(mti != NULL);
la = &mti->mti_attr.ma_attr;
- rc = mdt->mdt_last_rcvd->do_ops->do_attr_get(ctx,
- mdt->mdt_last_rcvd, la);
+ obj = mdt->mdt_last_rcvd;
+ obj->do_ops->do_read_lock(ctx, obj);
+ rc = obj->do_ops->do_attr_get(ctx, mdt->mdt_last_rcvd, la);
+ obj->do_ops->do_read_unlock(ctx, obj);
if (rc)
RETURN(rc);
loff_t off;
int err;
__s32 rc = th->th_result;
-
+
ENTRY;
LASSERT(req);
LASSERT(req->rq_export);
obd->obd_last_committed = txi->txi_transno;
spin_unlock(&mdt->mdt_transno_lock);
ptlrpc_commit_replies (obd);
- } else
+ } else
spin_unlock(&mdt->mdt_transno_lock);
CDEBUG(D_HA, "%s: transno "LPD64" committed\n",
struct mdt_device *mdt = mti->mti_mdt;
struct mdt_object *obj;
struct mdt_body *body;
-
+
mdt_req_from_mcd(req, med->med_mcd);
if (req->rq_status)
return;
-
+
body = req_capsule_server_get(&mti->mti_pill, &RMF_MDT_BODY);
obj = mdt_object_find(mti->mti_ctxt, mdt, mti->mti_rr.rr_fid1);
LASSERT(!IS_ERR(obj));