struct md_attr *ma)
{
int rc;
- mdd_lock(ctxt, mdd_obj, DT_READ_LOCK);
+ mdd_read_lock(ctxt, mdd_obj);
rc = mdd_attr_get_internal(ctxt, mdd_obj, ma);
- mdd_unlock(ctxt, mdd_obj, DT_READ_LOCK);
+ mdd_read_unlock(ctxt, mdd_obj);
return rc;
}
GOTO(out, rc);
}
rc = mdd_cleanup_unlink_llog(ctx, mdd);
-
+
obd_notify(obd->u.mds.mds_osc_obd, NULL,
obd->obd_async_recov ? OBD_NOTIFY_SYNC_NONBLOCK :
OBD_NOTIFY_SYNC, NULL);
.loo_object_print = mdd_object_print
};
-void mdd_lock(const struct lu_context *ctxt, struct mdd_object *obj,
- enum dt_lock_mode mode)
+void mdd_write_lock(const struct lu_context *ctxt, struct mdd_object *obj)
+{
+ struct dt_object *next = mdd_object_child(obj);
+
+ next->do_ops->do_write_lock(ctxt, next);
+}
+
+void mdd_read_lock(const struct lu_context *ctxt, struct mdd_object *obj)
+{
+ struct dt_object *next = mdd_object_child(obj);
+
+ next->do_ops->do_read_lock(ctxt, next);
+}
+
+void mdd_write_unlock(const struct lu_context *ctxt, struct mdd_object *obj)
{
struct dt_object *next = mdd_object_child(obj);
- next->do_ops->do_lock(ctxt, next, mode);
+ next->do_ops->do_write_unlock(ctxt, next);
}
-void mdd_unlock(const struct lu_context *ctxt, struct mdd_object *obj,
- enum dt_lock_mode mode)
+void mdd_read_unlock(const struct lu_context *ctxt, struct mdd_object *obj)
{
struct dt_object *next = mdd_object_child(obj);
- next->do_ops->do_unlock(ctxt, next, mode);
+ next->do_ops->do_read_unlock(ctxt, next);
}
static void mdd_lock2(const struct lu_context *ctxt,
struct mdd_object *o0, struct mdd_object *o1)
{
- mdd_lock(ctxt, o0, DT_WRITE_LOCK);
- mdd_lock(ctxt, o1, DT_WRITE_LOCK);
+ mdd_write_lock(ctxt, o0);
+ mdd_write_lock(ctxt, o1);
}
static void mdd_unlock2(const struct lu_context *ctxt,
struct mdd_object *o0, struct mdd_object *o1)
{
- mdd_unlock(ctxt, o0, DT_WRITE_LOCK);
- mdd_unlock(ctxt, o1, DT_WRITE_LOCK);
+ mdd_write_unlock(ctxt, o1);
+ mdd_write_unlock(ctxt, o0);
}
static struct thandle* mdd_trans_start(const struct lu_context *ctxt,
struct thandle *handle)
{
int rc;
- mdd_lock(ctxt, o, DT_WRITE_LOCK);
+ mdd_write_lock(ctxt, o);
rc = mdd_attr_set_internal(ctxt, o, attr, handle);
- mdd_unlock(ctxt, o, DT_WRITE_LOCK);
+ mdd_write_unlock(ctxt, o);
return rc;
}
int rc;
ENTRY;
- mdd_lock(ctxt, obj, DT_WRITE_LOCK);
- rc = __mdd_xattr_set(ctxt, obj, buf, buf_len, name,
- fl, handle);
- mdd_unlock(ctxt, obj, DT_WRITE_LOCK);
+ mdd_write_lock(ctxt, obj);
+ rc = __mdd_xattr_set(ctxt, obj, buf, buf_len, name, fl, handle);
+ mdd_write_unlock(ctxt, obj);
RETURN(rc);
}
if (IS_ERR(handle))
RETURN(PTR_ERR(handle));
- mdd_lock(ctxt, mdd_obj, DT_WRITE_LOCK);
+ mdd_write_lock(ctxt, mdd_obj);
rc = __mdd_xattr_del(ctxt, mdd, md2mdd_obj(obj), name, handle);
- mdd_unlock(ctxt, mdd_obj, DT_WRITE_LOCK);
+ mdd_write_unlock(ctxt, mdd_obj);
mdd_trans_stop(ctxt, mdd, rc, handle);
ENTRY;
if (src_pobj == tgt_pobj) {
- mdd_lock(ctxt, src_pobj, DT_WRITE_LOCK);
+ mdd_write_lock(ctxt, src_pobj);
RETURN(0);
}
/*compared the parent child relationship of src_p&tgt_p*/
struct mdd_object *src_pobj,
struct mdd_object *tgt_pobj)
{
- mdd_unlock(ctxt, src_pobj, DT_WRITE_LOCK);
+ mdd_write_unlock(ctxt, src_pobj);
if (src_pobj != tgt_pobj)
- mdd_unlock(ctxt, tgt_pobj, DT_WRITE_LOCK);
+ mdd_write_unlock(ctxt, tgt_pobj);
}
static int mdd_rename_sanity_check(const struct lu_context *ctxt,
if (mdd_is_dead_obj(mdd_obj))
RETURN(-ESTALE);
- mdd_lock(ctxt, mdd_obj, DT_READ_LOCK);
+ mdd_read_lock(ctxt, mdd_obj);
if (S_ISDIR(mdd_object_type(ctxt, mdd_obj)) && dt_try_as_dir(ctxt, dir))
rc = dir->do_index_ops->dio_lookup(ctxt, dir, rec, key);
else
rc = -ENOTDIR;
- mdd_unlock(ctxt, mdd_obj, DT_READ_LOCK);
+ mdd_read_unlock(ctxt, mdd_obj);
RETURN(rc);
}
if (IS_ERR(handle))
RETURN(PTR_ERR(handle));
- mdd_lock(ctxt, mdd_pobj, DT_WRITE_LOCK);
+ mdd_write_lock(ctxt, mdd_pobj);
/*
* XXX check that link can be added to the parent in mkdir case.
}
if (lmm)
OBD_FREE(lmm, lmm_size);
- mdd_unlock(ctxt, mdd_pobj, DT_WRITE_LOCK);
+ mdd_write_unlock(ctxt, mdd_pobj);
mdd_trans_stop(ctxt, mdd, rc, handle);
RETURN(rc);
}
if (IS_ERR(handle))
RETURN(PTR_ERR(handle));
- mdd_lock(ctxt, mdd_obj, DT_WRITE_LOCK);
+ mdd_write_lock(ctxt, mdd_obj);
rc = __mdd_index_insert(ctxt, mdd_obj, fid, name, handle);
- mdd_unlock(ctxt, mdd_obj, DT_WRITE_LOCK);
+ mdd_write_unlock(ctxt, mdd_obj);
mdd_trans_stop(ctxt, mdd, rc, handle);
RETURN(rc);
}
if (IS_ERR(handle))
RETURN(PTR_ERR(handle));
- mdd_lock(ctxt, mdd_obj, DT_WRITE_LOCK);
+ mdd_write_lock(ctxt, mdd_obj);
rc = __mdd_index_delete(ctxt, mdd_obj, name, handle);
- mdd_unlock(ctxt, mdd_obj, DT_WRITE_LOCK);
+ mdd_write_unlock(ctxt, mdd_obj);
mdd_trans_stop(ctxt, mdd, rc, handle);
RETURN(rc);
if (IS_ERR(handle))
RETURN(-ENOMEM);
- mdd_lock(ctxt, mdd_obj, DT_WRITE_LOCK);
+ mdd_write_lock(ctxt, mdd_obj);
__mdd_ref_add(ctxt, mdd_obj, handle);
- mdd_unlock(ctxt, mdd_obj, DT_WRITE_LOCK);
+ mdd_write_unlock(ctxt, mdd_obj);
mdd_trans_stop(ctxt, mdd, 0, handle);
if (IS_ERR(handle))
RETURN(-ENOMEM);
- mdd_lock(ctxt, mdd_obj, DT_WRITE_LOCK);
+ mdd_write_lock(ctxt, mdd_obj);
isdir = S_ISDIR(lu_object_attr(&obj->mo_lu));
/* rmdir checks */
rc = __mdd_finish_unlink(ctxt, mdd_obj, ma);
cleanup:
- mdd_unlock(ctxt, mdd_obj, DT_WRITE_LOCK);
+ mdd_write_unlock(ctxt, mdd_obj);
mdd_trans_stop(ctxt, mdd, rc, handle);
RETURN(rc);
}
LASSERT(lu_object_exists(mdd2lu_obj(mdd_obj)));
next = mdd_object_child(mdd_obj);
- mdd_lock(ctxt, mdd_obj, DT_READ_LOCK);
+ mdd_read_lock(ctxt, mdd_obj);
if (S_ISDIR(mdd_object_type(ctxt, mdd_obj)) &&
dt_try_as_dir(ctxt, next))
rc = next->do_ops->do_readpage(ctxt, next, rdpg);
else
rc = -ENOTDIR;
- mdd_unlock(ctxt, mdd_obj, DT_READ_LOCK);
+ mdd_read_unlock(ctxt, mdd_obj);
return rc;
}
struct iam_container oo_container;
struct iam_descr oo_descr;
struct iam_path_descr *oo_ipd;
-#if OSD_DEBUG_LOCKS
const struct lu_context *oo_owner;
-#endif
};
/*
.dt_conf_get = osd_conf_get
};
-static void osd_object_lock(const struct lu_context *ctx, struct dt_object *dt,
- enum dt_lock_mode mode)
+static void osd_object_read_lock(const struct lu_context *ctx,
+ struct dt_object *dt)
{
struct osd_object *obj = osd_dt_obj(dt);
struct osd_thread_info *oti = lu_context_key_get(ctx, &osd_key);
- LASSERT(mode == DT_WRITE_LOCK || mode == DT_READ_LOCK);
LASSERT(osd_invariant(obj));
LASSERT(obj->oo_owner != ctx);
+ down_read(&obj->oo_sem);
+ LASSERT(obj->oo_owner == NULL);
+ oti->oti_r_locks++;
+}
- if (mode == DT_WRITE_LOCK) {
- down_write(&obj->oo_sem);
- LASSERT(obj->oo_owner == NULL);
- /*
- * Write lock assumes transaction.
- */
- LASSERT(oti->oti_txns > 0);
- obj->oo_owner = ctx;
- oti->oti_w_locks++;
- } else {
- down_read(&obj->oo_sem);
- LASSERT(obj->oo_owner == NULL);
- oti->oti_r_locks++;
- }
+static void osd_object_write_lock(const struct lu_context *ctx,
+ struct dt_object *dt)
+{
+ struct osd_object *obj = osd_dt_obj(dt);
+ struct osd_thread_info *oti = lu_context_key_get(ctx, &osd_key);
+
+ LASSERT(osd_invariant(obj));
+
+ LASSERT(obj->oo_owner != ctx);
+ down_write(&obj->oo_sem);
+ LASSERT(obj->oo_owner == NULL);
+ /*
+ * Write lock assumes transaction.
+ */
+ LASSERT(oti->oti_txns > 0);
+ obj->oo_owner = ctx;
+ oti->oti_w_locks++;
}
-static void osd_object_unlock(const struct lu_context *ctx,
- struct dt_object *dt, enum dt_lock_mode mode)
+static void osd_object_read_unlock(const struct lu_context *ctx,
+ struct dt_object *dt)
{
struct osd_object *obj = osd_dt_obj(dt);
struct osd_thread_info *oti = lu_context_key_get(ctx, &osd_key);
- LASSERT(mode == DT_WRITE_LOCK || mode == DT_READ_LOCK);
LASSERT(osd_invariant(obj));
+ LASSERT(oti->oti_r_locks > 0);
+ oti->oti_r_locks--;
+ up_read(&obj->oo_sem);
+}
- if (mode == DT_WRITE_LOCK) {
- LASSERT(obj->oo_owner == ctx);
- LASSERT(oti->oti_w_locks > 0);
- oti->oti_w_locks--;
- obj->oo_owner = NULL;
- up_write(&obj->oo_sem);
- } else {
- LASSERT(oti->oti_r_locks > 0);
- oti->oti_r_locks--;
- up_read(&obj->oo_sem);
- }
+static void osd_object_write_unlock(const struct lu_context *ctx,
+ struct dt_object *dt)
+{
+ struct osd_object *obj = osd_dt_obj(dt);
+ struct osd_thread_info *oti = lu_context_key_get(ctx, &osd_key);
+
+ LASSERT(osd_invariant(obj));
+ LASSERT(obj->oo_owner == ctx);
+ LASSERT(oti->oti_w_locks > 0);
+ oti->oti_w_locks--;
+ obj->oo_owner = NULL;
+ up_write(&obj->oo_sem);
}
static int osd_attr_get(const struct lu_context *ctxt, struct dt_object *dt,
}
static struct dt_object_operations osd_obj_ops = {
- .do_lock = osd_object_lock,
- .do_unlock = osd_object_unlock,
- .do_attr_get = osd_attr_get,
- .do_attr_set = osd_attr_set,
- .do_create = osd_object_create,
- .do_index_try = osd_index_try,
- .do_ref_add = osd_object_ref_add,
- .do_ref_del = osd_object_ref_del,
- .do_xattr_get = osd_xattr_get,
- .do_xattr_set = osd_xattr_set,
- .do_xattr_del = osd_xattr_del,
- .do_xattr_list = osd_xattr_list,
- .do_readpage = osd_readpage,
+ .do_read_lock = osd_object_read_lock,
+ .do_write_lock = osd_object_write_lock,
+ .do_read_unlock = osd_object_read_unlock,
+ .do_write_unlock = osd_object_write_unlock,
+ .do_attr_get = osd_attr_get,
+ .do_attr_set = osd_attr_set,
+ .do_create = osd_object_create,
+ .do_index_try = osd_index_try,
+ .do_ref_add = osd_object_ref_add,
+ .do_ref_del = osd_object_ref_del,
+ .do_xattr_get = osd_xattr_get,
+ .do_xattr_set = osd_xattr_set,
+ .do_xattr_del = osd_xattr_del,
+ .do_xattr_list = osd_xattr_list,
+ .do_readpage = osd_readpage,
};
/*