int rc;
LASSERT(ma->ma_lmm != NULL && ma->ma_lmm_size > 0);
- rc = mdd_get_md(ctxt, mdd_obj, ma->ma_lmm, &ma->ma_lmm_size, 0,
+ rc = mdd_get_md(ctxt, mdd_obj, ma->ma_lmm, &ma->ma_lmm_size,
MDS_LOV_MD_NAME);
if (rc > 0) {
ma->ma_valid |= MA_LOV;
{
int rc;
- rc = mdd_get_md(ctxt, mdd_obj, ma->ma_lmv, &ma->ma_lmv_size, 0,
+ rc = mdd_get_md(ctxt, mdd_obj, ma->ma_lmv, &ma->ma_lmv_size,
MDS_LMV_MD_NAME);
if (rc > 0) {
ma->ma_valid |= MA_LMV;
if (lmm == NULL)
GOTO(cleanup, rc = -ENOMEM);
- rc = mdd_get_md(ctxt, mdd_obj, lmm, &lmm_size, 1,
+ rc = mdd_get_md_locked(ctxt, mdd_obj, lmm, &lmm_size,
MDS_LOV_MD_NAME);
if (rc < 0)
int flags)
{
int mode = accmode(md2mdd_obj(obj), flags);
-
- mdd_write_lock(ctxt, md2mdd_obj(obj));
+ int rc = 0;
+
+ mdd_read_lock(ctxt, md2mdd_obj(obj));
if (mode & MAY_WRITE) {
if (mdd_is_immutable(md2mdd_obj(obj)))
- RETURN(-EACCES);
+ rc = -EACCES;
}
- md2mdd_obj(obj)->mod_count ++;
+ if (rc == 0)
+ md2mdd_obj(obj)->mod_count ++;
- mdd_write_unlock(ctxt, md2mdd_obj(obj));
- return 0;
+ mdd_read_unlock(ctxt, md2mdd_obj(obj));
+ return rc;
}
static int mdd_close(const struct lu_context *ctxt, struct md_object *obj,
const struct md_create_spec *spec, struct lu_attr *la);
int mdd_get_md(const struct lu_context *ctxt, struct mdd_object *obj,
- void *md, int *md_size, int need_locked, const char *name);
+ void *md, int *md_size, const char *name);
+int mdd_get_md_locked(const struct lu_context *ctxt, struct mdd_object *obj,
+ void *md, int *md_size, const char *name);
int mdd_unlink_log(const struct lu_context *ctxt, struct mdd_device *mdd,
struct mdd_object *mdd_cobj, struct md_attr *ma);
}
int mdd_get_md(const struct lu_context *ctxt, struct mdd_object *obj,
- void *md, int *md_size, int need_locked, const char *name)
+ void *md, int *md_size, const char *name)
{
struct dt_object *next;
int rc = 0;
ENTRY;
- if (need_locked)
- mdd_read_lock(ctxt, obj);
next = mdd_object_child(obj);
rc = next->do_ops->do_xattr_get(ctxt, next, md, *md_size, name);
/*
*md_size = rc;
}
- if (need_locked)
- mdd_read_unlock(ctxt, obj);
-
RETURN (rc);
}
+int mdd_get_md_locked(const struct lu_context *ctxt, struct mdd_object *obj,
+ void *md, int *md_size, const char *name)
+{
+ int rc = 0;
+ mdd_read_lock(ctxt, obj);
+ rc = mdd_get_md(ctxt, obj, md, md_size, name);
+ mdd_read_unlock(ctxt, obj);
+ return rc;
+}
+
static int mdd_lov_set_stripe_md(const struct lu_context *ctxt,
struct mdd_object *obj, struct lov_mds_md *lmmp,
int lmm_size, struct thandle *handle)
struct lov_mds_md *lmm = &mdd_ctx_info(ctxt)->mti_lmm;
int size = sizeof(lmm);
/*Get parent dir stripe and set*/
- rc = mdd_get_md(ctxt, pobj, &lmm, &size, 0,
+ rc = mdd_get_md(ctxt, pobj, &lmm, &size,
MDS_LOV_MD_NAME);
if (rc > 0) {
rc = mdd_xattr_set_txn(ctxt, child, lmm, size,
if (__lmm == NULL)
GOTO(out_oa, rc = -ENOMEM);
- rc = mdd_get_md(ctxt, parent, __lmm,
- &returned_lmm_size, 1, MDS_LOV_MD_NAME);
+ rc = mdd_get_md_locked(ctxt, parent, __lmm,
+ &returned_lmm_size, MDS_LOV_MD_NAME);
if (rc > 0)
rc = obd_iocontrol(OBD_IOC_LOV_SETSTRIPE,
lov_exp, 0, &lsm, __lmm);